Neben dem Senden von SSH-Daten kann das SSH-Protokoll auch anderen Datenverkehr zwischen zwei Hosts tunneln. Die häufigsten SSH-Tunnel sind remote und lokal.
SSH-Tunneling oder SSH-Portweiterleitung ist eine Methode zum Erstellen einer verschlüsselten SSH-Verbindung zwischen einem Client und einem Server, über die Dienstports weitergeleitet werden können.
Lokaler SSH-Tunnel mit Portweiterleitung
Sie können einen lokalen SSH-Tunnel verwenden, wenn Sie zu einer Ressource gelangen möchten, auf die Sie nicht direkt zugreifen können, aber ein SSH-Server, auf den Sie Zugriff haben, kann. Hier sind einige Szenarien.
Proxy zum Remote-Server
In der Abbildung oben kann der blaue Host http://192.168.0.3
nicht erreichen kann aber ssh zu 192.168.0.2. Der folgende SSH-Befehl wird auf dem blauen Host ausgeführt erlaubt dem blauen Host, den roten Host zu erreichen.
ssh -L 8080:192.168.0.3:80 [email protected]
Jetzt kann der blaue Host einen Browser öffnen, gehen Sie zu http://localhost:8080
, und die unter 192.168.0.3 gehostete Webseite angezeigt wird.
Lokale Portweiterleitung
In der obigen Abbildung möchte sich der blaue Host mit dem roten Host auf Port 80 verbinden, aber dazwischen befindet sich eine Firewall, die dies verweigert. Da der blaue Host per SSH mit dem roten Host kommunizieren kann, können wir einen lokalen Port-Weiterleitungs-SSH-Tunnel erstellen, um auf diesen Port zuzugreifen.
Der Befehl auf dem blauen Host lautet:
ssh -L 8080:192.168.0.2:80 [email protected]
Wenn jetzt der blaue Host einen Browser öffnet und zu http://localhost:8080
geht sie können sehen, was der rote Server an Port 80 hat.
Syntax für die lokale Portweiterleitung
Diese Syntax zum Erstellen eines lokalen SSH-Portweiterleitungstunnels lautet wie folgt:
ssh -L <LPORT>:<RHOST>:<RPORT> <GATEWAY>
Remote-SSH-Tunnel mit Portweiterleitung
In diesem Szenario erstellen wir einen Reverse-SSH-Tunnel. Hier können wir einen SSH-Tunnel in eine Richtung initiieren und dann diesen Tunnel verwenden, um einen SSH-Tunnel in die andere Richtung zu erstellen. Dies kann nützlich sein, wenn Sie einen Drohnencomputer in ein Netzwerk fallen lassen und möchten, dass er „nach Hause telefoniert“. Wenn es dann nach Hause telefoniert, können Sie sich über den eingerichteten SSH-Tunnel mit ihm verbinden.
Wir sind auf dem grünen Host und wollen ssh zum blauen Host. Die Firewall blockiert diese Verbindung jedoch direkt. Da der blaue Host ssh mit dem grünen Host verbinden kann, können wir uns damit verbinden, und wenn der grüne Host ssh zurück zum blauen Host möchte, kann er durch diesen zuvor eingerichteten Tunnel fahren.
Der blaue Host initiiert einen SSH-Tunnel wie diesen:
ssh -R 2222:localhost:22 [email protected]
Dadurch wird Port 2222 auf dem grünen Host geöffnet, der diesen dann an Port 22 auf dem blauen Host weiterleitet. Wenn also der grüne Host über Port 2222 eine SSH-Verbindung zu sich selbst herstellen würde, würde er den blauen Host erreichen.
Der grüne Host kann nun wie folgt eine SSH-Verbindung zum blauen Host herstellen:
ssh -p 2222 [email protected]
Verwendung der Option -N
Wenn Sie ssh verwenden, können Sie den -N
angeben -Flag, das ssh mitteilt, dass Sie keine Befehle über die ssh-Verbindung senden müssen, wenn diese hergestellt ist. Diese Option wird häufig beim Erstellen von Tunneln verwendet, da wir oft keine Eingabeaufforderung benötigen.
Autossh
Der autossh
Der Befehl wird verwendet, um Ihren Tunneln Persistenz hinzuzufügen. Die Aufgabe besteht darin, zu überprüfen, ob Ihre SSH-Verbindung aktiv ist, und falls nicht, eine herzustellen.
Hier ist ein autossh-Befehl, den Sie vielleicht kennen.
autossh -N -i /home/blueuser/.ssh/id_rsa -R 2222:localhost:22 [email protected]
Die -i /home/blueuser/.ssh/id_rsa
Option besagt, dass ein Zertifikat verwendet werden soll, um diese SSH-Verbindung zu authentifizieren.
Wenn Ihr Tunnel jetzt ausfällt, versucht er automatisch, die Verbindung wiederherzustellen, und versucht es so lange, bis er erfolgreich ist. Um es bei einem Neustart dauerhaft zu machen, fügen Sie den ssh-Befehl als Cron-Job hinzu.