Reverse SSH Tunnel – Schritt für Schritt

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. 

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.

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 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 machts 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:

dort dann am besten folgende Einträge suchen und abändern bzw. die Einträge am Ende vornehmen:

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.

AllowTcpForwarding yes
erlaubt es, auch andere Protokolle – z.B. http –  im SSH Tunnel zu verpacken.

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:

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
und die Abfrage mit yes bestätigen. Es scheint, dass Raspbian Stretch etwas weniger tolerant ist als Jessie oder  Wheezy.

Auf dem Gateway Pi kann man sich nun mit dem Befehl

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 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

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:

Hat man auf dem Gateway Pi eine andere SSH Portadresse (z.B. 2000) eingerichtet, lautet der Befehl wie folgt:

Bei älteren 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-get install autossh
abhelfen.

Schritt 4: Autostart

Wir erstellen ein Script mit Namen tunnel.sh, in das wir den Reverse SSH Tunnel Befehl eintragen:

Dieses Script legen wir im Homeverzeichnis ab. Mit

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:

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

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: 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.

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:

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:

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. Dumerweise 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:

ü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:

Auch hier braucht ihr natürlich einen Webserver auf dem Remote Pi.

196 Gedanken zu „Reverse SSH Tunnel – Schritt für Schritt

  1. Hallo.

    Erstmal vielen Dank für die super Anleitung, hat wunderbar funktioniert. Allerdings habe ich noch ein kleines Schönheitsproblem und komme mit der Lösung nicht weiter.

    Ich möchte einen Raspberry in meinem Heimnetzwerk auf dem eine Cloud läuft aus dem Netz verfügbar machen. Dazu habe ich mir von Ionos einen kleinen VPS Server gegönnt. Von dem RaspberryPi habe jetzt einen SSH Tunnel zu dem VPS Server aufgebaut und das funktinoniert soweit wunderbar. Der nächste Schritt ist, dass ich mir jetzt noch eine Domain zugelegt habe, die ich auf den Webserver umleite. Das funktioniert so weit auch, allerdings habe ich jetzt hier einen kleinen Schönheitsfehler.

    Wenn ich in meinem Browser “meineDomain.de” eintrage lande ich auf meinem RaspberryPi, allerdings ändert er dann in der Browserzeile die Domain “meineDomain.de” auf die IP-Adresse des Webservers um.
    Den SSH Tunnel baue ich mit autossh … pi@meinedomain.de auf

    Ich weiß aktuell nicht mehr weiter, wo hier das Problem liegen könnte? Könntest du mir vielleicht noch einen Tipp geben.

    Danke schon mal für die Hilfe.

    1. So ganz habe ich nicht verstanden, was du eigentlich erreichen willst bzw. was das Problem ist.
      Der Setup klingt für mich auch nicht besonders logisch. Allerdings habe ich keinerlei Erfahrung mit VPS.
      Bei mir habe ich auf dem Gateway eine Owncloud installiert. Ohne Kosten für VPS Provider. Domain per dynDNS auf den Pi geleitet und Fertig. Dafür braucht du noch nicht mal ein Reverse SSH Tunnel.
      Wenn du deine Frage evtl. etwas genauer formulierst kann ich versuchen, dir weiterzuhelfen.
      Gruß
      Chris

  2. Hi Chris,
    für diese exzellente Anleitung wurdest Du schon vielfach gelobt. Zu recht, ich schließe mich den begeisterten Stimmen an!

    Mein Anwendungszweck ist eine räumlich getrennte Backup-Lösung:
    1. RaspberryPi mit USB-Festplatte, steht bei mir.
    2. BananaPi mit USB-Festplatte, steht bei meinem Bruder.
    3. und 4. Synology Disk Station meines Bruders, eine steht bei ihm, eine steht bei mir.
    Meine Rechner legen ihre Backups neben einer lokalen Kopie auch auf dem RaspberryPi ab, dieser spiegelt die Backups dann auf den BananaPi.
    Die Rechner meines Bruders speichern ihre Backups auf seiner lokalen Disk Station, diese soll den Reverse-SSH-Tunnel nutzen, um die Backups auf die hiesige Disk Station zu spiegeln. Soweit der Plan.
    Entsprechend Deiner Anleitung ist der RaspberryPi der Gateway Pi und der BananaPi der Remote Pi. So hatte ich sie auch eingerichtet, als der Remote Pi noch bei mir war. Der Tunnel wurde aufgebaut und stand.

    Jetzt kommt mein Problem/meine Frage:
    Der Remote Pi hängt nun im LAN meines Bruders und hat von seiner Fritz!Box die IP 192.168.178.13 erhalten. Er stellt aber keine automatische Verbindung zum Gateway Pi mehr her.
    Ich habe mich mal per Remote Desktop auf den Rechner meines Bruders aufgeschaltet und von diesem aus per “normalem” SSH auf meinen Remote Pi eingeloggt. Er kann keine Verbindung nach draußen herstellen, das Anpingen einer beliebigen IP scheitert, eine Namensauflösung findet nicht statt. Ein “ip a” hat mir gezeigt, dass er neben der 192.168.178.13 auch noch die 192.168.175.29 mit sich rumschleppt, die er von meiner Fritz!Box hatte. Warum behält er diese IP aus einem anderen Subnetz (.175.xx statt .178.xx) bei? Liegt es daran, dass auf dem Remote Pi noch ein Pihole läuft? Und führt das Nebeneinander der beiden IPs dazu, dass er keine Verbindung nach draußen aufbauen kann? Kann/soll ich mit “ip addr del 192.168.175.29 ” dem Remote Pi die alte IP-Adresse abgewöhnen?

    Wenn das gelöst ist und der Remote-SSH-Tunnel aufgebaut ist, kann ich mich darum kümmern, dass entsprechend Deiner weiteren Anleitung “Remote Devices administrieren” die Diskstations miteinander in Verbindung kommen.

    Vielen Dank für Deine Hilfe!
    Beste Grüße und bleib gesund
    Tilmann

    1. Hallo Tilman,
      Schon merkwürdig, dass die früher benutzte IP Adresse persistiert wird. Ich vermute, dass PiHole dazwischenfunkt. PiHole ersetzt ja den DHCP Server im Router. Kann sein, dass das Teil sich die alte IP gemerkt hat und wieder ausspielt. Schaut euch mal die Konfiguration von PiHole an.
      Ursachenforschung vorher evtl. mit cat /var/log/syslog|grep “192.168.175.29”. Vielleicht kommt dabei etwas Erhellendes raus.
      Generell würde ich die falsche IP rauslöschen. Die hat da nichts zu suchen. Die interne IP Konfiguration der Gatewayseite ist für Remote transparent, da der GW Router die internen IP Adressen vergibt bzw. durch die Portfreigabe im Router festgelegt ist, wo der SSH Tunnel ankommt.
      Generell hilft es, sich Schritt für Schritt durchzuhangeln. Ggf per Teamviewer und PC auf den Remote Hobel zugreifen.
      Sag mir Bescheid, ob’s geklappt hat.
      Bleib gesund
      Chris

      1. Hi Chris,

        ‘s hat etwas gedauert, weil das real-life auch noch stattfindet… 🙂
        Der BananaPi (=Remote Pi) ließ sich dann gar nicht mehr ansprechen, startete auch bei mir nicht mehr vernünftig. Nach diversen Neuinstallationen, die aus mir unerklärlichen Gründen beim nachfolgenden Update abbrachen (sowohl mit Ubuntu MATE als auch mit Arch Linux) habe ich ihn als instabil aufgegeben und einen neuen Raspberry Pi geholt. Der läuft jetzt mit einer Vanilla Arch Installation, headless ohne Desktop Environment, stabil. Alles Erforderliche lässt sich prima per SSH im Terminal einstellen. Altlasten vom PiHole bestehen natürlich hier nicht.
        Der Reverse-SSH-Tunnel wird brav nach jedem Reboot aufgebaut und gehalten. Wobei ich für autossh noch den Monitorport (-M [portnummer]) als Parameter mit übergeben musste, sonst hatte sich autossh geweigert.

        Also nochmals vielen Dank für Deine Hilfe.
        Tilmann

        1. Freut mich, wenn ich helfen konnte. Die einzelnen Linux Distributionen verhalten sich leider des Öfteren unterschiedlich. Das könnte auch das andere Verhalten von autossh erklären. Bei Raspbian gibt es hier keine Probleme – ein Extra Monitoring Port ist nicht nötig.
          –> Schau dir mal die Man Pages von autossh an. Da steht, dass der Monitoring Port immer eins über dem normalen Dateport ist. Wenn du die Verbindung über Port 20000 aufbaust dann ist der Monitoring Port 20001. Wen der Port aber schon belegt ist, dann klappt das Ganze nicht mit der Default Einstellung und du musst einen anderen Monitoring Port angeben.
          VG
          Chris

    2. Noch eine Idee bzw. Frage: Warum macht ihr das überhaupt per ReverseSSH Tunnel? Ist auf einer oder beiden Seiten eine Network Address Translation (NAT) aktiv, die verhindert, direkt auf den jeweils entfernten Raspberry Pi bzw. Diskstation zuzugreifen? Falls nein, wäre es generell einfacher, direkt über FTP oder ein anderes Protokoll zu gehen, d.h. Diskstation zu Diskstation direkt. Synology hat dafür auch ein Tool: Cloud Station ShareSync App.
      LG Chris

  3. Hallo Chris,
    habe den Reverse SSH Tunnel jetzt einiger Zeit am Laufen. Soweit klappt es sehr gut. Der Tunnel läuft über den LTE Router (D-Link DWR-92 am RemotePi) der sein Internet über eine SIM Karte bekommt. Bei Verbindungsabrüchen durch eine “wackelige” Internetverbindung über die SIM Karte muss der GatewayPi immer wieder neu gestarte werden. Vrmtl. weil hier ein Stück vom alten Tunnel hängengeblieben ist.
    autossh ist schon implementiert.
    Frage: Kann mittels mosh die Verbindung stabilisiert werden? Funktioniert mosh mit SSH Reverse Tunnel?
    VG
    Peter

    1. Hi, mit mosh habe ich keinerlei Erfahrung. Eigentlich dürfte das Gateway keine Probleme haben. Es ist nach Verbindungsabbruch einfach auf Empfang und wartet.
      Hast du die vorbereitenden Schritte für das Gateway durchgeführt? Das ist wichtig, sonst baut das Gateway die Verbindung irgendwann ab. Ich empfehle auch, das Gateway über ein Ethernetkabel an den Router zu hängen.
      Gruß
      Chris

  4. Hallo Chris,
    habe inzwischen den Reverse SSH Tunnel wie von Dir beschrieben mit einem GatewayPi aufgebaut. Ich browse eine grafische Oberfläche (Grafana) durch diesen Tunnel und es läuft seit einiger Zeit perfekt.
    Eine Sache ist mit unklar. Alle Daten die ich über den GatewayPi (via Grafana) sehe sind valide. Innerhalb Grafana habe ich ein weiteres Panel implementiert, in dem ich mittels iframe die Seite “www.meineip.de” anzeigen möchte. Auf dem Remote Pi wird die IP des RemotePi angezeigt. Aber auf dem GatewayPi wird die IP des GatewayPi angezeigt, obwohl ich über den GatewyPi auf den RemotePi schaue.
    Was habe ich hier nicht verstanden? Oder muss dafür ggf. eine weiterer Tunnel aufgebaut werden?
    VG
    Peter

    1. Hi Peter,
      ich kenne Grafana jetzt nicht näher. Bzgl. der Anzeige der IP würde ich sagen, dass immer die IP des Geräts angezeigt wird, auf dem der jeweilige Client gerade läuft. Der Grafana Client bzw. Connector auf den Remote Pi zeigt die dortige IP Adresse an. Das Panel im iframe, in dem “meineip.de” angezeigt wird, läuft offensichtlich auf dem Grafana Client beim Gateway, ist nicht mit dem Remote verbunden und zeigt deshalb die IP deines Routers zuhause an.
      Frage: was machst du mit dem Grafana Teil bzw. was zeigst du an?
      Gruß
      Chris

      1. Hey,
        mit Grafana zeige ich den Zustand meine Bordbatterie und dessen Ladung durch die Solarzellen über die Zeit an. Das sind:
        – Batteriespannung
        – Lade/Entladestrom
        – Ladezustand der Batterie
        – Anzahl der Synchronisationen des Batteriemonitors
        – eingeladene und entnommene Energie der Batterie
        – Spannung der Starterbatterie
        – Aktuelles Wetter am Liegeplatz (Luftdruck, Temperatur, Luftfeuchte)
        – später möchte ich noch die Aufnahmen der IP Kamera anzeigen

        Das mit der „meineIP“ war nur ein Test. Eigentlich möchte den Datenverbrauch der italienischen SIM Karte sehen.
        VG Peter

  5. Hallo Chris, habe den SSH Reverse Tunnel mit dem MacBook als Gateway aufgebaut. Das funktioniert gut, Danke für die super Beschreibung. Als aber der Tunnel “zusammenfiel” – Broken Piep, hat es mir das WLAN zerlegt. Werde jetzt das ganze wie vorgeschlagen mit einem Pi als Gateway aufbauen.
    VG Peter

      1. An Bord verwende ich derzeit den RasPi 3B, der verbraucht weniger als der 3B+. Für das Auslesen des Batteriemonitors verwende ich ein fertiges Image und ob das auf dem Zero läuft muss ich erst noch prüfen, steht aber auf der ToDo Liste. Derzeit verbraucht mein Router und Ubiquiti BulletM2-HP an Bord um die 300mA. Denke dass ich mit dem Pi 3B dann immer noch deutlich unter 1A Verbrauch liege. Die Bordbatterien werden durch 2 x 100Wp Solarzellen geladen und der Batteriemonitor schaltet die ganze Mimik bei 11,8 V ab und bei 12,2V wieder ein.
        VG Peter

  6. Hallo Chris,
    super Anleitung und Erklärung. Habe auf meinem Boot in Italien einen Raspberry der mir den Zustand meiner Batterien anzeigt. Der Raspi hängt am TL-MR6400 Router mit einer ital. SIM Karte. Da bietet sich der Reverse SSH Tunnel an. Nur würde ich als Gateway zu Hause statt eines Pi gerne einen MacBook verwenden. Wie würde dann der Schritt 1a aussehen?
    VG Peter

    1. Hallo, freut mich, wenn dir der Beitrag helfen konnte.
      Mit Macs kenne ich mich nicht so gut aus. Die Einstellungen des SSH Clients sind aber sinngemäß identisch.
      Bedenke aber folgendes: wenn das MacBook aus ist, versucht Remote immer wieder vergeblich eine Verbindung aufzubauen und streikt (trotz autossh) irgendwann. Stabiler ist es, wenn du ein dauerhaft aktives Gateway hast, z.B. einen Raspi. Die Stromkosten sind (v.a. bei einem Pi Zero) vernachlässigbar. Falls du von unterwegs deine Bootsbatterie abfragen willst kannst du ja einen Port im Router freischalten, der auf deinen SSH Port umgebogen wird. Oder – noch sicherer – mit VPN auf den Raspi zugreifen. Wenn du ne Fritzbox hast, geht das ganz easy.
      Melde dich, wenn du Fragen hast.
      Chris

  7. Vielen Dank für die Anleitung, mit der ich alles zum Laufen gebracht habe. So kann ich jetzt von Zuhause aus auf meinen Rechner im Wohnmobil über einen HotSpot zugreifen. Dort verwende ich ein Raspi Pi Zero mit Node-Red, Mosquitto IOT und weitere angeschlossene Sensoren.

  8. “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” > Die älteren FritzOSes müllten sich zu. Es reichte dann, alle unbenutzten Geräte (DHCP) aus der Fritte zu löschen. Die neuen FritzOSes scheinen das behoben zu haben.

    Ist es möglich, mehrere Geräte im remote Netzwerk anzusprechen. ZBsp Webcam auf Port 444, Solar Laderegler auf Port 555 und Kühlschrank-Steckdose auf Port 666?
    Ist https auch möglich?

    1. Hallo,
      erst einmal vielen Dank für den Hinweis mit der Fritzbox. Ich hatte seinerzeit noch eine uralte 7270 im Einsatz, inzwischen habe ich eine FB 6490 Cable – die ist wesentlich stabiler.
      Logisch kannst du mit einem Remote Pi auch mehrere Geräte ansprechen. Bei mir sieht das beispielhaft so aus:
      /usr/bin/autossh -p2000 -fN -R 9000:localhost:80 -R 11000:localhost:22 -R 8999:192.168.1.1:443 -R 8998:192.168.1.22:80 ich@meineDynDNS.de
      Ich gehe in diesem Beispiel vom Remote Pi über den Port 2000 auf den Gateway Pi – vom Gateway aus mit Port 9000 und http (also dem Browser). komme ich auf dem im Remote laufenden Webserver (localhost Port 80), der wiederum mit PHP ein paar IoT Geschichten steuert.
      Port 11000 ist für SSH um auf die Shell vom Remote (localhost Port 22) zuzugreifen,
      8999 greift via https (Port 443!) auf den Router zu – hier gibt es Zertifikatsfehler, das ist aber normal –
      8998 auf die Web Oberfläche der Webcam.
      Https ist manchmal doppelt gemoppelt, da die Verbindung zwischen Gateway und Remote eh schon verschlüsselt ist. Nur wen du innerhalb des Gateway- und Remote-LANs mit SSL arbeiten willst, brauchst du https. Ebenso wenn du von “außen” auf das Gateway zugreifst und dich zum Remote weiterverbinden lässt, macht https unter Umständen Sinn. Allerdings muss der angesprochene Client (Webcam, IoT Device, Router, Kaffeemaschine, Kondomautomat…) auch https verstehen.
      Gruß
      Chris

            1. Schön dass dir mein Blog gefällt. Danke auch für die Einladung, bei deinem Forum mitzumachen. Foren und Blogs sind zwei sehr unterschiedliche Sachen.
              Mit meinem Blog will ich primär meine Erkenntnisse teilen und Fragen interessierter User diskutieren. In Foren wie z.B. forum-raspberrypi.de hat man es inzwischen (gefühlt) überwiegend mit Schlaumeiern zu tun, die eigentlich kein Interesse an der Sache haben, sondern einem nur beweisen wollen, wie blöd man doch sei.
              In meinem Blog habe ich alles unter Kontrolle, die Diskussionen sind zielführender und ich muss mich nicht mit unqualifizierter Kritik rumärgern. Eine zweite Plattform zu füttern wäre m.E. redundant.
              Nichts desto weniger würde ich mich über eine gelegentliche Erwähnung bei http://www.ltspiceusers.ch freuen. Ich werde mich auch noch registrieren – ich hätte auch ein paar Fragen bzgl. einfacher Schaltungen im Hinterkopf, da ich von Elektronik nur begrenzt Ahnung habe..

              Viele Grüße
              Chris

              1. In meinem Forum sind Sachen wie “wie blöd man doch sei.” verboten!
                Ich kenne das Problem. Es ist leider so. Aber ich versuche, solche Crashes zu vermeiden.
                Hab ich doch einen super gescheiten Moderator verbannt.

  9. Toll. Werde das beim Kollegen in seinem Waldhaus dann ausprobieren.
    Der hat dort nur 4G Internet (ohne öffentliche IP/NAT).
    Er will Webcams, Kühlschrank und Solarpanels remote steuern können.

  10. Ich wollte mich nur schnell für die tolle Anleitung bedanken. Vor Allem, da die Optionen auch einzeln erklärt sind, und nicht nur zum kopieren hingeschrieben sind. Wenn ich so was nachbaue, dann recherchiere ich den einzelnen Optionen und Settings immer nach, aber das ist ja hier gar nicht notwendig. Danke! Wir haben in unserem Vereinsheim eine Überwachungskamera, die ihre Bilder auf einem RasPi ablegt und dieser synchronisiert sie auf einen Server ins Netz. Ich habe nach einer Möglichkeit gesucht sowohl Kamera als auch RasPi remote zu erreichen, ohne mit Kanonen (OpenVPN, Wireguard) auf Spatzen zu schießen. Da kommt der Reverse SSH Tunnel genau richtig.

    1. Hallo Sven,vielen Dank für das positive Feedback.
      Du hast Recht! Wenn alles nur einfach so zum Kopieren hingeschrieben ist, dann lernt ja niemand etwas daraus und ist häufig auf genau die eine Lösung festgelegt, die in der Anleitung steht. Mit mehr Hintergrundwissen kann der User auch auf völlig neue Ideen und Anwendungsmöglichkeiten kommen.
      Viele Grüße
      Chris

Schreibe einen Kommentar zu spicer Antworten abbrechen

Ich freue mich über Lob und Kritik.
Falls du Probleme mit der hier vorgestellten Anleitung hast und nicht weiter kommst:
Bitte das Problem oder die Fehlermeldung(en) möglichst genau beschreiben, auch an welcher Stelle (z.B. in welchem Node oder Befehl) und unter welchen Umständen der Fehler auftritt.
Gerne kannst du mir auch ein Mail schreiben. Die Adresse findest du im Impressum.
Ich gebe mir viel Mühe, meinen Lesern weiterzuhelfen. Je konkreter du bist, desto einfacher und schneller kann ich versuchen zu helfen.
Deine E-Mail-Adresse wird nicht veröffentlicht.
Erforderliche Felder sind mit * markiert