Wie bekomme ich einen persistenten Reverse-SSH-Tunnel mit Autossh?

6059
Cedric Martin

(Ich habe dies nur zu SO gefragt, wurde aber empfohlen, es hier mitzunehmen)

Es ist mir gelungen, einen Reverse-SSH-Tunnel zwischen einem Raspberry Pi 2 und einem Server von mir (Server mit statischer IP-Adresse) zu erstellen, und es funktioniert einwandfrei. Das Benutzerkonto, das ich auf dem Server verwende, heißt "ksproxy" (es ist nicht wirklich ein "Proxy", sondern was auch immer).

Jetzt versuche ich, autossh(aus dem Debian / Raspbian-Paket autossh) auch funktionieren zu lassen, aber es gelingt mir nicht. Ich kann nahe sein

(Ich habe die reale IP hier in dieser Frage geändert, 37.xxx.yyy.zzzum nicht die tatsächliche IP des Servers zu posten.)

Folgendes funktioniert gut: (kein autossh)

Auf der Rpi:

rspi@antlia:~ $ ssh -N -R 20000:localhost:22 ksproxy@37.xxx.yyy.zzz 

Auf dem Server (der mit der statischen IP):

ksproxy@37.xxx.yyy.zzz:~$ ssh rspi@localhost -t -p 20000 rspi@localhost's password: rspi@antlia:~ $ 

Also alles funktioniert gut: Ich gebe das Passwort ein und erhalte ein Terminal / Prompt.

Ich kann sogar von meinem Desktop aus auf den Raspberry Pi zugreifen (indem ich zuerst den Server durchläuft), und zwar:

ssh -t ksproxy@37.xxx.yyy.zzz "ssh rspi@localhost -p 20000" ksproxy@37.xxx.yyy.zzz password: rspi@localhost's password: ... rspi@antlia:~ 

Es fragt zuerst nach dem Passwort des Servers, dann nach dem Passwort von Pi und alles ist in Ordnung.

So weit, ist es gut.

Jetzt probiere ich das gleiche aber diesmal mit autossh:

rspi@antlia:~ $ autossh -M 20000 -N -i /home/rspi/.ssh/id_rsa ksproxy@37.xxx.yyy.zzz  ksproxy@37.xxx.yyy.zzz:~$ ssh rspi@localhost -p 20000 

Das "funktioniert", aber es bleibt einfach da und tut nichts.

Ich habe versucht, die Ausgabe der ssh-Befehle "-vvv" auszuführen, aber es zeigt nur, dass nichts passiert.

Wenn ich einen anderen Port versuche, schlägt das fehl:

ksproxy@37.xxx.yyy.zzz:~$ ssh rspi@localhost -p 1234 ssh: connect to host localhost port 1234: Connection refused 

Wenn ich den richtigen Port (20000) -tprobiere, diesmal aber mit dem param, dasselbe: "funktioniert" aber ich bekomme kein Terminal / Prompt.

Hier ist die -vvvAusgabe

ksproxy@37.xxx.yyy.zzz:~$ ssh -vvv rspi@localhost -t -p 20000 OpenSSH_6.7p1 Debian-5+deb8u1, OpenSSL 1.0.1k 8 Jan 2015 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 19: Applying options for * debug2: ssh_connect: needpriv 0 debug1: Connecting to localhost [127.0.0.1] port 20000. debug1: Connection established. debug1: key_load_public: No such file or directory debug1: identity file /home/ksproxy/.ssh/id_rsa type -1 debug1: key_load_public: No such file or directory debug1: identity file /home/ksproxy/.ssh/id_rsa-cert type -1 debug1: key_load_public: No such file or directory ... debug1: Enabling compatibility mode for protocol 2.0 debug1: Local version string SSH-2.0-OpenSSH_6.7p1 Debian-5+deb8u1 

Es fragt nicht nach einem Passwort, es zeigt kein Terminal / Prompt an.

Was verstehe ich hier nicht oder mache ich falsch?

Ich denke nicht, dass es sich um ein Firewall-Problem handelt, da die "non autossh" -Methode gut funktioniert (aber dann bekomme ich nicht die automatische "immer auf" / Wiederverbindungsfunktion). Ich möchte wirklich gerne Auto-Shash-Arbeit machen (ich weiß, ich könnte eine Problemumgehung finden, wie ein Crontab, der meinen manuellen SSH-Tunnel automatisch neu startet, aber das wäre wahrscheinlich spröder als Autowh-Arbeit).

2

1 Antwort auf die Frage

1
Kenster
$ autossh -M 20000 -N -i /home/rspi/.ssh/id_rsa ksproxy@37.xxx.yyy.zzz ... $ ssh rspi@localhost -p 20000 

In diesem Fall verwenden Sie nicht die -ROption ssh, um einen Reverse-Tunnel einzurichten. Sie geben -Mstattdessen die Autossh- Option an. Der Parameter autossh -M veranlasst autossh, auf diesem Port einen Tunnel einzurichten, der autossh für seine eigenen Zwecke verwendet (um regelmäßig zu testen, ob die SSH-Verbindung noch funktioniert). Es ist nicht das Äquivalent des Parameters ssh -R. Wenn Sie in diesem Szenario eine Verbindung zu Port 20000 herstellen, werden Sie an den privaten Verbindungstestport von autossh angeschlossen.

Sie sollten weiterhin den umgekehrten Tunnel angeben, den Sie mit der Option -R von ssh verwenden möchten. Wenn Sie die Echoport-Funktion von autossh verwenden möchten, sollten Sie diese Funktion auf einem anderen Port ausführen:

$ autossh -M 20002 -N -R 20000:localhost:22 ksproxy@37.xxx.yyy.zzz 
Vielen Dank, es hat geklappt, nachdem ich * "- R" * verwendet habe, um einen Reverse-Tunnel anzugeben. Ich bin mit SSH nicht sehr vertraut, habe es aber dank Ihrer Antwort so verstanden, dass ich es brauchte: Jetzt schreibe ich alles auf (und die Antwort ist hier auf SO sicher). Cedric Martin vor 8 Jahren 0