Ein Reverse Tunnel dient dazu, eine SSH-Verbindung vom Server zum Client aufzubauen, also umgekehrt, als man das normalerweise tut. Das ist nützlich, wenn der Server von aussen nicht direkt erreichbar ist, und darum selber die Verbindung initiieren muss.
Beispiel 1
Nehmen wir an, ich habe einen Heim-Server, der gut geschützt hinter einer Firewall sitzt. Ich möchte aber dennoch eine Möglichkeit, eine SSH-Verbindung zu ihm aufzubauen. Dazu benötige ich einen im Internet erreichbaren Computer als Proxy.
Ich habe also
- Meinen Heimserver, dessen IP.-Adresse ich nicht kenne, und der sowieso nicht von aussen erreichbar ist, und der auf port 22 einen SSH-Server laufen hat.
- Meinen Proxy, der unter https://mein.computer.irgendwo erreichbar ist, und der nichts von meinem Heimserver “weiss”.
Ziel: Ich möchte mit ssh -i schlüssel -p 1999 mein.computer.irgendwo
indirekt auf heimserver:22 kommen.
Vorgehen:
- Ich erstelle ein SSH-Schlüsselpaar, um den Zugriff möglichst sicher zu gestalten.
- Dann sorge ich dafür, dass der Proxy auf port 12445 erreichbar ist, zum Beispiel mit einer Portweiterleitung auf dem Router von 12445 auf Port 22 (SSH) des Proxy-Computers. Eine zweite Portweiterleitung mache ich von 1999 auf 1999 des Porxy-Computers.
- Und kopiere den öffentlichen Schlüssel des vorhin erstellten Schlüsselbars auf den Proxy:
ssh-copy-id -i <public key> -p 12445 ich@mein.computer.irgendwo
. - Schliesslich schalte ich in der ssh-konfigurationsdatei des Proxy die passwor-authentication aus, so dass er immer den Schlüssel verlang.
Soweit die Vorarbeiten. Den Tunnel erstellt man dann so (auf dem Heimserver eingeben):
ssh -p 12445 -i <private key> -R 1999:localhost:22 ich@mein.computer.irgendwo
Wenn man dann irgendwo im Internet `ssh -p 1999 -i
Beispiel 2
Nehmen wir an, Sie möchten, dass die Web-Oberfläche Ihres Heimservers auch von aussen erreichbar ist, zum Beispiel wenn Sie im Urlaub sind. Leider sieht Ihr Internet-Provider keine Möglichkeit vor, Ihren Router von aussen zu erreichen. Sie müssen sich also mit einem Reverse-Tunnel zu einem Proxy-Computer verbinden, der vopm Internet aus erreichbar ist. So einen (virtuellen) Computer können Sie bei vielen Providern günstig mieten, die einzige Bedingung für unsere ZWecke ist, dass Sie Shell-Zugriff haben. Dann brauchen Sie eine Domain (wie www.pseudoproxy.irgendwo), die Sie auf den Mietserver zeigen lassen (Kann meist beim selben Provider gebucht werden, wie der webspace).
Wir wollen also, dass ein Zugriff auf http://www.pseudoproxy.irgendwo umgeleitet wird auf den Heimserver, dessen IP-Adresse mnicht bekannt ist.
Vorgehen:
- Richten Sie den Shell-Zugriff auf dem Mietserver ein, idealerweise mit einem SSH-Schlüsselpaar wie oben gezeigt.
- Geben Sie auf Ihrem Heimserver ein:
ssh -fN -R 80:localhost:80 ich@pseudoproxy.irgendwo
Allgemeine Erwägungen
- Der SSH-Zugriff sollte wenn immer möglich nicht über Passwörter, sondern über Schlüsselpaare geschehen.
- SSH-Server neigen dazu, die Verbindung ab und zu abzubrechen. Es empfiehlt sich daher, die Tunnelerstellung in ein watchdog-Skript einzubauen, etwa so:
#!/bin/bash
# Set the ports to check on the remote server
REMOTE_PORT=21234
LOCAL_PORT=2456
REMOTE_CONFIG=myserver
REMOTE_URL=my.server.url
# Check if the remote port is reachable
nc -z "$REMOTE_URL" "$REMOTE_PORT" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "Remote port $REMOTE_PORT is reachable at `date`" >>tunnel.log
else
echo "Remote port $REMOTE_PORT is unreachable at `date`" >>tunnel.log
# Attempt to create a new tunnel
ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -R "$REMOTE_PORT":localhost:$LOCAL_PORT $REMOTE_CONFIG -fN &
if [[ $? -eq 0 ]]; then
echo "New tunnel created successfully at `date`" >>tunnel.log
else
echo "Error creating new tunnel: $? at `date`" >>tunnel.log
fi
fi
Und dieses Watchdog-Skript über einen Cronjob zum Beispiel halbstündlich laufen zu lassen.