So stellen Sie eine SSH-Verbindung zur ec2-Instanz im privaten VPC-Subnetz über einen NAT-Server her

15

Ich habe eine VPC in AWS mit einem öffentlichen und einem privaten Subnetz erstellt. Das private Subnetz hat keinen direkten Zugriff auf ein externes Netzwerk. Es gibt also einen NAT-Server im öffentlichen Subnetz, der den gesamten ausgehenden Datenverkehr vom privaten Subnetz zum äußeren Netzwerk weiterleitet.

Derzeit kann ich SSH vom öffentlichen Subnetz zum privaten Subnetz, auch von NAT zum privaten Subnetz. Was ich jedoch möchte, ist SSH von jedem Computer (Heim-Laptop, Büromaschine und Handy) zu Instanzen im privaten Subnetz.

Ich habe nachgeforscht, ob ich die NAT-Box so einrichten kann, dass SSH zur Instanz im privaten Subnetz weitergeleitet wird. Aber ich habe kein Glück dafür.

Kann jemand auflisten, was ich einrichten muss, um dies zu ermöglichen.

Namen sind:

Laptop (jedes Gerät außerhalb der VPC)

nat (der NAT-Server im öffentlichen Subnetz)

Ziel (der Server im privaten Subnetz, zu dem ich eine Verbindung herstellen möchte)

Nicht sicher, ob Einschränkungen vorliegen oder nicht:

Das "Ziel" hat keine öffentliche IP, nur eine Subnetz-IP, zum Beispiel 10.0.0.1. Das "Ziel" kann keine Verbindung zu "nat" über die öffentliche IP von nat herstellen. Es gibt mehrere "Ziel" -Server. Muss ich für jeden einen einrichten?

Vielen Dank

jasonfungsing
quelle
Dieser Link beschreibt die Schritte, die zum Herstellen einer Verbindung zu EC2-Instanzen im privaten Subnetz über die SSH-Agentenweiterleitung erforderlich sind.
Shailender Rawat

Antworten:

24

Sie können einen Bastion-Host einrichten, um eine Verbindung zu einer beliebigen Instanz in Ihrer VPC herzustellen:

http://blogs.aws.amazon.com/security/post/Tx3N8GFK85UN1G6/Securely-connect-to-Linux-instances-running-in-a-private-Amazon-VPC

Sie können eine neue Instanz starten, die als Bastion-Host fungiert, oder Ihre vorhandene NAT-Instanz als Bastion verwenden.

Wenn Sie eine neue Instanz als Übersicht erstellen, werden Sie:

1) Erstellen Sie eine Sicherheitsgruppe für Ihren Bastion-Host, die den SSH-Zugriff von Ihrem Laptop aus ermöglicht (beachten Sie diese Sicherheitsgruppe für Schritt 4).

2) Starten Sie eine separate Instanz (Bastion) in einem öffentlichen Subnetz in Ihrer VPC

3) Geben Sie diesem Bastion-Host eine öffentliche IP, entweder beim Start oder durch Zuweisen einer elastischen IP

4) Aktualisieren Sie die Sicherheitsgruppen jeder Ihrer Instanzen, die keine öffentliche IP-Adresse haben, um den SSH-Zugriff vom Bastion-Host aus zuzulassen. Dies kann mithilfe der Sicherheitsgruppen-ID des Bastion-Hosts (sg - #####) erfolgen.

5) Verwenden Sie die SSH-Agentenweiterleitung (ssh-A user @ publicIPofBastion), um zuerst eine Verbindung zur Bastion und dann in der Bastion SSH zu einer beliebigen internen Instanz (ssh user @ private-IP-of-Internal-Instance) herzustellen. Die Agentenweiterleitung kümmert sich um die Weiterleitung Ihres privaten Schlüssels, damit er nicht auf der Bastion-Instanz gespeichert werden muss ( speichern Sie niemals private Schlüssel auf irgendeiner Instanz !! ).

Der obige AWS-Blogeintrag sollte in der Lage sein, einiges zu liefern, was den Prozess angeht. Ich habe auch das Folgende eingefügt, falls Sie zusätzliche Details zu Bastion-Hosts wünschen:

Konzept der Bastion Hosts: http://en.m.wikipedia.org/wiki/Bastion_host

Wenn Sie weitere Informationen benötigen, können Sie diese gerne kommentieren.

jca-
quelle
3
Stellen Sie sicher, dass SSH / 22 sowohl eingehend als auch ausgehend auf der Bastion zulässig ist.
user464180
Dies ist ein so kritischer Punkt, dass er Teil der Antwort sein muss!
Tariq
Zusätzlich zu der akzeptierten Antwort, die sehr hilfreich, aber nicht vollständig ist, musste ich sicherstellen, dass Sicherheitsgruppen eingehenden und ausgehenden Datenverkehr zulassen. Auf den ersten Blick sah es so aus, als ob dies bereits geschehen wäre, aber da ich die CloudFormation-Vorlage verwendet habe, war mir nicht aufgefallen, dass die Quelle für eingehenden Datenverkehr in das private Subnetz meine ELB war. Es wurde also der gesamte Verkehr zugelassen, jedoch nur von ELB. Das Problem wurde behoben, indem ich das in mein öffentliches Subnetz änderte.
Milan Markovic
1

Nur so konnte ich es zum Laufen bringen.

1) Stellen Sie sicher, dass die Sicherheitsgruppe für diese private Instanz in der eingehenden Regel die Sicherheitsgruppe aus dem öffentlichen Subnetz enthält

Ports Protokoll Quelle
Alle Alle sg-0b6616e070b9ea2d (öffentliche Sicherheitsgruppe)

2) Konfigurieren Sie mithilfe von Proxy-Befehlen Ihre ssh-Konfigurationsdatei so, dass sie ungefähr so ​​aussieht

vim ~/.ssh/config

Host publichost
   HostName 24.123.34.45
   User ubuntu
   IdentityFile ~/mypem.pem
   ProxyCommand none
Host privatehost
   HostName 10.0.2.133
   User ubuntu
   IdentityFile ~/mypem.pem
   ProxyCommand ssh publichost -W %h:%p

Führen Sie ssh privatehost es sollte funktionieren

Leonardo Ampuero
quelle
0

Nur zur Verdeutlichung: Sobald Sie in Ihren Bastion-Host sshed haben, müssen Sie als Benutzer sshed in den NAT-Host ec2-user. Dies hat mich ein wenig übertrumpft, da der Ubuntu-Benutzer normalerweise Ubuntu auf AWS ist. So tat ich:

laptop> ssh -A ubuntu@ssh_bastion
ssh_bastion> ssh ec2-user@nat_private_dns_or_private_ip

Denken Sie auch daran, dass Ihre ssh_bastion eine ausgehende Regel haben sollte, die Datenverkehr zu anderen Hosts und SGs zulässt.

Joel
quelle
Ist dieser Name "ec2_user" das Ergebnis des Hochfahrens einer Amazon AMI, die speziell für den NAT-Dienst konfiguriert wurde? Also, wie hat 'ec2-user' einen Account auf dem privaten Rechner bekommen?
Dennis