- Werbung -

Über das Internet auf einen Raspberry Pi zuzugreifen ist kein Problem, wenn der Raspi an einem Festnetzanschluss hängt und vom Provider eine (gerne auch täglich wechselnde) IPv4-Adresse bekommt. Mit Hilfe eines DynDNS-Dienstes wird die IP-Adresse mit einer DynDNS-Domain verknüpft und der Raspi ist über diese Domain ansprechbar. Anders sieht das aus, wenn der kleine Rechner nur via Mobilfunk (z.B. per LTE) einen Internet-Zugang hat. Mobilfunkprovider lassen meist keine Zugriffe von außen auf die im Netz angemeldeten Clients zu. Es gibt zwar spezielle Tarife mit fester IP-Adresse oder zubuchbare Tarifoptionen. Die sind aber richtig teuer. Die Alternative: ein Reverse SSH-Tunnel.

Voraussetzungen

Wir brauchen zunächst einmal zwei Raspberry Pis. Erstens den Remote-Raspi, der via Mobilfunk ans Internet angeschlossen ist. Dazu einen mobilfunkfähigen Router oder USB-Stick mit einem nicht zu knapp bemessenen Datentarif - je nachdem wie oft man auf den Remote-Raspi zugreifen will und was man dort machen will, ist ein Gigabyte pro Monat eher die untere Grenze. Außerdem brauchen wir einen Gateway-Raspi, der läuft im heimischen Netz und bildet die Gegenstation für den Remote-Raspi. Die Last, die der SSH-Tunnel verursacht, ist sehr gering. Es reicht daher schon ein alter Raspi 1B. Wer ein neueres Modell verwendet, kann ihn problemlos nutzen um weitere Dienste darauf laufen zu lassen, z.B. Nextcloud, OpenVPN, PiHole.

Der Pi ist ideal für diese Aufgabe, da er wenig kostet und nur wenig Strom verbraucht. Ein 24x7-Betrieb kostet kaum mehr als 8 € Strom im Jahr.

In unserem heimischen Router, an dem der Gateway-Raspi hängt, richten wir eine Port-Weiterleitung für die SSH-Verbindung ein. Man kann z.B. den externen Port 222 nehmen und diesen auf den Standard-SSH-Port 22 am Gateway-Raspi weiterleiten. Da wir durch die Portweiterleitung ein Loch in unserer Firewall geöffnet haben, ist es wichtig den Gateway-Raspi abzusichern, damit unser Heim-Netz nicht angreifbar wird. Außerdem richten wir im Heim-Router noch den DynDNS-Dienst ein, damit dieser immer über einen Domainnamen erreichbar ist und nicht nur über die (in der Regel) täglich wechselnde IP-Adresse. Auf der Seite des Remote-Raspis braucht es keine Port-Weiterleitung.

Wenn wir alle Teile beisammen haben, können wir an die Einrichtung des Reverse SSH-Tunnel gehen. Dazu loggen wir uns der Einfachheit halber mit Putty auf den beiden Raspis ein. Ach ja, noch eines: Sofern nicht anders angegeben, arbeiten wir auf beiden Raspis mit dem User Pi!

Der umgekehrte Tunnel

Aber wir funktioniert dieser Tunnel eigentlich? Zunächst baut der Remote-Pi selbständig eine Verbindung zu unserem Gateway-Pi auf, dessen Adresse er ja Dank DynDNS-Dienst kennt. Diese Verbindung - der Tunnel - wird permanent aufrecht gehalten. Unser Gateway-Pi kann nun selbst über diesen Tunnel mit dem Remote-Pi Kontakt aufnehmen. Außerdem können weitere Rechner aus unserem Heimnetz - in dem der Gateway-Pi hängt - über das Gateway und  den Tunnel auf den Remote-Pi zugreifen.

Ein solcher Reverse SSH-Tunnel macht immer dann Sinn, wenn man wegen einer Firewall, Network Address Translation oder anderer Hemmnisse nicht von außen auf einen Rechner zugreifen kann. Der Tunnel funktioniert, solange der Remote-Rechner über das Netzwerk, mit dem er verbunden ist, ins Internet kommt. Ob das über WiFi, Kabel oder Mobilfunk geschieht, ist dabei völlig egal.

Gateway einrichten

Auf dem Gateway-Pi müssen wir nur ein paar Einstellungen in der SSH-Konfiguration ändern. Dazu bearbeiten wir die Datei sshd_config

sudo nano /etc/ssh/sshd_config

Hierin suchen wir die folgenden vier Einträge und tragen die folgende Werte ein (sollte einer der Einträge mit einem "#" auskommentiert sein, so muss der Kommentartag entfernt werden). Fehlt ein Eintrag, ergänzen wir ihn:

ClientAliveInterval 30

