Ein Reverse SSH Tunnel ist immer dann hilfreich, wenn man auf einen Raspberry Pi, der hinter einer Firewall läuft, zugreifen will und die Firewall nicht selbst für Zugriffe von außen freischalten kann.
Zum Beispiel, wenn der Pi per Mobilfunk mit dem Internet verbunden ist. Mobilfunkprovider lassen meist keine Zugriffe von außen auf die im Netz vorhandenen Clients zu. Außerdem wird in der Regel eine Network Address Translation (NAT) vorgenommen, um IP Adressen zu sparen. Ganz ähnlich wie bei eurem Router zuhause.
Diese Anleitung funktioniert bei jeder Art von Internetanbindung, also z.B. auch, wenn euer Ferienhaus, Büro etc. über DSL am Internet hängt.
Dieser Beitrag ist zwar schon ein paar Jahre alt; ich aktualisiere ihn aber laufend nach Erkenntnisfortschritt oder bei Änderungen im Raspberry Pi OS (ehemals Raspbian):
Eingerückte Texte sind zusätzliche Erklärungen und Exkurse. Wenn ihr es eilig habt, dann könnt ihr das auch überlesen.
Inhalt
- 1 Begriffsklärung
- 2 Was benötige ich dafür?
- 3 Wie funktioniert das überhaupt?
- 4 Schritt 1a: SSH Konfiguration auf dem Gateway Pi
- 5 Schritt 1b: Aufbau SSH Tunnel auf dem Remote Pi
- 6 Schritt 2: Login ohne Passwort
- 7 Schritt 3: Stabilisieren
- 8 Schritt 4: Autostart
- 9 Schritt 5: Browsen im Tunnel
- 10 Externe Geräte ansprechen
Begriffsklärung
Für das weitere Verständnis dieses Artikels möchte ich einige Begriffe definieren
- Remote Pi: Das ist der Raspberry Pi, der im Mobilfunknetz etc. hängt und auf den "von außen" zugegriffen werden soll
- Gateway Pi: Das ist der Raspberry Pi, mit dem sich der Remote Pi verbindet und über den auf den Remote Pi zugegriffen werden soll
- SSH: Secure Shell, ein Protokoll bzw. Programm, das auf beiden Rechnern läuft. Normalerweise ist SSH schon aktiviert, andernfalls über
sudo raspi-config
den Punkt "Advanced Options – SSH" auswählen.
Achtung: Bei Raspbian ab ca. Dezember 2016 ist SSH standardmäßig deaktiviert! Bitte die Hinweise in diesem Artikel meines Blogs beachten.
SSH dürfte jeder kennen, der über Putty oder ein anderes Terminalprogramm auf den Pi zugreift. - Dynamische IP Adresse. In der Regel hat ein Privatmensch keine statische IP Adresse sondern bekommt von seinem Provider in regelmäßigen Abständen eine neue IP Adresse verpasst. Damit die gerade aktuelle Adresse überhaupt gefunden wird, sollte man sich eine Dynamische IP Adresse zulegen. Das geht über spezialisierte DynDNS Provider wie Selfhost. Wenn man bereit ist, diese Adresse monatlich zu bestätigen, kostet das dort noch nicht einmal etwas.
- Hinweis zu IPv6 und DS-Lite: diese Anleitung funktioniert nur, wenn das Gateway über eine öffentlich erreichbare IPv4 Adresse im Internet hängt. Der Zugriff auf Heimnetzwerke, welche nur eine öffentliche IPv6 Adresse haben, ist ungleich schwieriger und funktioniert auch nur, wenn der Remote Client ebenfalls mit IPv6 im Internet ist. Bei Mobilfunknetzen wird bislang (Ende 2017) fast nur mit IPv4 gefunkt. Betroffen sind Alle, die Zuhause (Gateway) mit DS-Lite (ausschließliche IPv6 Verbindung) am Internet angeschlossen sind. Hier nützt meine Anleitung leider nichts. Ggf. kann man beim Provider aber eine IPv4 Adresse nachbuchen – gegen Aufpreis versteht sich.
Was benötige ich dafür?
Folgende Voraussetzungen sind zu erfüllen:
Allgemein
- Alle Eingaben etc. erfolgen im Terminalmodus bzw. über ein Terminalfenster vom Raspberry Desktop.
- Ferner gehe ich davon aus, dass immer der User Pi verwendet wird, Raspbian in einer aktuellen Version installiert ist, und du schon etwas Erfahrung mit dem Terminalmodus des Pi sowie mit Putty oder einem anderen Terminalprogramm hast.
Remote
- Logischerweise einen Raspberry Pi, sonst macht das alles ja keinen Sinn.
- Je nach Setup (DSL oder Mobilfunk) einen (mobilfunkfähigen) Router und unbedingt einen Flatrate Tarif, sonst wirds teuer, da der Tunnel immer wieder ein paar Byte durch den Äther jagt. Der Remote Router braucht keine Portfreigabe.
Gateway
- Einen weiteren Raspberry Pi – oder einen (Linux) Rechner als Gateway, auf dem SSH läuft. Die Gatewayfunktion übernimmt der Pi nur so nebenbei, darauf können problemlos noch zusätzlich und gleichzeitig ein OwnCloud und ein WordPress Server laufen. Der Pi ist ideal für diese Aufgabe, kostet wenig und braucht nur wenig Energie, kann also 7/24 in Betrieb sein. Ob der Pi einen Monitor hat oder headless betrieben wird, ist egal. Wichtig ist nur, dass dieser Raspberry Pi aus dem Internet erreichbar ist.
- Router am Gateway Pi mit Port Freischaltung für den SSH Port Nummer 22 – oder besser einen alternativ konfigurierten Port z.B. Port 2000. Ggf. kommen noch weitere Portfreigaben hinzu. Wie man einen alternativen SSH Port einstellt, ist in diesem Post hier beschrieben. Dort auch die Möglichkeiten einer Absicherung zu Gemüte führen. Durch die Portfreischaltung hat eure Firewall ein Loch bekommen und euer Netz ist somit angreifbar.
- Dynamische IP Adresse sollte unbedingt vorliegen, sonst macht's keinen Spaß.
Dann noch den Router so konfigurieren, dass er seine aktuelle IP Adresse an den DynDNS Provider meldet. - Nachdem der Router am Gateway Pi konfiguriert ist, muss man am Gateway Pi initial nur die SSH Konfiguration einstellen. Du könntest anschließend zu deinem Remote Pi in den Urlaub fahren und alles Weitere dort konfigurieren. Idealerweise hat man beide Pis natürlich zuhause, konfiguriert und testet dort alles und fährt dann mit dem Remote Pi in Urlaub.
Wie funktioniert das überhaupt?
Vereinfacht ausgedrückt, baut der Remote Pi selbständig eine Verbindung zu einem anderen Rechner (Gateway) auf. Diese Verbindung (der Tunnel) wird aufrecht gehalten. Das Gateway kann nun selbst über den Tunnel mit dem Remote Pi Kontakt aufnehmen, oder ein dritter Rechner (z.B. Putty auf einem Windows PC) greift via Gateway Pi und Tunnel auf den Remote Pi zu.
Ein Reverse SSH Tunnel macht überall dort Sinn, wo man wegen eines Firewalls, Network Address Translation oder sonstiger 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 mit WiFi, Kabel oder Mobilfunk ist völlig egal. Es versteht sich von selbst, dass das hier beschriebenen Verfahren nur dort verwendet werden darf, wo auch die Erlaubnis dafür besteht. Also z.B. im eigenen Netzwerk bzw. im Auftrag eines Kunden in dessen Netzwerk. Die Verwendung des Reverse SSH Tunnels als illegale oder halblegale Hintertür z.B. ins Netzwerk des eigenen Arbeitgebers wird früher oder später entdeckt werden und hat in der Regel arbeits- bzw. strafrechtliche Konsequenzen.
Schritt 1a: SSH Konfiguration auf dem Gateway Pi
Um später für unterschiedliche Anwendungsfälle gewappnet zu sein, sollten folgende Einstellungen am Gateway Pi vorgenommen werden:
In früheren Versionen der Anleitung fehlten diese Hinweise auf die Gateway Konfiguration. Während meiner vielen vergeblichen Versuche, so ein Reverse Tunnel hinzubekommen, hatte ich diese Einträge wohl einmal vorgenommen und dann vergessen, dass ich sie hatte… Danke an Hannes für die ensprechende Fehlermeldung und fürs Finden der Lösung! (siehe Kommentare)
Editiert die Datei /etc/ssh/sshd_config als root – z.B. mit dem eingebauten Editor nano:
1 |
sudo nano /etc/ssh/sshd_config |
dort dann am besten folgende Einträge suchen und abändern bzw. die Einträge am Ende vornehmen:
1 2 3 4 |
ClientAliveInterval 30 ClientAliveCountMax 99999 GatewayPorts yes AllowTcpForwarding yes |
Mit den ersten beiden Zeilen wird sichergestellt, dass die Verbindung nicht einfach wieder abgebaut wird, wenn eine Zeitlang keine Daten über die Leitung flutschen.
GatewayPorts yes
erlaubt es, das Gateway quasi als "Durchlauferhitzer" zu nutzen, d.h. von einem anderen Gerät über den Gateway Pi in der Mitte auf den Remote Pi zuzugreifen.
erlaubt es, auch andere Protokolle – z.B. http – im SSH Tunnel zu verpacken.
AllowTcpForwarding yes
Sind die Änderungen eingetragen, nano mit Strg-X beenden, bei der Frage, ob die geänderte Datei gespeichert werden soll, mit "J" antworten und anschließend die Eingabetaste drücken. Anschließend neu booten.
Schritt 1b: Aufbau SSH Tunnel auf dem Remote Pi
Am Remote Pi geben wir folgenden Befehl ein:
1 |
ssh -p2000 -fNC -R 10011:localhost:22 pi@dyn.IP.adresse |
Erläuterung der Parameter:
–p2000 (optional) abweichender Port des Gateway Pi über den der Remote Pi den Tunnel aufbaut. Kann auch weggelassen werden dann wird automatisch die Portadresse 22 genommen. In jedem Fall muss die gewählte Portnummer im Router des Gateway Pi freigeschaltet werden. Wie man das anstellt, habe ich im Artikel Dynamische IP Adresse mit Bordmitteln im Kapitel Portfreischaltung (Beispiel Fritz!Box) beschrieben.
-f bedeutet, dass ssh im Hintergrund laufen soll. Anschließend kann das Terminalfenster wieder geschlossen werden, SSH läuft aber im Hintergrund weiter.
N bedeutet, dass lediglich der Tunnel aufgebaut wird, aber keine Remote-Kommandos entgegen genommen werden.
C (optional) komprimiert die über die Strecke laufenden Daten. Achtung, dieser Parameter verschlechtert unter Umständen die Performance – also ausprobieren.
-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. Im Prinzip kannst du jede Portadresse über 1024 verwenden, die nicht schon von deinem Pi belegt ist. Eine Liste der standardisierten Ports findest du z.B. bei Wikipedia.
localhost ist der Name unter dem ein Rechner sich selbst erkennt; also ein "ich" oder ein "bei mir".
Falls ihr über den Tunnel, der beim Remote Pi ankommt, weitere Geräte im Remote Netzwerk ansprechen wollt, dann kann statt localhost auch die lokale IP Adresse eines Remote Netzwerkgeräts stehen. Siehe weiter unten bei "externe Geräte ansprechen".
22 ist die Standard SSH Portnummer des Remote Pi.
pi@dyn.IP.adresse ist der User- und Servername der auf dem Gateway Pi verwendet wird – dyn.IP.adresse ist die Adresse (URL) des Gateway Pi über den man auf den Remote Pi zugreifen will. Bitte entsprechend deine dynamische IP Adresse eintragen. Anstatt "Pi" kannst du natürlich auch jeden anderen User verwenden, der auf dem Gateway Pi angelegt ist.
Im deutschen Raspberry Pi Forum kam im Dezember 2017 eine interessante Diskussion auf – es drehte sich u.a. um die Frage, welchen User man in das obige Kommando einträgt. Ich habe der Einfachheit halber den User "pi" genommen, da der ja sowieso schon auf dem Raspberry Pi vorhanden ist. Natürlich kann hier jeder beliebige Nutzer genommen werden. Wichtig ist nur, dass dieser User auf dem Gateway angelegt wurde – also ein Konto hat.
Erster Test:
Probiers mal aus, d.h. gebe oben stehendes Kommando am Remote Pi ein. Wenn alles stimmt, wirst du zusätzlich noch das Passwort des Users Pi vom Gateway Pi eingeben müssen.
Hinweis: sollte das nicht funktionieren, kann es sein, dass der Remote Pi den SSH Key vom Gateway noch nicht kennt. In diesem Falle am Remote Pi einfach
ssh pi@dyn.IP.adresse
bzw.
ssh -p2000 pi@dyn.IP.Adresse
eingeben und die Abfrage mit yes bestätigen.
Auf dem Gateway Pi kann man sich nun mit dem Befehl
1 |
ssh -p 10011 localhost |
auf dem Remote Pi einloggen. Das kann man übrigens auch tun, wenn man nicht vor Ort ist. Dazu einfach auf dem Gateway Pi mit Putty einloggen – anstatt der IP Nummer aus dem Heimnetz, die dyn.IP.Adresse in das Adressfeld eingeben und ggf. noch eine abweichende Portnummer eintragen. Das geht natürlich nur, wenn der entsprechende SSH Port im Router zuhause auch freigeschaltet ist. Ihr kommt dann beim Gateway Pi raus und könnt dort den obigen Befehl eingeben.
Hier könnte man fragen, warum man da localhost nimmt und nicht die IP Adresse des Gateway Pi. Theoretisch ginge das, allerdings hat das den Nachteil, dass die Verbindung erst nach draußen zum Router oder Switch im lokalen Netzwerk aufgebaut wird und dann wieder zurück zum Gateway geleitet wird. Das ist umständlich und verlangsamt die Geschichte. Außerdem kann es ja sein, dass die IP Adresse neu vergeben wird – dann führt die angegebene IP ins Leere. Bei Verwendung von "localhost" weiß der Pi, dass er das alles lokal bei sich "zu Hause" abwickeln kann.
Perfekt? Nein, nicht ganz: Das Eingeben des Gateway Passworts beim Aufbau des Tunnels nervt und führt dazu dass der Tunnel nur mit Nutzereingriff d.h. manuell aufgebaut werden kann. Und wir wollen ja eine automatische Löung. Deshalb…
Schritt 2: Login ohne Passwort
Neben der Passworteingabe zum Login kann man einem entfernten Rechner auch seine "Ausweisdaten" d.h. einen RSA Key übermitteln, anhand dessen dann der anrufende Rechner erkannt und akzeptiert wird. Auf unseren Fall übertragen heißt das, wir müssen den öffentlichen RSA Key des Remote Pi auf den Gateway Pi übertragen.
Dazu erst einmal auf dem Remote Pi nachschauen, ob im Verzeichnis /home/pi/.ssh (oder auch ~/.ssh) bereits eine Datei id_rsa.pub existiert. Wenn nein, muss man den Schlüssel erst erzeugen:
Das geschieht mit
1 |
ssh-keygen |
Nach Belieben die vom Programm abgefragten Daten eingeben, die Passphrase aber leer lassen, wir wollen uns ja automatisch mit dem Gateway verbinden.
Nun muss man den erzeugten Schlüssel (RSA 2048 Bit) auf das Gateway kopieren. Dazu folgenden Befehl am Remote Pi eingeben:
1 |
ssh-copy-id -i ~/.ssh/id_rsa.pub dyn.IP.adresse |
Hat man auf dem Gateway Pi eine andere SSH Portadresse (z.B. 2000) eingerichtet, lautet der Befehl wie folgt:
1 |
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 2000 pi@dyn.IP.adresse |
Bei sehr alten Versionen von Raspbian (vor Jessie) musste
-p 2000 pi@dyn.IP.adresse in Anführungszeichen gefasst sein.
Testen kannst du das auf dieselbe Weise wie oben.
Sollte das Kopieren der ID mit einem Berechtigungsfehler scheitern, musst du dich mit SSH vom Remote aus einmal beim Gateway einloggen. Damit kennt der Remote das Gateway und akzeptiert auch den Copy Befehl.
Wichtig:
Hat der User Pi den Schlüssel erzeugt, muss der User Pi auch den Tunnel
starten. Wenn du nachher (Schritt 4) die Crontab zum automatischen Start nach Reboot verwendest, dann muss es die Crontab vom User Pi sein. Diese erzeugst/editierst du indem du dich als "pi" enloggst und dann crontab -e
eingibst.
Merke: Außer für Schritt 1a brauchst du den superuser sudo nicht!! Alle Eingaben erfolgen als User Pi bzw. mit dem User, den du für deinen Tunnel verwenden willst.
Für Spezialisten: Wollt ihr irgendwann später ein neues/anderes Gateway installieren, z.B. wg. HW-Tausch, dann könnt ihr das auch ohne Zugriff auf den Remote Pi durchführen. Dazu die Dateien in ~/.ssh an dieselbe Stelle des neuen Rechners kopieren – damit erkennt das Gateway den Remote Pi. Außerdem noch alle Dateien in /etc/ssh auch in das Verzeichnis /etc/ssh des neuen Gateways – damit erkennt der Remote Pi das Gateway als alten Bekannten. Dabei beachten, dass die Permissions und Besitzer mitkopiert bzw. hinterher entsprechend auf identische Werte umgestellt werden müssen.
Gut, aber immer noch nicht perfekt!
Schritt 3: Stabilisieren
Gerade wenn der Remote Pi über Mobilfunk im Internet hängt, kann es vorkommen, dass die Verbindung hin und wieder kurz unterbrochen wird. (Das passiert übrigens auch bei den meisten DSL Providern. Irgendwann nachts setzt der Provider die Verbindung zurück.) In diesem Falle bricht der Tunnel geräuschlos aber unerbittlich zusammen. Man könnte jetzt ein Skript schreiben, das die Verbindung laufend überprüft und bei Bedarf neu aufbaut. Das ist zum Glück überflüssig, denn es gibt mit autossh
eine Erweiterung (eigentlich einen Wrapper) für SSH. Einfach autossh
anstatt ssh
verwenden und schon haben wir ein stabiles System. Perfekt? Leider immer noch nicht, denn autossh
hilft nichts, wenn der Remote Pi z.B. wegen eines Stromausfalls neu startet.
Möglicherweise ist autossh
noch nicht auf dem Pi installiert. Dem kann man ganz einfach mit
sudo apt install autossh
abhelfen.
Schritt 4: Autostart
Wir erstellen ein Script mit Namen tunnel.sh, in das wir den Reverse SSH Tunnel Befehl eintragen:
1 2 |
#!/bin/bash /usr/bin/autossh -p2000 -fNC -R 10011:localhost:22 pi@dyn.IP.adresse |
Dieses Script legen wir im Homeverzeichnis ab. Mit
1 |
chmod +x tunnel.sh |
machen wir es ausführbar.
Alles was automatisch beim Start oder in regelmäßigen Abständen laufen soll, wird per Crontab aufgerufen. Dazu folgender Befehl:
1 |
crontab -e |
Es erscheint die Crontab im Editor – ganz nach unten scrollen und folgende Zeile eingeben
1 |
@reboot /home/pi/tunnel.sh |
mit Strg+X speichern wir die Crontab und verlassen den Editor.
In einer früheren Version dieser Anleitung hatte ich die Crontab als Superuser mit sudo crontab -e
editiert. Das hatte zur Folge, dass der Tunnel beim Start vom Superuser bzw. Root und nicht vom User Pi aufgebaut wurde. Wenn nun der Root seine ID noch nicht im Gateway Pi hinterlegt hat, dann baut sich der Tunnel nicht auf, da der passwortlose Login nicht funktioniert; es sei denn, du hast vorher den Schlüssel mit "sudo ssh-keygen" erzeugt und mit "sudo ssh-copy-id" übertragen. Dieses Problem ist bei mir lange nicht aufgefallen, da ich wohl bei Basteleien irgendwann vorher die ID vom Root des Remote Pi auf den Gateway Pi kopiert hatte.
So! jetzt ist es annähernd perfekt. Der SSH Tunnel startet nach jedem Reboot und ist nun komplett, stabil und betriebssicher. Bitte beachtet, dass der Tunnel unter Umständen nicht sofort nach dem Reboot steht, sondern einige Minuten braucht, um die Verbindung zum Gateway herzustellen. Ich vermute, dass die WLAN Verbindung noch nicht sauber steht, wenn das autossh
Kommando das erste mal abgearbeitet wird. Mit autossh
stellen wir aber sicher, dass die Verbindung anschließend automatisch hergestellt wird.
Ich habe allerdings festgestellt, dass sich der Gateway Pi hin und wieder, d.h. alle paar Wochen, zu verabschieden schien. Das lag aber dann meist daran, dass meine Fritz!Box ihren Aufgaben nicht vollständig nachkam und die Portweiterleitung bestreikte. Nach einem Reboot der Fritz!Box (auch per Fernzugriff möglich) gings dann wieder.
Nochwas zum Anwendungsfall Remote per Mobilfunk: Auch der Router am Remote Pi scheint manchmal seine Probleme zu haben. Unter Umständen ist das Mobilfunknetz so stark überlastet, dass der Router, bzw. der Internet Stick daran sich einfach nicht verbinden will. Nach zu vielen Fehlversuchen streikt der Router dann – zumindest der von mir verwendete TP-Link Mobilfunk Router TL-MR3420. Dann hilft nur ein physikalischer Reset des Routers. Auch dafür gibts eine Lösung mittels Fernschalt-Steckdosen und 433MHz Sender am Pi. Dazu habe ich einen eigenen Artikel geschrieben.
Ich empfehle inzwischen eher eine Fritz!Box für Mobilfunk.
Schritt 5: Browsen im Tunnel
Bisher haben wir lediglich reines SSH Protokoll durch den Tunnel geschickt. Unser Remote Pi kann ja auch als Webserver laufen, z.B. um Temperaturen vor Ort anzuzeigen oder Bilder einer Webcam. Damit wir auch http d.h. Browserdaten durchs Tunnel schicken können, passen wir unser Skript bzw. den Befehl darin wie folgt an:
1 |
/usr/bin/autossh -p2000 -fNC -R 8000:localhost:80 -R 10011:localhost:22 pi@dyn.IP.adresse |
8000 ist die Portnummer mit der die http Daten vom Gateway zum Remote Pi umgelenkt werden.
80 ist der Standardport für http. Schickt man beim Gateway etwas an Port 8000, kommt es beim Remote Pi an Port 80 wieder an. Und 80 ist der Port, mit dem der Webserver normalerweise kommuniziert.
Will man nur aus dem eigenen lokalen Netzwerk auf den Remote Pi zugreifen, gibt man in den Browser die IP Adresse des Gateway Pi ein, gefolgt von einem Doppelpunkt und der Ausgangsportnummer für http. Also zum Beispiel:
1 |
http://192.168.178.40:8000 |
Damit das funktioniert, braucht man logischerweise einen installierten Webserver auf dem Pi – z.B. Apache oder Lighttpd.
Im Zuge des allgemeinen Trends, den User für unmüdig zu halten, hat Firefox spätestens ab Version 75 geruht, den Zugriff auf http Seiten (also ohne SSL Verschlüsselung) zu erschweren. Will man "von außen" mit Firefox für Windows über Router Portfreischaltung und das Gateway einen auf dem Remote gehosteten Webserver erreichen, (sinngemäß http://deine Website.net:7555) kann es passieren, dass die Remote Website nicht funktioniert. Das passiert dann, wenn man unter deineWebsite.net auch noch eine SSL verschlüsselte Website (z.B. auf dem Gateway) betreibt.
Abhilfe geht wie folgt: Im Firefox Profilordner die Datei
sitesecurityservicestate.txt
editieren und die Zeile, welche deineWebsite.net enthält, rauslöschen. Dummerweise wird Firefox beim nächsten Zugriff auf die SSL verschlüsselte Seite diesen Eintrag wiederherstellen. Falls das zu sehr nervt,
sitesecurityservicestate.txt
als Readonly einstellen (Rechtsklick auf Dateinamen – Eigenschaften – schreibgeschützt). Wie man das mit FF für iOS hinbekommt, habe ich noch nicht herausgefunden.
Firefox hat noch ein paar andere Schweinereien auf Lager, die künftig https erzwingen und unverschlüsselte Seiten ins Abseits stellen. Infos hierzu z.B. bei Heise.de
Externe Geräte ansprechen
Extern bedeutet in diesem Kontext andere Geräte im Remote Netzwerk. Wenn ihr also eine IP Cam mit einem Browser über den Tunnel ansprechen wollt, dann einfach anstatt localhost die IP Adresse des externen Geräts verwenden.
Hat die Cam z.B. die lokale Adresse 192.168.178.120 dann wird das Tunnelskript von oben wie folgt erweitert:
1 |
/usr/bin/autossh -p2000 -fNC -R 8000:localhost:80 -R 10011:localhost:22 -R 8889:192.168.178.120:80 pi@dyn.IP.adresse |
über die Parameter -R 8889:192.168.178.120:80 wird alles was auf Port 8889 ankommt, auf den http Port 80 des externen Geräts, z.B. einer Cam umgeleitet.
Auf einem PC im Netz des Gateway Pi gebt ihr im Browser die IP des Gateway Pi ein, gefolgt von einem Doppelpunkt und dem Port 8889. Wenn alles klappt, kommt ihr bei der Remote Cam – oder was auch immer ihr ansprechen wollt – heraus. Ihr könnt auf diese Weise auch euren remoten Router ansprechen und administrieren.
Herzlichen Dank an Reto Huber für diesen genialen Tipp!
Mehr darüber in einem eigenen Beitrag .
Zugriff von "Außen"
Will man auch von "außen", also außerhalb des Heimnetzwerks, auf eine beim Remote Pi gehostete Website zugreifen, muss man im Router des Heimnetzwerks zusätzlich die Portadresse 8000 (oder was immer du gewählt hast) freischalten. Der Aufruf erfolgt dann so:
1 |
http://dyn.IP.Adresse:8000 |
Auch hier braucht ihr natürlich einen Webserver auf dem Remote Pi.
Bei dem Versuch die Verbindung vom Gateway zum Remote zu nutzen ( ssh -p10022 localhost) bekomme ich die Fehlermeldung:
debug1: connect to address 127.0.0.1 port 10022: Connection refused
ssh: connect to host localhost port 10022: Connection refused
Hast Du eine Idee?
VG piet
Hallo, danke für deine Anfrage zu meinem inzwischen über 10 Jahre alten Post – ist aber immer noch aktuell.
Den Problem kann vielerleit Ursachen haben. Ich nehme an, du hängst beim Schritt 1b, Abschnitt "erster Test".
Hast du pysischen Zugriff auf Gateway und Remote? Kannst du in beide Richtungen ein normales ssh Connect herstellen – also von Gateway zum Remote und umgekehrt? Das wäre wichtig, damit die Rechner gegenseitig ihre SSH Keys kennen.
Ansonsten mal eine andere Portnummer nehmen. 10000 zum Beispiel geht ganz gut.
Ich gehe auch davon aus, dass du Schritt 1a durchgeführt hast.
Nur nicht den Mut verlieren…
VG
Chris
das kann daher kommen, dass der Zielhost kein Reverse SSH unterstützt, was sagt das Logfile?
% tail -f /var/log/syslog
Vor Jahren dank diesem Tutorial erfolgreich installiert. Funktioniert einwandfrei!
Lästig sind die vielen scp, die benötigt werden, wenn Dateien vom Arbeitsplatzrechner via den Gateway Pi auf den Remote Pi kopiert werden müssen.
Die Lösung heisst ZeroTier (https://www.zerotier.com). Damit kann ein virtuelles Network konfiguriert werden. Egal, ob die Devices hinter LAN, WLAN, 4G etc liegen. Kollege Andreas hat das hier dokumentiert: https://www.youtube.com/watch?v=Rgd5WTGdwZ8.
Danke. Für das von dir geschilderte scp Problem habe ich auch eine Lösung beschrieben:
https://www.rustimation.eu/index.php/einfache-entwicklungsumgebung/
Das funktioniert auch ganz einfach mit dem Remote Pi.
Grüße
Chris
Ich muss leider meinen Gateway Pi tauschen. Gibt es eine einfache Möglichkeit den erstellten Key auf dem Remote Pi einfach zu kopieren?
Hallo Peter,
ich musste auch erst bei mir suchen, da ich wusste, dass ich es schonmal irgendwo aufgeschrieben habe. Kurzum es war in einem Kommentar zum ReverseTunnel versteckt:
.-.-.-.-.-.
Für Spezialisten: Wollt ihr irgendwann später ein neues/anderes Gateway installieren, z.B. wg. HW-Tausch, dann könnt ihr das auch ohne Zugriff auf den Remote Pi durchführen. Dazu die Dateien in ~/.ssh an dieselbe Stelle des neuen Rechners kopieren – damit erkennt das Gateway den Remote Pi. Außerdem noch alle Dateien in /etc/ssh auch in das Verzeichnis /etc/ssh des neuen Gateways – damit erkennt der Remote Pi das Gateway als alten Bekannten. Dabei beachten, dass die Permissions und Besitzer mitkopiert bzw. hinterher entsprechend auf identische Werte umgestellt werden müssen.
Danke für den Hinweis. Bei mir gibt es aber das Problem, dass die Daten auf dem Gateway Pi verloren sind und nur der Key auf dem Remote Pi noch da ist.
Daher die Idee den RSA-Key vom Remote zum Gateway zu kopieren ohne für beide Pi's das gesamte Prozedere zu wiederholen.
Hmm,
Probier mal den Abschnitt „Login ohne Passwort“ durchzuarbeiten. Damit erkennt das neue Gateway den Remote. Natürlich geht das nur, wenn du physischen Zugriff auf den Remote Pi hast.
VG
Chris
Moin Chris,
mein Internetanschluss wird bald auf die Deutsche Glasfaser umgestellt. Bedeutet keine öffentliche IPV4 mehr…
Lässt sich das ganze auch irgendwie über IPV6 umsetzen?
Kenne mich da leider nicht aus.
Danke schonmal
Patrick
Hallo,
ich habe mich – weil es mich vorerst noch – nicht betrifft bisher nicht damit auseinander gesetzt. Die einzige Lösung, die mir spontan einfällt, wäre eine ipv4 Adresse hinzu zu bestellen.
Eventuell ist das hier die Lösung: https://techoverflow.net/2018/06/09/how-to-ssh-to-an-ipv6-address/
oder das: https://linuxconfig.org/how-to-ssh-to-ipv6-address-on-linux
VG Chris
Danke für das super Tutorial. Hat einwandfrei funktioniert! Lg aus der Schweiz!
Hi,
danke erst einmal für das tolle Tutorial – jetzt bin ich nach dem Umzug auch endlich wieder via LTE erreichbar (Internetwüste Deutschland sei Dank…).
Eine Frage:
Wie schaut es denn mit UDP-Traffic aus?
Danke! 🙂
Hallo,
freut mich, wenn ich dir helfen konnte. Mit UDP habe ich mich noch nicht beschäftigt. Da das aber auch in IP basierten Netzwerken passiert, versuch es doch einfach mal selbst. Du musst halt zusehen, dass die richtigen UDP Ports
angesprochen werden. Viel Spaß beim ausprobieren:
Chris
Hi,
danke für die rasche Rückmeldung – das Problem ist leider, dass SSH rein TCP-basiert ist und dementsprechend keine UDP-Pakete senden/empfangen kann…
Cheers!
Hi,
schon klar, ssh kann das nicht übertragen, aber du kannst durch den Tunnel ja alle möglichen anderen IP basierten Protokolle jagen. http geht über Port 80 an der Empfängerseite, die Senderseite ist hier wahlfrei. Mit UDP müsste es ebenso funktionieren indem du die passende Portnummer auf der Empfängerseite einstellst.
Beispiel http:
/usr/bin/autossh -p2000 -fNC -R 8000:localhost:80
Alles was du bei Sender (Browser) an Port 8000 schickst kommt beim Empfänger auf Port 80 an. Ersetze die 80 duch den benötigten UDP POrt, die 8000 durch den Port, den der Sender verwendet, dann müsste es m.E. funktionieren. Was willst eigentlich bewerkstelligen? Welchen Anwendungsfall hast du?SSH bzw. Putty o.ä. brauchst du ja nur zum Einrichten, bei der späteren Verwendung läuft das transparent durch den Tunnel.
Schau mal hier:https://qastack.com.de/superuser/53103/udp-traffic-through-ssh-tunnel
wie gesagt, habe ich mich mit UDP noch nicht beschäftigt
Hallo, ich habe Probleme bei Schritt zwei mit den Zugriffsrechten.
Wenn ich kopieren will bekomme ich auf dem Remote-Pi immer diese Meldung:
/usr/bin/ssh-copy-id: ERROR: failed to open ID file '/home/pi/.ssh/id_rsa.pub': Permission denied
Hallo,
mein Verdacht ist, dass der Remote das Gateway noch nicht kennt. Logge dich einmal mit SSH vom Remote aus auf dem Gateway ein:
ssh -p2000 user@deine.dy.ip
Statt dem -p2000 nimmst du die Portadresse, die du verwendest, wenn du dich von "außen" auf dem Gateway einloggen willst. Wenn du hier nichts verändert hast kannst du den -p Parameter auch weglassen.
Es kommt dann eine Meldung der Art: "The authenticity of host ….ECDSA Fingerprint is…continue connecting (yes/no)?
Diese Abfrage bestätigen und anschließend das Passwort vom Gateway User eingeben.
Jetzt kennt der Remote das Gateway (entsprechender Eintrag in der Datei ~/.ssh/known_hosts) und akzeptiert den Copy Befehl.
VG Chris
Hallo Chris,
vielen dank für die Anleitung, damit habe ich schon ein paar Projekte umgesetzt.
Aktuell versuche ich einen neuen Remote Pi einzurichten.
In dem Netzwerk in dem er hängt ist zunächst erstmal alles blockiert (auch ausgehende Ports)
Ich habe es jetzt geschafft dass eine Verbindung zum GatewayPi aufgebaut wird. Leider scheint diese trotz autossh nicht stabil zu sein.
Weist du ob autossh noch weitere Ports benötligt? Ich habe da mal etwas gelesen, dass es noch einen Monitoring-Port verwendet. Diesen habe ich nicht spezifiziert (habe ich beim Mobilfunk auch nie benötigt)
Vielen Dank schonmal 🙂
Patrick
Hallo,
der Monitoring Port ist lt. autoSSH Man Pages immer der SSH Port +1. Es ist tatsächlich ein Ding von autoSSH, das normale SSH hat ja kein Monitoring. Also wenn du als SSH Port 2000 verwendest, ist der AutoSSH Monitoring Port 2001. Der Port sollte natürlich nicht von anderen Anwendungen belegt sein. Falls doch, gibt es einen Aufrufparameter – bei
man autossh
nachsehen. Ports unter 1024 unbedingt meiden, die braucht Linux selbst.Eine wackelige Verbindung kann viele Ursachen haben. Wenn möglich, beide Pis (Gateway und Remote) per Kabel anbinden und nicht per WiFi. Und falls doch, dann für ein möglichst starkes Signal sorgen. Repeater, bessere Antenne und so.
Viele Grüße aus München
Chris
Hallo Chris,
ich habe entsprechend deiner Anleitung den Reverse SSH Tunnel zu einem LTE Router aufgebaut und das klappt hervorragend. Vielen Dank dafür! Jetzt habe ich noch eine zweite "Baustelle", wo ich wiederum eine LTE- Router habe . Dort würde ich gerne einen weiteren Reverse SSH Tunnel aufbauen, geschickterweise mit dem selben Gateway. Geht das und welche Einstellungen muss ich da machen?
Viele Grüße
Richard
Hallo Richard,
im Grunde baust du ja keine Verbindung vom Gateway zu einem Remote Router auf, sondern ein entferntes Gerät (Client im Netz des Remote Routers oder auch stand-alone) baut eine Verbindung zum Gateway (Server) auf, die gehalten wird. Vor dem Gateway hängt i.d.R. ein Router, der eine entsprechende Portfreischaltung braucht (Schritt 1b). Der eventuell auf der Remote Seite vorhandene Router ist transparent, also durchsichtig und muss nicht berücksichtigt werden.
So lange du die Portnummern eindeutig hältst – d.h. jedes Remote Gerät hat seine eigene eindeutige Portnummer mit der es angefunkt wird – kannst du fast beliebig viele Geräte auch aus verschiedenen Remote Netzwerken an das Gateway heranführen. Ich habe in meinem Ferienhaus drei Remote Pis, von denen jeder sein eigenes Reverse-SSH Tunnel zum Gateway aufbaut. Alles über den selben Port am Gateway; im Text ist das unter Kapitel 1b die Portnummer 2000.
Ein Beispiel: im ersten Netz hängen drei Remote Pis:
1. Pi –> ssh -p2000 -fNC -R 10011:localhost:22 pi@dyn.IP.adresse
2. Pi –> ssh -p2000 -fNC -R 10012:localhost:22 pi@dyn.IP.adresse
3. Pi –> ssh -p2000 -fNC -R 10013:localhost:22 pi@dyn.IP.adresse
Es empfiehlt sich die Ports so auszuwählen, dass hier eine gewisse Zuordnungslogik entsteht
zB. Pi #1 im 2. Netz –> ssh -p2000 -fNC -R 10021:localhost:22 pi@dyn.IP.adresse
Viele Grüße
Chris
Hallo Chris,
danke für die schnelle Antwort. Ich werde es testen und dann berichten.
Viele Grüße
Richard
Hallo Chris,
ich versuche gerade das gleich, nämlich zwei RemotePIs auf ein Gateway zu connecten. Vom Remote Pi aus geht da auch, am GatewayPi erhalte ich: ssh: connect to host localhost port 10012: Cannot assign requested address.
Die Schlüssel sind kopiert, und auch "known_hosts" kenn den zusätzlichen Pi. Einen zusätzlichen abweichenden Port vom ersten Pi habe ich auch vergeben. Allerdings stehen alle im aktuell im lokalen Netz.
Ich scheine noch einen Schritt übersehen zu haben. Hast Du eine Idee?
Gruß aus Unterschleißheim
Christian
Da muss ich etwas hirnen. Bei welcher Eingabe genau kommt die Fehlermeldung? Beim Aufbau der ssh Verbindung?
Hallo Chris,
ich habe das Problem lösen können. Ich habe in der tunnel.sh den Aufruf um das id_rsa ergänzt:
sudo /usr/bin/autossh -p 2000 -fNC -i /home/pi/.ssh/id_rsa -R 10013:localhost:22 pi@server.de
Damit funktioniert es nun.
Hi,
ich glaube, wenn du den sudo vor dem Kommando weglässt, dann brauchst du die ID nicht zusätzlich angeben. Siehe auch den eingerückten, grauen Text am Ende von Schritt 2.
Wer den Schlüssel erzeugt, muss auch den Tunnel aufbauen. Bei dir hat der User Pi den Schlüssel erzeugt bzw. im Gateway abgelegt, du startest den Tunnel aber mit dem Superuser (sudo).
Viele Grüße
Chris