SSH-Tunneling & Portweiterleitung

CybersicherheitBeginner
Jetzt üben

Einführung

Secure Shell (SSH) ist weit mehr als nur ein Werkzeug für den Fernzugriff auf Terminals; es ist auch ein leistungsstarkes Netzwerk-Utility. SSH-Tunneling, auch bekannt als SSH-Portweiterleitung (Port Forwarding), ermöglicht es Ihnen, lokalen Netzwerkverkehr über eine sichere SSH-Verbindung zu entfernten Hosts zu leiten.

Das Grundprinzip besteht darin, die Konnektivität einer anderen Maschine zu „leihen“. Der Tunnel schafft keine neue Netzwerkerreichbarkeit aus dem Nichts, sondern nutzt die Position und den Zugriff des entfernten Hosts.

Diese Technik wird häufig von Systemadministratoren, Entwicklern und Sicherheitsexperten eingesetzt, um starre Unternehmens-Firewalls zu umgehen, den Datenverkehr von Legacy-Anwendungen zu verschlüsseln und auf verborgene interne Dienste zuzugreifen, die nicht direkt aus dem öffentlichen Internet erreichbar sind.

In diesem Lab lernen Sie die Konzepte und praktischen Anwendungen der zwei primären Arten der SSH-Portweiterleitung kennen:

  • Lokale Portweiterleitung (-L): Leitet einen Port von Ihrer lokalen Maschine an ein entferntes Ziel weiter.
  • Entfernte Portweiterleitung (-R): Leitet einen Port von einem entfernten Server zurück an Ihre lokale Maschine weiter.

Die Netzwerktopologie verstehen

In diesem Schritt erkunden wir die simulierte Netzwerkumgebung, die für Sie vorbereitet wurde.

Um SSH-Tunneling zu üben, benötigen wir ein Szenario mit mehreren Maschinen. Da wir in einer Umgebung mit einer einzigen virtuellen Maschine arbeiten, haben wir eine komplexe Netzwerktopologie mithilfe verschiedener Netzwerkports auf Ihrem lokalen System (127.0.0.1) simuliert.

Hier ist die konzeptionelle Abbildung unserer Simulation: Ihre lokale Maschine wird durch Ihre aktuelle Terminalsitzung repräsentiert. Der Bastion-Host (oder Edge-Server) wird durch einen Docker-Container simuliert, der SSH auf 127.0.0.1:2222 bereitstellt. Der interne Dienst ist ein Webserver, der im selben privaten Docker-Netzwerk unter 172.31.0.20:80 läuft. Stellen Sie sich konzeptionell vor, dieser Dienst befände sich tief in einem Unternehmensnetzwerk und wäre durch eine Firewall blockiert, sodass er nur vom Bastion-Host aus erreichbar ist. Schließlich ist der lokale Dienst ein Webserver, der auf Port 8000 der LabEx-VM läuft. Sie können sich dies als einen Entwicklungsserver auf Ihrem persönlichen Laptop vorstellen, den Sie für jemanden im Internet freigeben möchten.

Überprüfen wir, ob unsere simulierten Dienste laufen. Wir verwenden dazu den Befehl curl, ein Kommandozeilen-Tool zur Datenübertragung mit URLs.

Überprüfen Sie zunächst den „lokalen Dienst“, der auf Port 8000 läuft:

curl http://127.0.0.1:8000

Sie sollten die Ausgabe Local Developer Machine Data sehen.

Der interne Dienst ist absichtlich nicht direkt auf der LabEx-VM freigegeben. Sie werden ihn im nächsten Schritt über den SSH-Tunnel erreichen.

In den folgenden Schritten werden wir SSH-Tunneling verwenden, um den Zugriff auf diese Dienste zu manipulieren und so Szenarien zur Umgehung von Firewalls in der Praxis zu simulieren.

Lokale Portweiterleitung konfigurieren (-L)

In diesem Schritt konfigurieren Sie die lokale Portweiterleitung.

Stellen Sie sich vor, Sie sind zu Hause und müssen auf ein internes Unternehmens-Dashboard zugreifen (unser Dienst unter 172.31.0.20:80). Eine Firewall blockiert den direkten Zugriff auf diese interne Adresse von außen. Die Firewall erlaubt jedoch SSH-Verbindungen zu einem bestimmten Edge-Server (unserem Bastion-Host).

Die lokale Portweiterleitung ermöglicht es Ihnen, einen Port auf Ihrer lokalen Maschine zu öffnen, und SSH leitet jeglichen Datenverkehr, der an diesen lokalen Port gesendet wird, sicher durch den SSH-Tunnel an das Ziel weiter.

Die Syntax für die lokale Portweiterleitung lautet: ssh -L [local_port]:[destination_host]:[destination_port] [user]@[ssh_server]

Lokale Weiterleitung lässt sich am einfachsten so verstehen: „Lass einen entfernten Dienst für mich lokal erscheinen.“

Wir leiten unseren lokalen Port 8080 über unseren simulierten SSH-Bastion-Host an den internen Dienst (172.31.0.20:80) weiter. Wir verwenden zudem zwei zusätzliche Flags: Das Flag -N weist SSH an, keinen entfernten Befehl auszuführen, was nützlich ist, wenn Sie nur Ports weiterleiten möchten. Das Flag -f weist SSH an, im Hintergrund zu laufen, damit wir unser Terminal weiter nutzen können.

Führen Sie den folgenden Befehl aus, um den Tunnel zu erstellen:

