SSH: Über mehrere Tunnel ans Ziel
Eines der besten Features bei der Verwendung von SSH ist die Möglichkeit Tunnel aufzubauen. "Tunnel bauen" heisst, dass man über einen lokalen Port eine Anwendung auf einem entfernten Port ansprechen kann, wobei die Daten verschlüsselt via SSH über die Leitung gehen. So kann man mit
ssh -L 8182:localhost:80 user@remote
den lokalen Port 8182 auf den Port 80 des entfernten Hosts remote umleiten - ruft man im Webbrowser danach die Adresse http://localhost:8182 auf landet man auf Port 80 von remote. Praktisch z.B. um sich eine auf remote gehostete Webseite anzusehen.
Im Beispiel hat man es mit einem einfachen Tunnel zwischen zwei Rechnern zu tun. Ich stand aber vor der Herausforderung von Host A über Host B über Host C zu Host D zu kommen. Alle Hosts befinden sich dabei in separaten Subnetzen die nicht geroutet werden. Was nun?
In einem solchen Fall braucht man die SSH-Option -g. Aus der man-Page:
-g
Allows remote hosts to connect to local forwarded ports.
Um also den lokalen Port 8182 von Host A auf Port 80 von Host D zu legen hilft folgende Orgie:
user@host-a$ ssh -g -L 8182:localhost:10010 user@host-b
user@host-b$ ssh -g -L 10010:localhost:10020 user@host-c
user@host-c$ ssh -g -L 10020:localhost:80 user@host-d
user@host-d$
Jetzt kann man im Browser auf Host A die Adresse http://localhost:8182 aufrufen und spricht damit den Webserver auf Host D an. Wichtig dabei ist die SSH-Verbindung aufrecht zu erhalten, zur Not mit einem Dauerping. Schließt man die Verbindung ist auch der Tunnel nicht mehr vorhanden.
Eigentlich einfach, man muss es halt nur wissen. Genauere Informationen finden sich in der SSH-man-Page.
(Wen es interessiert was genau ich damit gemacht habe: Port 80 meiner virtualisierten Entwicklungsumgebung verfügbar machen. Von einem Linux-Rechner zum Router, vom Router zum MacBook Pro, von da aus zur auf dem MacBook Pro laufenden virtuellen Maschine.)
Oktober 12th, 2011
Danke dir, hab die option -g bisher immer missachtet.
Gruss
Januar 25th, 2012
Genau das, was ich gesucht habe! :-)