web-dev-qa-db-fra.com

Connexion ssh en arrière-plan permanente pour créer un tunnel inverse: quelle est la bonne façon?

Question connexe: initier la connexion ssh du serveur au client

La réponse à partir de là m'a beaucoup aidé, cette commande fait ce dont j'ai besoin:

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP

J'ai donc écrit le script pour me reconnecter tout le temps:

 #!/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

Et l'a ajouté au /etc/crontab. Mais j'ai découvert que cela fonctionne si seulement je l'exécute "à la main" à partir de Shell, mais s'il est appelé par cron, ssh se connecte et se termine immédiatement. (donc, le script ci-dessus se reconnecte tout le temps)

De man ssh, J'ai trouvé que pour les connexions en arrière-plan, je devrais l'appeler avec -n clé, mais cela n'a pas aidé. Ensuite, j'ai simplement cherché des scripts similaires et j'ai constaté que cela fonctionne si j'appelle tail -f something, c'est-à-dire une commande "sans fin", donc je viens de créer un fichier vide /tmp/dummy_file et maintenant ma commande ssh ressemble à ceci:

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

Ça fonctionne maintenant! Mais, cette solution semble un peu moche, et je ne comprends pas vraiment les raisons réelles de ce comportement. Par hasard, j'ai essayé d'appeler bash au lieu de tail -f (bash me semble aussi une commande "sans fin"), mais cela ne fonctionne pas.

Alors, quelqu'un pourrait-il expliquer ce comportement, et quelle est la bonne façon de créer une connexion ssh en arrière-plan pour garder le tunnel ssh inverse en place?

42
Dmitry Frank

Il semble que vous souhaitiez que le -N option pour ssh.

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

Je vous suggère fortement de considérer autossh . Il possède certaines heuristiques qui lui permettront de déterminer si la perte de connexion est la raison sous-jacente et réduira la fréquence des tentatives de reconnexion. De plus, il surveille la connexion à l'aide de tunnels supplémentaires, ce qui le rend très utile pour des scénarios comme celui que vous demandez.

Si vous utilisez Ubuntu, par exemple, vous pouvez effectuer une recherche sur le Web pour autossh upstart pour trouver des exemples utiles sur la façon de configurer Ubuntu pour que le tunnel soit maintenu de manière persistante.

J'utilise ceci pour garder une connexion tunnel ouverte sur mon serveur à tout moment pour certains services.

16
0xC0000022L

Je seconde suggestion de @ 0xC0000022L et j'utilise également autossh. Je l'utilise pour maintenir une connexion SSH à partir de mon ordinateur portable car je la prends d'un endroit à l'autre et cela fonctionne simplement. J'utilise cette connexion pour tunneler les ports 25 et 2143 pour accéder à mes serveurs SMTP et IMAP personnels.

Voici le script que j'utilise:

$ 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

Je conserve ensuite une entrée Host dans mon $HOME/.ssh/config fichier pour l'hôte 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

Le autossh_mail.sh le script est exécuté sur mon bureau lorsque je me connecte. Vous pouvez y accéder via gnome-session-properties.

ss #1

ss #2

9
slm