ssh -N -f -L 8080:172.31.0.20:80 \
  -o StrictHostKeyChecking=no \
  -o UserKnownHostsFile=/dev/null \
  -i ~/project/pivot_key -p 2222 pivot@127.0.0.1

Der Tunnel läuft nun im Hintergrund.

Testen wir nun den Tunnel. Anstatt direkt auf die interne Docker-Adresse zuzugreifen, greifen Sie auf Ihren neu geöffneten lokalen Port 8080 zu. Der SSH-Tunnel fängt diese Anfrage ab, verschlüsselt sie, sendet sie an den Bastion-Host, der sie dann an 172.31.0.20:80 weiterleitet.

curl http://127.0.0.1:8080

Sie sollten die Ausgabe Secret Internal Corporate Data sehen. Sie haben die konzeptionelle Firewall erfolgreich umgangen!

Entfernte Portweiterleitung konfigurieren (-R)

In diesem Schritt konfigurieren Sie die entfernte Portweiterleitung.

Stellen Sie sich vor, Sie entwickeln eine Webanwendung auf Ihrem lokalen Laptop (unser Dienst auf Port 8000). Sie möchten einem Kunden Ihre Fortschritte zeigen, aber Ihr Laptop befindet sich hinter einem Heim-Router (NAT) und hat keine öffentliche IP-Adresse.

Die entfernte Portweiterleitung löst dieses Problem, indem sie es Ihnen ermöglicht, eine Verbindung zu einem öffentlichen SSH-Server herzustellen und einen Port auf diesem entfernten Server zu öffnen. Jeder Datenverkehr, der diesen entfernten Port erreicht, wird durch den SSH-Tunnel zurück an Ihre lokale Maschine geleitet.

Die Syntax für die entfernte Portweiterleitung lautet: ssh -R [remote_port]:[local_host]:[local_port] [user]@[ssh_server]

Entfernte Weiterleitung kehrt die Perspektive um: „Lass meinen lokalen Dienst von der entfernten Seite aus erreichbar erscheinen.“

Wir geben unseren lokalen Dienst (127.0.0.1:8000) für den Bastion-Host auf Port 8081 frei.

Führen Sie den folgenden Befehl aus, um den entfernten Tunnel zu erstellen:

ssh -N -f -R 8081:127.0.0.1:8000 \
  -o StrictHostKeyChecking=no \
  -o UserKnownHostsFile=/dev/null \
  -i ~/project/pivot_key -p 2222 pivot@127.0.0.1

Der Tunnel ist nun im Hintergrund aufgebaut. Der Bastion-Host lauscht jetzt auf Port 8081. Wenn jemand auf Port 8081 auf dem entfernten Server zugreift, wird der Datenverkehr an Ihren lokalen Port 8000 zurückgesendet.

Testen wir dies, indem wir den weitergeleiteten Dienst über den Bastion-Host-Container abfragen:

docker exec bastion_host curl -s http://127.0.0.1:8081

Sie sollten die Ausgabe Local Developer Machine Data sehen. Sie haben erfolgreich einen lokalen Dienst für einen entfernten Server freigegeben!

Auf internen Webdienst zugreifen

In diesem letzten Schritt festigen wir unser Verständnis, indem wir die erstellten Tunnel nutzen, um Daten herunterzuladen und in Dateien in unserem Projektverzeichnis zu speichern.

Stellen Sie sicher, dass Sie sich in Ihrem Standard-Projektverzeichnis befinden:

cd ~/project

Verwenden wir zunächst den Tunnel der lokalen Portweiterleitung (Port 8080), um die internen Unternehmensdaten abzurufen und in einer Datei namens internal_data.txt zu speichern. Wir verwenden das Flag -o bei curl, um die Ausgabedatei anzugeben.

curl http://127.0.0.1:8080 -o internal_data.txt

Verwenden wir nun den Tunnel der entfernten Portweiterleitung (Port 8081), um die lokalen Entwicklerdaten über den Bastion-Host abzurufen und in einer Datei namens remote_data.txt zu speichern.

docker exec bastion_host curl -s http://127.0.0.1:8081 > remote_data.txt

Überprüfen wir abschließend den Inhalt der Dateien, die Sie gerade heruntergeladen haben, mit dem Befehl cat:

cat internal_data.txt
cat remote_data.txt
Secret Internal Corporate Data
Local Developer Machine Data

Durch das erfolgreiche Herunterladen dieser Dateien über die weitergeleiteten Ports haben Sie bewiesen, dass die SSH-Tunnel den Datenverkehr aktiv und sicher zwischen den Endpunkten leiten.

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Lab zu SSH-Tunneling & Portweiterleitung erfolgreich abgeschlossen.

In diesem Lab haben Sie die Konzepte des SSH-Tunnelings verstanden und gelernt, wie es zur Umgehung von Netzwerkeinschränkungen eingesetzt werden kann. Sie haben die lokale Portweiterleitung (-L) konfiguriert, um sicher auf verborgene interne Dienste zuzugreifen, indem Sie lokalen Datenverkehr über einen Bastion-Host leiteten. Zusätzlich haben Sie die entfernte Portweiterleitung (-R) konfiguriert, um lokale Entwicklungsdienste für einen entfernten Server freizugeben und dabei lokale NAT- und Firewall-Beschränkungen zu umgehen. Schließlich haben Sie gelernt, wie SSH-Tunnel mithilfe der Flags -N und -f unauffällig im Hintergrund ausgeführt werden.

Diese Fähigkeiten sind unerlässlich für eine sichere Systemadministration, Remote-Entwicklung und das sichere Navigieren in komplexen Netzwerktopologien.