ClientAliveCountMax 99999

GatewayPorts yes

AllowTcpForwarding yes

Die ersten beiden Zeilen stellen sicher, dass die Verbindung nicht abgebaut wird, wenn für einige Zeit keine Daten über die Leitung gehen.

GatewayPorts yes erlaubt es, das Gateway als Durchgangsstation zu nutzen. D.h. wir können von einem anderen Rechner im Heimnetz über den Gateway-Pi auf den Remote Pi zugreifen.

AllowTcpForwarding yes erlaubt es, auch andere Protokolle - z.B. http - über den SSH-Tunnel zu übertragen. So kann man z.B. von einem heimischen Rechner via Webbrowser auf einen Webserver zugreifen, der auf dem Remote-Pi läuft.

Sind alle Änderungen eingetragen, beenden wir nano mit Strg-X und beantworten die Frage, ob die geänderte Datei gespeichert werden soll, mit “J” (oder "Y" je nach Sprachversion unsereres Raspis), drücken noch die Eingabetaste und booten den Gateway-Raspi neu.

Remote-Raspi einrichten

Am Remote Pi geben wir folgenden Befehl ein:

ssh -p222 -fNC -R 10011:localhost:22 e

Bedeutung der Parameter:

-p222: Port des Gateway-Pi über den der Remote-Pi den Tunnel aufbaut. Es muss hier die gleiche Adresse eingetragen werden, die wir oben in der Port-Weiterleitung auf dem Heim-Router freigeschaltet haben.

-f: bedeutet, dass SSH im Hintergrund laufen soll. Das ist wichtig, damit SSH nicht beendet wird, wenn wir später das Terminalfenster zumachen.

N: bedeutet, dass lediglich der Tunnel aufgebaut wird, aber keine Remote-Kommandos entgegen genommen werden.

C (optional): komprimiert die über die Strecke laufenden Daten. Auf einem älteren (leistungsschwachen) Raspi, kann das die Performance verschlechtern, spart aber Daten.

-R: besagt, dass ein Reverse Tunnel aufgebaut werden soll.

10011: ist der Ausgangsport (outgoing port address) des Gateway-Pi. Startet man dort eine SSH-Sitzung über den Port 10011, kommt man beim Remote-Pi raus. Hier kann man eine beliebige Portadresse über 1024 verwenden, die nicht anderweitig belegt ist.

localhost: ist der Name, unter dem ein Rechner sich selbst erkennt. Sollen über den Tunnel, der beim Remote-Pi ankommt, noch weitere Geräte im Remote-Netzwerk ansprechen werden, dann kann dort statt localhost auch die lokale IP Adresse eines Remote-Netzwerkgeräts stehen. Dazu später mehr.

22: ist die Standard Portnummer des SSH-Dienstes auf dem Remote Pi.

e: Username (pi) und Servername der auf dem Gateway-Pi verwendet wird. meinedynDNS.IP.adresse ist die Adresse (URL) des Gateway-Pi über den man auf den Remote-Pi zugreifen will.

Nach Eingabe des Kommandos sollte jetzt eine Verbindung zum Gateway-Pi aufgebaut werden und das Passwort des Users pi auf dem Gateway-Pi abgefragt werden.

Hinweis: Je nach Raspbian-Version kann es sein, dass der Remote-Pi den SSH-Key des Gateway-Pis noch nicht kennt. In diesem Falle am Remote Pi einfach

ssh -p222 e

eingeben und die Abfrage mit "yes" bestätigen.

Auf dem Gateway-Pi kann man sich nun mit dem Befehl

ssh -p 10011 localhost

auf dem Remote-Pi einloggen. Dabei wird das Passwort für den User Pi auf dem Remote-Pi abgefragt.

Jetzt wollen wir den Tunnel-Aufbau noch automatisieren, so dass keine Tastatureingaben mehr notwendig sind. Schließlich steht der Remote-Pi später irgendwo weit entfernt und nach einem Stromausfall oder Verbindungsabbruch soll alles wieder automatisch hochlaufen.

Login ohne Passwort

Die Passworteingabe beim Login können wir uns dadurch ersparen, dass wir einen RSA-Key verwenden. Der besteht aus einem privaten Schlüssel, den wir nicht aus der Hand geben, und einem öffentlichen Schlüssel, den wir weitergeben. In unserem Fall heißt das, dass wir den öffentlichen RSA-Key des Remote-Pi auf den Gateway-Pi übertragen.

Auf dem Remote-Pi:

Ins Verzeichnis ~/.ssh wechseln. Gibt es dort bereits eine Datei id_rsa.pub, wurden die Schlüssel schon mal angelegt. Wenn nicht, erzeugen wir sie mit

ssh-keygen

