Müssen Sie eine SSH-Verbindung zu einem Linux-Rechner aufbauen, der nicht direkt erreichbar ist? Die Lösung könnte darin bestehen, dass sich der Remote-Rechner bei Ihnen meldet und Sie diese Verbindung nutzen, um eine eigene Remote-SSH-Sitzung zu initiieren. Hier zeigen wir Ihnen, wie das geht.
Wann ist Reverse-SSH-Tunneling sinnvoll?
Manchmal gestaltet sich der Zugriff auf entfernte Computer schwierig. Es kann sein, dass am Standort strenge Firewall-Regeln gelten oder der lokale Administrator komplexe Netzwerkadressübersetzungs-Regeln eingerichtet hat. Wie können Sie auf einen solchen Rechner zugreifen, wenn eine Verbindung erforderlich ist?
Lassen Sie uns zur Klarheit einige Bezeichnungen festlegen. Ihr eigener Computer wird als „lokaler Computer“ bezeichnet, da er sich in Ihrer unmittelbaren Nähe befindet. Der Rechner, zu dem Sie eine Verbindung herstellen möchten, ist der „Remote-Computer“, da er sich an einem anderen Ort befindet.
Um die Unterscheidung zwischen lokalem und Remote-Computer zu verdeutlichen, nennen wir den Remote-Computer „wdzwdz“. Auf diesem System läuft Ubuntu Linux mit violetten Terminalfenstern. Der lokale Rechner hingegen trägt den Namen „Sulaco“ und nutzt Manjaro Linux mit gelben Terminalfenstern.
Normalerweise würden Sie eine SSH-Verbindung von Ihrem lokalen Computer starten, um sich mit dem Remote-Rechner zu verbinden. Dies ist jedoch in dem von uns beschriebenen Netzwerkszenario nicht möglich. Das spezifische Netzwerkproblem spielt dabei keine Rolle – diese Methode ist hilfreich, wenn Sie keinen direkten SSH-Zugriff auf einen Remote-Computer haben.
Wenn Ihre Netzwerkkonfiguration jedoch unkompliziert ist, kann der Remote-Rechner eine Verbindung zu Ihnen aufbauen. Das allein reicht nicht aus, da Sie dadurch keine funktionierende Befehlszeilensitzung auf dem Remote-Computer erhalten. Dennoch, es ist ein Anfang. Sie haben nun eine Verbindung zwischen den beiden Computern hergestellt.
Die Lösung liegt im Reverse-SSH-Tunneling.
Was versteht man unter Reverse-SSH-Tunneling?
Das Reverse-SSH-Tunneling ermöglicht es Ihnen, die bestehende Verbindung zu nutzen, um eine neue Verbindung von Ihrem lokalen Computer zum Remote-Computer aufzubauen.
Da die ursprüngliche Verbindung vom Remote-Computer zu Ihnen aufgebaut wurde, nutzen Sie diese in umgekehrter Richtung. Da SSH sicher ist, bauen Sie eine sichere Verbindung in eine bereits bestehende sichere Verbindung ein. Das bedeutet, Ihre Verbindung zum Remote-Computer fungiert als privater Tunnel innerhalb der bestehenden Verbindung.
Daher auch der Name „Reverse-SSH-Tunneling“.
Wie funktioniert es?
Das Reverse-SSH-Tunneling basiert darauf, dass der Remote-Rechner die bestehende Verbindung nutzt, um auf neue Verbindungsanfragen vom lokalen Computer zu warten.
Der Remote-Computer lauscht an einem Netzwerkport des lokalen Computers. Wenn er eine SSH-Anfrage an diesen Port erkennt, leitet er diese Verbindungsanfrage über die bestehende Verbindung an sich selbst zurück. Dadurch wird eine neue Verbindung vom lokalen zum Remote-Computer hergestellt.
Die Einrichtung ist einfacher, als es sich anhört.
Reverse-SSH-Tunneling in der Praxis
SSH ist auf Ihrem Linux-System in der Regel bereits installiert. Möglicherweise müssen Sie den SSH-Daemon (sshd) aktivieren, falls Ihr lokaler Computer noch keine SSH-Verbindungen akzeptiert hat.
sudo systemctl start sshd
Um sicherzustellen, dass der SSH-Daemon bei jedem Neustart Ihres Computers aktiviert ist, nutzen Sie folgenden Befehl:
sudo systemctl enable sshd
Auf dem Remote-Computer führen wir folgenden Befehl aus:
Die Option -R (reverse) weist ssh an, dass neue SSH-Sitzungen auf dem Remote-Rechner erstellt werden sollen.
„43022:localhost:22“ teilt ssh mit, dass Verbindungsanfragen an Port 43022 auf dem lokalen Rechner an Port 22 des Remote-Rechners weitergeleitet werden. Port 43022 wurde gewählt, da er nicht zugewiesen ist. Es ist keine besondere Nummer.
[email protected] ist das Benutzerkonto, mit dem sich der Remote-Rechner auf dem lokalen Computer anmelden wird.
ssh -R 43022:localhost:22 [email protected]
Es kann eine Warnung erscheinen, dass Sie sich noch nie zuvor mit dem lokalen Computer verbunden haben. Eine weitere Warnung kann auftauchen, wenn die Verbindungsdetails zur Liste der erkannten SSH-Hosts hinzugefügt werden. Welche Meldungen Sie sehen, hängt davon ab, ob bereits Verbindungen vom Remote-Computer zum lokalen Computer bestanden haben.
Sie werden nun aufgefordert, das Passwort des Kontos einzugeben, mit dem Sie sich auf dem lokalen Computer anmelden.
Beachten Sie, dass sich die Eingabeaufforderung ändert, sobald die Verbindung hergestellt ist, von [email protected] zu [email protected]
Wir sind jetzt vom Remote-Rechner aus mit dem lokalen Computer verbunden und können ihm Befehle erteilen. Nutzen wir den Befehl „who“, um die Anmeldungen auf dem lokalen Computer anzuzeigen:
who
Wir sehen, dass sich der Benutzer „dave“ am lokalen Computer angemeldet hat und dass sich der Remote-Rechner (mit denselben Anmeldedaten) von der IP-Adresse 192.168.4.25 aus verbunden hat.
Verbindung zum Remote-Computer herstellen
Da die Verbindung vom Remote-Rechner erfolgreich ist und auf Verbindungen wartet, können wir versuchen, uns vom lokalen Computer aus mit dem Remote-Computer zu verbinden.
Der Remote-Rechner überwacht Port 43022 auf dem lokalen Computer. Um eine Verbindung zum Remote-Rechner herzustellen, bitten wir – etwas paradox – ssh, eine Verbindung zum lokalen Computer auf Port 43022 herzustellen. Diese Verbindungsanfrage wird dann an den Remote-Rechner weitergeleitet.
ssh localhost -p 43022
Sie werden zur Eingabe des Passworts für das Benutzerkonto aufgefordert und anschließend vom lokalen Computer mit dem Remote-Rechner verbunden. Unser Manjaro-Rechner begrüßt uns mit den Worten: „Willkommen bei Ubuntu 18.04.2 LTS“.
Beachten Sie, dass sich die Eingabeaufforderung von [email protected] zu [email protected] geändert hat. Wir haben unser Ziel erreicht und eine SSH-Verbindung zu unserem schwer erreichbaren Remote-Computer aufgebaut.
SSH mit Schlüsseln verwenden
Um die Verbindung vom Remote- zum lokalen Rechner bequemer zu gestalten, können wir SSH-Schlüssel einrichten.
Geben Sie auf dem Remote-Computer diesen Befehl ein:
ssh-keygen
Sie werden aufgefordert, eine Passphrase einzugeben. Sie können die Eingabeaufforderung überspringen, dies wird jedoch nicht empfohlen. In diesem Fall könnte sich jeder auf dem Remote-Rechner ohne Passworteingabe mit Ihrem lokalen Computer verbinden.
Drei oder vier durch Symbole getrennte Wörter ergeben eine sichere Passphrase.
Ihre SSH-Schlüssel werden nun generiert.
Wir müssen den öffentlichen Schlüssel auf den lokalen Computer übertragen. Nutzen Sie hierfür diesen Befehl:
ssh-copy-id [email protected]
Sie werden nach dem Passwort für das Benutzerkonto gefragt, mit dem Sie sich anmelden, in diesem Fall [email protected]
Bei der ersten Verbindungsanfrage vom Remote- zum lokalen Rechner müssen Sie die Passphrase angeben. Solange das Terminalfenster geöffnet bleibt, müssen Sie die Passphrase bei zukünftigen Verbindungsanfragen nicht erneut eingeben.
Nicht jeder Tunnel ist beängstigend
Manche Tunnel mögen dunkel und verwinkelt sein, aber das Reverse-SSH-Tunneling ist nicht allzu schwer zu verstehen, wenn Sie die Beziehung zwischen dem Remote- und lokalen Computer klar vor Augen haben. Dann können Sie die Verbindung umkehren.