Permanente Hintergrund-SSH-Verbindung zum Erstellen eines Reverse-Tunnels: Was ist der richtige Weg?

41

Verwandte Frage: Initiieren Sie eine SSH-Verbindung vom Server zum Client

Antwort von dort hat mir sehr geholfen, dieser Befehl macht was ich brauche:

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP

Also habe ich das Skript geschrieben, um die Verbindung immer wieder herzustellen:

 #!/bin/bash

 while true; do
    echo "try to connect..."
    ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
    echo "restarting in 5 seconds.."
    sleep 5
 done

Und fügte es dem /etc/crontab. Aber ich habe herausgefunden, dass das funktioniert, wenn ich es nur "von Hand" aus der Shell heraus ausführe, aber wenn es von cron aufgerufen wird, verbindet sich ssh und beendet sich sofort. (Das obige Skript verbindet sich also immer wieder)

Von man ssh, fand ich, dass für Hintergrundverbindungen ich es mit -nSchlüssel nennen sollte , aber es half nicht. Dann habe ich mich nur nach ähnlichen Skripten tail -f somethingumgesehen und festgestellt, dass es funktioniert, wenn ich einen "nie endenden" Befehl aufrufe. Deshalb habe ich gerade eine leere Datei erstellt /tmp/dummy_fileund jetzt sieht mein ssh-Befehl folgendermaßen aus:

ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file

Es funktioniert jetzt! Aber diese Lösung scheint ein bisschen hässlich zu sein, und ich verstehe die tatsächlichen Gründe für dieses Verhalten nicht wirklich. Ich habe nur zufällig versucht, bashanstelle von anzurufen tail -f( bashscheint mir auch ein "nie endender" Befehl zu sein), aber es funktioniert nicht.

Könnte jemand dieses Verhalten erklären und wie kann man eine Hintergrund-SSH-Verbindung herstellen, um den Reverse-SSH-Tunnel aufrechtzuerhalten?

Dmitry Frank
quelle
Was ist mit der Verwendung &am Ende Ihres SSH-Befehls:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
Networker
Aber dann whileläuft meine Schleife immer wieder und startet sshalle 5 Sekunden eine neue Hintergrundverbindung , oder? Das brauche ich nicht.
Dmitry Frank

Antworten:

37

Es hört sich so an, als ob Sie die -NOption ssh möchten .

 -N      Do not execute a remote command.  This is useful for just forwarding ports
         (protocol version 2 only).
Patrick
quelle
16

Ich würde Ihnen dringend empfehlen, darüber nachzudenken autossh. Es verfügt über bestimmte Heuristiken, die es ermöglichen, festzustellen, ob der Verbindungsverlust der zugrunde liegende Grund ist, und die Häufigkeit von Wiederverbindungsversuchen zu verringern. Darüber hinaus überwacht es die Verbindung mit zusätzlichen Tunneln, was es für Szenarien wie die, nach denen Sie fragen, äußerst nützlich macht.

Wenn Sie beispielsweise mit Ubuntu arbeiten, können Sie eine Websuche durchführen autossh upstart, um einige nützliche Beispiele für die Konfiguration von Ubuntu zu finden, damit der Tunnel dauerhaft aufrechterhalten wird.

Ich verwende dies, um eine getunnelte Verbindung zu meinem Server für bestimmte Dienste jederzeit offen zu halten.

0xC0000022L
quelle
Ich habe tatsächlich versucht autossh, diesen Artikel zu lesen: goo.gl/jVuuSR , aber es hat nur bei mir funktioniert, wenn ich beim Systemstart sofort eine Internetverbindung habe. Aber wenn die Verbindung später hergestellt wird, hat es nicht funktioniert. Nicht sicher, vielleicht habe ich etwas falsch, aber selbst in diesem Artikel Autor hat sleep 10in seinem /etc/rc.local, um sicher zu sein , Internet - Verbindung ist bereits fertig , wenn autossh genannt wird.
Dmitry Frank
2
@DmitryFrank: irgendwie unfair, das in deiner Frage nicht zu erwähnen, wenn du es versucht hast. Ich kann es immer noch empfehlen. Mit upstartund anderen Init-Ersetzungen können Sie den Start des Tunnels an ein oder mehrere Netzwerkgeräte binden, die in Betrieb sind. Die beste der Lösungen (IMO) im Web ist die folgende: erik.torgesta.com/tag/ssh-upstart ... und sleep 10in einigen Randfällen hilft nichts .
0xC0000022L
Es tut mir leid, dass ich das nicht erwähnt habe, um ehrlich zu sein, als es bei mir nicht funktionierte, habe ich mich dazu entschlossen, dies nur "von Hand" zu tun und habe das Autossh komplett vergessen. Danke ssh-upstart, ich werde es mir ansehen!
Dmitry Frank
spät zur party aber ich wollte hinzufügen ich konnte nicht zuverlässig autossh bekommen um einen reverse tunnel zu unterhalten. Wenn der Rückwärts-Tunnel aus irgendeinem Grund ausfiel, bemerkte autossh die Verbindung nicht und stellte sie nicht wieder her. Ich brauche mehrere Tunnel von mehreren Servern und das erschwert die Sache
DeveloperChris
@DeveloperChris: Nun, ich führe genau dieses Szenario aus - und das zuverlässig. Sofern der Remote-Server nicht buchstäblich ausfällt und Sie ihn wieder einschalten müssen, wird der Tunnel immer neu aufgebaut. Vielleicht sollten Sie Ihre eigene Frage schreiben und Details angeben. Natürlich kann das gemacht werden. Ich habe dies verwendet, um VPN-Probleme für Monate zu umgehen.
0xC0000022L
9

Ich werde @ 0xC0000022Ls Vorschlag unterstützen und auch verwenden autossh. Ich verwende es, um eine SSH-Verbindung von meinem Laptop aus aufrechtzuerhalten, während ich sie von Ort zu Ort bringe und sie funktioniert einfach. Ich benutze diese Verbindung, um die Ports 25 und 2143 für den Zugriff auf meine persönlichen SMTP- und IMAP-Server zu tunneln.

Hier ist das Skript, das ich benutze:

$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash

autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o

Ich pflege dann einen HostEintrag in meiner $HOME/.ssh/configDatei für den Host imap-o.

$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes

GatewayPorts yes

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa

Host imap-o
    User sam
    ProxyCommand ssh [email protected] nc `echo %h|sed 's/-o//'` %p

Das autossh_mail.shSkript wird als Teil meines Desktops ausgeführt, wenn ich mich anmelde. Sie können über darauf zugreifen gnome-session-properties.

       ss # 1

                                          ss # 2

slm
quelle