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 Chris,
    vorschlagsgemäß habe ich den Eintrag im RemotePi wieder zurückgestellt auf

    autossh -p2000 -fNC -R 10011:localhost:22 pi@dyn.IP.adresse

    und dafür die Datei /etc/ssh/sshd im GatewayPi um die Parameter

    ClientAliveInterval 30
    ClientAliveCountMax 99999
    GatewayPorts yes
    AllowTcpForwarding yes

    ergänzt und alles läuft völlig problemfrei - d.h. ich habe einige Seiten der BILD.de (als Testfall) damit gelesen - die Kommunikation des RDPX über den SSH Reverse Tunnel ist und bleibt absolut stabil.

    Grüße aus Wien
    Hannes

  2. Hi Chris!
    Ich habe die RDP Funktion im RemotePi nochmals ausfürlich getestet. Der bis jetzt härteste Test war einfach der Aufruf der BILD (die Onlineseite der besagten deutschen [Großformat]Zeitung) mit dem WebBrowser, dabei ging die autossh Verbindung in einen Hängezustand über, d.h. diese Seite konnte nie vollständig geladen/angezeigt werden. Einfachere Webseiten zeigen dieses Verhalten dagegen nicht. Das hat mit den default Einstellungen von autossh zu tun. Aber es gibt eine Abhilfe dazu, damit läuft auch dieser (ich gebe zu ein etwas spezieller) Betriebsfall 😉 ohne Probleme.

    Ergänzung der autossh Kommandozeile (aus deinem Beispiel)
    autossh -p2000 -fNC -R 10011:localhost:22 -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" pi@dyn.IP.adresse

    Schöne Weihnachtzeit!
    Gruß
    Hannes

    1. Hi,
      hey prima. Ich hatte diese Probleme bisher nicht. Ich glaube auch, dass du denselben Effekt erreichst, wenn du die Befehle analog auf dem Gateway in die Datei /etc/ssh/sshd_config einträgst. Anstatt Server.. einfach Client.. eintragen. Der entsprechende Bereich sieht bei mir wie folgt aus:

      ClientAliveInterval 30
      ClientAliveCountMax 99999
      GatewayPorts yes
      AllowTcpForwarding yes

      So hatte ich bei mir kaum Probleme, auch bei längeren Sitzungen und großen Datenmengen nicht.

      Frage: könntest du das mal bei dir ausprobieren und mir Rückmeldung geben? Dann würde ich das in meine Anleitung übernehmen.

      Gruß & schöne Feitertage
      Chris

  3. Hi Chris,

    Mit Hilfe eines Portscanners im LAN
    http://www.radmin.com habe ich analysiert welche Ports im LAN bei beiden Pi's offen sind. Tatsächlich waren im GatewayPi die Ports 22 und 40430 offen, beim RemotePi die Ports 22,3389 und 8082. Damit war klar, die Ports für das SSH Reverse Tunneling waren zu. Nach vielen Googlesuchanfragen habe ich die Antwort zu meinem Problem gefunden. Eigentlich ist die Lösung ganz einfach...

    http://www.alexonlinux.com/reverse-ssh-tunnel-or-connecting-to-computer-behind-nat-router

    Es fehlt der Eintrag "GatewayPorts yes" im GatewayPi !

    GatewayPi:
    sudo nano /etc/ssh/sshd_config

    Einfügen des Textzeile "GatewayPorts yes" am Ende des Files sshd_config
    abspeichern mit CNTL-O,Verlassen des Editors mit CNTL-X

    sudo /etc/init.d/ssh restart
    sudo reboot

    RemotePi:
    sudo reboot

    Im RemotePi wieder den SSH Reverse Tunnel eingeben
    ssh -p 40430 -fN -R 40431:localhost:3389 40432:localhost:8082 40433:localhost:22 pi@192.168.0.28

    Ein nochmaliger Test mit dem Portscanner zeigt, dass jetzt am GatewayPI alle relevanten Ports OFFEN sind - Port 22,40430,4041,40432 und 40433
    UND alle Anwendungen funktionieren PERFEKT!

    Von WinPC mit PuTTY auf GatewayPI verbinden d.h. 192.168.0.28:40433 - LÄUFT!

    Von WinPC aus RemoteDesktopVerbindung auf GatewayPI verbinden d.h. 192.168.0.28:40431 - LÄUFT!

    Von WinPC mit Firefox auf GatewayPI verbinden d.h. 192.168.0.28:40432 - LÄUFT!

    Vielen Dank für deinen Support!

    Grüße Hannes

    1. Hi Hannes,
      freut mich, dass das geklappt hat und dass ich dir zumindest etwas helfen konnte. Ich ahbe bei mir nachgeschaut, mein Gateway Pi hat tatsächlich GatewayPorts yes eingestellt gehabt. Meine 4 anderen Pis nicht... ich erinnere mich aber nicht daran, das irgend wann einmal eingestellt zu haben. Der Eintrag befindet sich auch mitten in der Datei. Sei's drum. Ich werde meine Anleitung entsprechend erweitern. Again what learned 🙂 !

  4. Hi Chris,
    ich habe alles gemacht, was du hier vorgeschlagen hast:

    RemotePi und GatewayPi - beide
    sudo reboot (Neustart)

    RemotePi
    ssh-key (Schlüssel erstellt, default Filename, KEINE Passphrase)
    in .ssh wurden 2 Files erstellt: id_rsa id_rsa.pub

    ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 40430 pi@192.168.0.28"
    in GatewayPi .ssh wurde ein neues File erstellt: authorized_keys

    ssh -p 40430 -fN -R 40433:localhost:22 -R 40431:localhost:3389 -R 40432:localhost:8082 pi@192.168.0.28
    dieser Befehl wurde ohne Eingabe eines Passwortes vom GatewayPi verarbeitet,
    was ich so interpretiere, dass die Übertragung der PublicID (PublicKey) des
    RemotePi auf den GatePi fehlerfrei funktioniert hat.
    Für mich hat der Aufbau des SSH Tunnels somit fehlerfrei funktioniert...

    GatewayPi
    keine weiteren Einstellungen

    Test-> Von WinPC aus RemoteDesktopVerbindung auf GatewayPI verbinden d.h. 192.168.0.28:40431
    keine Verbindung, dabei sollte doch der Zugriff mit 40431 auf 3389 gewandelt und
    an RemotePi weitergeleitet werden.
    Gegenprobe -> Von WinPC aus RemoteDesktopVerbindung auf RemotePI verbinden d.h. 192.168.0.55
    Alles läuft super!

    Test-> Von WinPC mit Firefox auf GatewayPI verbinden d.h. 192.168.0.28:40432
    keine Verbindung, dabei sollte doch der Zugriff mit 40432 auf 8082 gewandelt und
    an emotePi weitergeleitet werden.
    Gegenprobe -> Von WinPC mit Firefox auf RemotePI verbinden d.h. 192.168.0.55:8082
    Camerabild ist innerhalb einer Sekunde sichtbar-alles läuft super!

    GatewayPi
    ssh -p 40433 localhost
    pi@localhost's password: Eingabe des PW vom RemotePi

    Begrüßungstext von RemotePi Terminalfenster
    Linux raspberry 3.12.28+ vom 8.Sept 2014 .....

    exit
    logout
    Connection to localhost closed
    Rückkehr zum GatewayPi Terminalfenster
    Normaler Betrieb möglich

    Test-> Von WinPC mit PuTTY auf GatewayPI verbinden d.h. 192.168.0.28:40433
    keine Verbindung, dabei sollte doch der (remote) Zugriff mit 40433 auf 22
    gewandelt und an RemotePi weitergeleitet werden.
    Gegenprobe1 -> Von WinPC mit PuTTY auf GatewayPI verbinden d.h. 192.168.0.28:40430

    alles läuft super, nach einem Augenblick kommt das Terminalfenster zum
    Einloggen!
    Gegenprobe2 -> Von WinPC mit PuTTY auf RemotePI verbinden d.h. 192.168.0.55:22
    alles läuft super, nach einem Augenblick kommt das Terminalfenster zum
    Einloggen!

    Durch einen unbekannten Umstand wird der Zugriff auf den GatewayPi mit den im SSH Tunnel festgelegten Ports (40431, 40432, 40433) nicht an den RemotePi weitergeleitet. Jetzt macht sich langsam aber leichte Verzweiflung breit ;-((((, was könnte ich noch versuchen?

    lg Hannes

    Anmerkung:

    GatewayPi ist ein Raspberry2 mit 2 USB Anschlüsse und etwas älterer Linux
    Version für Raspberry - Linux raspberry 3.6.11+ vom 30.Aug 2013 .....

    RemotePi ist ein Raspberry2+ mit 4 USB Anschlüsse und der aktuellen
    Version für Raspberry - Linux raspberry 3.12.28+ vom 8.Sept 2014 .....

    Dieser Unterschied sollte aber keine Rolle spielen....

    1. Hallo Hannes,
      hmmm schwierig. Ich würde zu aller erst einmal beide Pis auf den neuesten Stand bringen mit
      sudo apt-get update und dann
      sudo apt-get upgrade
      Das ssh Paket ist zwar ausgereift und hat sich wahrscheinlich kaum verändert, trotzdem ist es wichtg upzudaten, damit andere Faktoren ausgeschlossen werden. Nach Upgrade neu booten
      Dann würde ich einen Schritt nach dem anderen gehen und mich so durchhangeln:
      Zuerst einmal den Remote Desktop via Reverse Tunnel zum Laufen bringen:
      Also auf dem Remote Pi den Reverse Tunnel der einfachsten Art starten - ohne alternativen ssh Port.
      ssh -fN -R 40431:localhost:3389 pi@192.168.0.28
      Da du ja schon die ID kopiert hast, müsste das ohne Passwort klappen.
      Als ssh Port des Gateways muss 22 erlaubt sein.
      Dann mit der Windows Remotesktop Verbindung auf dem PC mit dem Remote Pi via Gateway verbinden.
      Dabei die Adresse des Gateways mit der definierten Portnummer, also 192.168.0.28:40431 eingeben.
      Dann müsste der Remote Desktop aufgebaut werden.

      Troubleshooting:
      Jedes Mal, wenn bevor du einen neuen Tunnel aufbaust, den Remote Pi booten damit der alte tunnel abgebaut wird und keine Portadressen blockiert.
      Versuch mal einen reinen ssh Tunnel ohne Zusatzfunktionen aufzubauen (also auf den Remote Pi z.B.
      ssh -fN -R 10011:localhost:22 pi@192.168.0.28 eingeben)

      Dann mit Putty vom PC aus via Gateway auf dem Remote Pi einloggen. Adresse 192.168.0.28, Port 10011, Connection Type ssh. Geht das?
      Wenn nein, auf dem Gateway Pi versuchen, mit ssh -p 10011 localhost eine Verbindung zum Remote aufzubauen. Geht das?
      So kannst du wenigstens fesstellen, welcher Teil in der Kette versagt.

      Zusätzlich einmal auf dem Remote Pi mit cat /var/log/auth.log die Zugriffe auf den Pi ansehen. Ganz unten in den letzten Zeilen müsste etwas der Art Dec 15 15:27:24 raspberryPi sshd[5603]: pam_unix(sshd:session): session opened for user pi by (uid=0) stehen. ggf. steht da oder eine Zeile darüber noch eine Fehlermeldung, die weitere Hinweise gibt.

      Ich würde anstatt der 40431 auch einmal eine andere Portnummer probieren (ist ja wahlfrei so lange >1024) z.B. 8000 oder so.

      Checken, ob du irgend eine Firewall auf dem Remote Pi aktiviert hast (z.B. fail2ban).

      So mehr weiß ich auch nicht. Außer, in allerletzter Konsequenz nochmal beide Pis komplett neu aufsetzen und von vorne anfangen. Good luck.
      Gruß aus Oberbayern.
      Gruß
      Chris

  5. Eine kleine Story zum Hintergrund der obigen Problembeschreibung:
    In einem kleinen Haus im Ausland habe ich einen ADSL Internetanschluss/Router mit dahinterliegendem LAN. In diesem LAN befinden sich neben weiteren Netzwerkteilnehmern 2 Stück IP Cameras beide ausgeführt mit RaspberryPi und USB Cam. Um auf die Cams zugreifen zu können - muss unbedingt eine Portforwardingfunktion für 2 Ports im Router eingetragen sein. Das funktioniert in der Regel auch ganz gut. Leider verschwinden gelegentlich die Portforwardingeinträge aus völlig unerklärlichen Gründen und daraufhin gibts es dann für mich unfreiwillig eine Aktion "dunkler Bildschirm" einer oder beider Cams. Die Wiedereinstellung konnte bis jetzt nur händisch gemacht werden indem hilfsbereite Leute mit Laptop zum Haus fahren, sich in das LAN einklinken und mir über Teamviewer einen Zugriff auf den ADSL Router aus dem LAN heraus ermöglichen. Dann ist es ein leichtes Unterfangen sich in den ADSL Router einzuloggen und die Einstellungen zu reparieren - eine Sache von Minuten und die Cams sind wieder super sichtbar ....

    Auf den ADSL Router von aussen zuzugreifen um in der internen Konfiguration etwas zu tun/ändern ist leider aus technischen Gründen nicht möglich, d.h. der Internetprovider lässt das nicht zu.

    Ein RemotePi im LAN mit Reverse SSH Tunnel mit rdpx Server (und weil das so nebenbei noch leicht möglich ist noch eine weitere remote CamFunktion)
    wäre daher für mich ideal um bei Bedarf den ADSL Router von der Ferne zu "reparieren" ohne wieder Leute bitten zu müssen mit Laptop zum Haus zu fahren etc. etc. ...

    Hannes

    1. Hallo,
      ich habe mir versuchsweise xrdp installliert und hatte Erfolg.

      Ansonsten bin ich wie folgt vorgegangen:
      Zum Verbinden im lokalen Netz (also nicht von außen) auf dem Remote Pi folgendes Kommando in eine Zeile eingeben

      ssh -p2000 -fN -R 40431:localhost:3389 pi@gateway.IP.adresse

      die 2000 ist der von mir gewählte SSH Port des Gateways. kann auch weggelassen werden, dann wird defaultmäßig die 22 genommen. Die 22 muss natürlich noch erlaubt sein. Zum Testen würd ich erst mal keine abweichende ssh Portadresse nehmen.

      Sicherheitshalber den Remote und den Gateway Pi vorher mit sudo reboot booten, damit keine alten ssh Sessions noch die Ports belegt haben.
      Public ID des Remote Pi muss wie oben beschrieben auf den Gateway Pi kopiert werden. Am Gateway Pi muss dann nichts mehr eingestellt werden, wenn die ssh Portadresse einmal konfiguriert ist.
      Jetzt müsste der Tunnel Aufbau vom Remote Pi aus hoffentlich geklappt haben.
      Der Gateway Pi lauscht jetzt auf Port 40431 und schickt alles, was da ankommt an den Port 3389 des Remote Pi weiter.
      Vom PC (im lokalen Netz) die Remotedesktopverbindung aufrufen und die IP Adresse des Gateway Pi eingeben gefolgt von einem Doppelpunkt und der Nummer 40431. Es kommt eine Warnmeldung, die wird bestätigt und los gehts.

      Das ganze geht sogar von außen: Remote Pi im Ferienhaus, Gateway Pi daheim und der PC woanders. Hierzu brauchst du eine dynamische IP Adresse, aber die brauchst du für deinen Use Case sowieso. Ferner muss dein Router zuhause die ssh Portadresse (jetzt macht es Sinn, die zu ändern) und die xrdp Adresse (40431) durchlassen.
      In der Remote Desktopverbindung gibst du dann DeineDynIPAdresse:40431 ein.

      Ich hatte den Zugriff auf den Router im Ferienhaus bisher etwas umständlicher mit VNC realisiert. Aber xrdp ist wesentlich eleganter, danke für den Tipp!

      Bzgl remote Cam Lösung: Anstatt einer USB Kamera würde ich empfehlen, die Pi Cam zu verwenden, die macht wesentlich bessere Bilder. Guggst du hier: http://rusticam.eu

      Grüße
      Chris

  6. Die Anleitung zum Einsatz von Reverse SSH Tunnel mit Remote Pi und Gateway Pi ist wirklich gut gemacht. Ich habe einen PC (Win7) und 2 Raspberries im LAN (als Teststufe) und diesen
    Reverse Tunnel nachgebaut und alles funktioniert, wobei ich das Beispiel "Browsen im Tunnel" mangels Webserver auf dem Remote Pi nicht ausprobiert habe.
    Stattdessen wollte ich in Analogie einen Zugriff vom PC mit Win7 auf einen rdpx Server und motion Server im Remote Pi versuchen, bin aber dabei gescheitert.

    Nun der Reihe nach:
    IP im Lan: RemotePi 192.168.0.55 (Raspberrypi2Plus, alles an Update, Upgrade und Raspi-Config erledigt)
    IP im Lan: RemotePi 192.168.0.28 (Raspberry2, alles an Update, Upgrade und Raspi-Config erledigt)

    Portfestlegung:
    40430 Tunnelport RemotePi zu GatewayPi
    40431 rdpx Port GatewayPi zu RemotePi (wird hier zu Port 3389)
    40432 motion/ip Cam Port GatewayPi zu RemotePi (wird hier zu Port 8082)
    40433 SSH Port GatewayPi zu RemotePi (wird hier zu Port 22)

    RemotePi: Zugang mit PuTTY /login: pi, password ...alles okay
    RemotePi: [pi@raspberrypi2plus cmd: sudo apt-get install xrdp ] ... Installation eines RDP Servers
    Test: Zugriff von PC Win7 mit RemoteDesktopVerbindung auf RemotePi (hier IP 192.168.0.55, Standardport 3389) - funktioniert einwandfrei -> Raspberry GUI

    RemotePi: [pi@raspberrypi2plus cmd: sudo apt-get install motion ]
    Installation und Konfiguration einer IP Cam Applikation mit USB Camera mit Zugang über Port 8082
    Test: Zugriff von PC Win7 mit Firefox auf RemotePi (hier http://192.168.0.55:8082) - funktioniert einwandfrei - Camerabild wird im Browser angezeigt

    GatwayPi: Zugang mit PuTTY /login: pi, password ...alles okay
    Erweiterung des SSH Port 22 mit Port 40430 laut ssh-portadresse-andern

    Neustart mit [pi@raspberrypi cmd: sudo reboot]

    GatwayPi: Zugang mit PuTTY über Port 40430 /login: pi, password ...alles okay

    Einrichten eines SSH Reverse Tunnels im RemotePi [pi@raspberrypi2plus cmd: ssh -p40430 -fN -R 40433:localhost:22 pi@192.168.0.28 ]
    pi@192.168.0.28's password: ...Eingabe des PW ...alles okay (Verbindung steht)

    GatewayPi: [pi@raspberrypi cmd: ssh -p 40433 localhost ]
    pi@localhost#s password: ...Eingabe des PW

    Übergabe des Terminalfenster von RemotePi an GatewayPi --->

    Linux raspberrypi2plus 3.12.28+ #709 PREEMPT Mon Sep 8 15:28:00 BST 2014 armv6l

    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.

    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.
    pi@raspberrypi2plus ~ $ ....

    1) Versuch die Camerafunktion von RemotePi durch Tunnel anzusprechen

    RemotePi: [pi@raspberrypi2plus cmd: ssh -p40430 -fN -R 40432:localhost:8082 pi@192.168.0.28 ]
    pi@192.168.0.28's password: ...Eingabe des PW ...alles okay (Verbindung steht)
    Test: Zugriff von PC Win7 mit Firefox auf GatewayPi (hier http://192.168.0.28:40432) --> KEINE ANTWORT

    Test: DIREKTER Zugriff von PC Win7 mit Firefox auf RemotePi (hier http://192.168.0.55:8082) - funktioniert einwandfrei

    2) Versuch RemoteDesktopverbindung von PC(Win7) auf RemotePi durch Tunnel

    RemotePi: [pi@raspberrypi2plus cmd: ssh -p40430 -fN -R 40431:localhost:3389 pi@192.168.0.28 ]
    pi@192.168.0.28's password: ...Eingabe des PW ...alles okay (Verbindung steht)
    Test: Zugriff von PC Win7 mit RemoteDesktopverbindung auf GatewayPi (hier Computer 192.168.0.28:40431) --> KEINE VERBINDUNG ERREICHBAR

    Test: DIREKTER Zugriff von PC Win7 mit RemoteDesktopverbindung auf RemotePi (hier Computer 192.168.0.55:3389) --> funktioniert einwandfrei -> Raspberry GUI

    Muss ich im GatewayPi zusätzlich etwas oder anders einstellen? oder wo könnte der Fehler liegen?
    Wer hätte eine Idee?
    Danke!

    Hannes

  7. "FEHLER: Bei deinem Kommentar scheint es sich um Spam zu handeln. Spam können wir hier überhaupt nicht leiden.
    Bitte gehe nochmal zurück und versuche, etwas Sinnvolles zu sagen."

    Sorry, nachdem mein Komentar als SPAM erkannt wurde, aber mit Sicherheit kein unerwünschter Inhalt ist habe ich meine Anfrage in eine einfache Webseite eingetragen - ich bitte um Beachtung, Danke!

    Meine Anfrage/Kommentar

    1. Hallo Hannes,
      tut mir leid, dass dein Post nicht durchgegangen ist. Ich werde mal bei den Leuten von WP-Spamshield nachfragen, warum da ein False Positive aufgetreten ist. Möglicherweise liegt es an den vielen bash Befehlen? Mal sehen.
      Dein Thema klingt recht kompliziert. Da muss ich etwas hirnen.
      Mit rdpx hab' ich auch noch nicht gearbeitet.
      Ich hoffe, dass ich mir das dieses Wochenende etwas genauer ansehen kann. Bin aber auch nur Hobbyist und war so stolz auf meine Lösung (nach mehrmonatigem Probieren), dass ich den Post geschrieben habe, um Anderen mit einem ähnlichen Problem etwas Arbeit abzunehmen.
      Gruß
      Chris

    2. Hi,
      ich habe deinen Post von der Website kopiert und versuchshalber noch einmal gepostet. Kam durch ohne Probs.
      WP Spam Shield prüft, ob der User Javascript und Cookies aktiviert hat. Da dein zweiter Post ja durchgegangen ist, hattest du beides wohl aktiviert. Zusätzlich macht WP Spam Shield noch ein paar Berechnungen in Bezug auf die IP Adresse. Vielleicht lags ja daran.
      Vielleicht magst du mir deinen ersten Post nochmal eintragen. Ich schalte den Debugger aktiv, vllt. findet sich ja was.
      Gruß
      Chris

  8. Dein Gedankengang ist fast richtig. Der Superuser darf alles.

    Allerdings ist das hier nicht ganz Zielführend. Du willst dein Script nicht als Superuser starten, was du implizit durch das sudo sagst. Allerdings darf über Crontab jeder Benutzer EIGENE Cronjobs anlegen. Wenn du nun das sudo weglässt legst du einen cron für den User Pi an.

    sudo Crontab entspricht in etwa dem dass du dich als root anmeldest und Crontab ausführst. Es kommt immer auf die Prozesse an die gestartet werden sollen, und mit welchen rechten diese laufen sollen. Hier kann das sudo unter Umständen zu einem Sicherheitsproblem werden, da die gestarteten Scripte mit ROOT-Rechten gestartet werden.

    Gruß,
    Bastian

    1. Hallo Bastian,
      zunächst einmal vielen Dank für den ersten "richtigen" Komentar in meinem Blog!
      Bisher dachte ich, dass der Superuser alles darf, d.h. auch den eigentlich den "Pi" gehörenden Tunnel aufbauen. Bei meinen anderen Raspis geht das ja auch genau so - sudo crontab -e
      Mein Workaround ist momentan genau der, dass ich den Tunnel über die crontab des Users "Pi" aufbauen lasse.
      Danke jedenfalls. Ich komm schon noch drauf.
      Grüße
      Chris

Schreibe einen Kommentar

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