Hierbei unbedingt die Passphrase leer lassen, sonst würde diese später beim Login abgefragt und wir wollen uns ja automatisch mit dem Gateway verbinden. ;-)

Jetzt übertragen wir den erzeugten Schlüssel auf den Gateway-Pi. Dazu geben wir folgenden Befehl am Remote-Pi ein:

ssh-copy-id -i ~/.ssh/id_rsa.pub  -p222 meinedynDNS.IP.adresse

Wenn wir uns jetzt mit dem Befehl von oben (ssh -p 10011 localhost) vom Gateway-Pi aus mit dem Remote-Pi verbinden, sollte dies ohne Passwortabfrage geschehen.

autossh installieren

Wenn der Remote Pi über Mobilfunk im Internet hängt, kann es vorkommen, dass die Verbindung unterbrochen wird. Sei es durch die nächtliche Zwangstrennung durch den Provider oder durch Empfangsstörungen. Damit der SSH-Tunnel automatisch wieder aufgebaut wird, installieren wir noch autossh. Das geht mit

sudo apt-get install autossh

Außerdem brauchen wir noch eine Lösung für den Fall, dass mal der Strom ausfällt und der Raspi neu startet. Dazu erstellen wir ein Script mit dem Namen tunnel.sh (im Homeverzeichnis des Users pi). Hier tragen wir den Befehl für den Aufbau des Reverse SSH-Tunnel ein:

nano tunnel.sh

dann geben wir ein:

#!/bin/bash

/usr/bin/autossh -p222 -fNC -R 10011:localhost:22 e

Dieses Skript machen wir jetzt noch ausführbar mit

sudo chmod +x tunnel.sh

Dieses Skript soll bei jedem Rechnerstart automatisch ausgeführt werden. Dazu legen wir einen Cronjob an:

crontab -e

Es erscheint die Crontab im Editor – hier ganz nach unten scrollen und folgende Zeile eingeben

@reboot /home/pi/tunnel.sh

Das speichern wir mit Strg+X und verlassen den Editor. Dieser Eintrag sorgt dafür, dass das Skript tunnel.sh beim Booten des Raspis einmal ausgeführt wird.

Jetzt sollte der Tunnel dauerhaft und stabil laufen und wird auch bei einem Rechnerneustart automatisch wieder aufgebaut.

Dienste im Tunnel

Bisher haben wir lediglich das SSH-Protokoll durch den Tunnel geschickt. Aber auf unserem Remote-Pi soll auch ein Webserver laufen, z.B. mit Pimatic (dazu mehr in einem späteren Artikel) oder einer Webcam. Um auch http durch den Tunnel schicken zu können, ändern wir unser Skript mit dem autossh-Befehl darin wie folgt:

/usr/bin/autossh -p222 -fNC -R 8000:localhost:80 -R 10011:localhost:22 e

Die neuen Parameter haben folgende Bedeutung:

8000: die Portnummer auf dem Gateway für http. Alles was hier ankommt, wird vom Gateway- zum Remote-Pi umgelenkt.

80: der Standardport für http. Schickt man beim Gateway-Pi etwas an Port 8000, kommt es beim Remote-Pi am Port 80 an. Das ist der Port, den ein Webserver standardmäßig benutzt.
Wenn wir jetzt aus dem eigenen lokalen Netzwerk auf den Remote Pi zugreifen wollen, geben wir in den Browser unseres PCs die IP Adresse des Gateway-Pi ein, gefolgt von einem Doppelpunkt und der Ausgangsportnummer für http. In unserem Beispiel wäre das:

http://192.168.1.116:8000

Weitere Remote-Geräte ansprechen

Falls es im Remote-Netzwerk weitere Geräte - z.B. eine Webcam - gibt, die wir ansprechen wollen, dann geht auch das. Dazu müssen wir statt localhost die IP-Adresse des externen Geräts verwenden.

Hat die Webcam z.B. die lokale Adresse (im Remote-Netzwerk!) 192.168.0.100, dann wird das Tunnelskript von oben wie folgt erweitert:

/usr/bin/autossh -p222 -fNC -R 8000:localhost:80 -R 10011:localhost:22 -R 8889:192.168.0.100:80 e

Über den Parameter -R 8889:192.168.0.100:80 wird alles was auf Port 8889 des Gateway-Pi ankommt, auf den http-Port 80 des externen Geräts im Remote-Netz umgeleitet.

Auf einem PC in unserem Heim-Netz (also in dem sich der Gateway-Pi befindet) geben wir im Browser die IP des Gateway-Pi ein, gefolgt von einem Doppelpunkt und dem Port 8889. Damit rufen wir die Remote Webcam auf – oder auch andere Geräte im Remote Netzwerk, z.B. den Remote-Router, den wir so aus der Ferne administrieren können.