Connexion ssh en tâche de fond permanente pour créer un tunnel inverse: quelle est la bonne manière?


41

Question liée: établir une connexion ssh du serveur au client

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

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP

Alors j'ai écrit le script pour se 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 ajouté à la /etc/crontab. Mais j'ai découvert que ça marche si seulement je l'exécute "à la main" depuis shell, mais s'il s'appelle cron, ssh se connecte et se termine immédiatement. (le script ci-dessus se reconnecte tout le temps)

Depuis man ssh, j'ai trouvé que pour les connexions en arrière-plan, je devrais l'appeler avec une -nclé, mais cela n'a pas aidé. Ensuite, j’ai juste cherché des scripts similaires et j’ai trouvé que cela fonctionnait si j’appelais tail -f something, c’est-à-dire une commande "neverending", alors je viens de créer un fichier vide /tmp/dummy_fileet 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. Juste par hasard, j'ai essayé d'appeler bashau lieu de tail -f( bashil me semble que la commande "Neverending" aussi), mais ça ne marche pas.

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 conserver le tunnel SSH inversé?


que diriez-vous d'utiliser &à la fin de votre commande ssh:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
Networker

Mais alors ma whileboucle fonctionnera encore et encore, en commençant une nouvelle sshconnexion en arrière-plan toutes les 5 secondes, non? Ce n'est pas ce dont j'ai besoin.
Dmitry Frank

Réponses:


37

On dirait que vous voulez l' -Noption de ssh.

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

16

Je vous suggère fortement de considérer autossh. Il dispose de certaines méthodes heuristiques lui permettant de déterminer si la perte de connexion est la raison sous-jacente et d’abaisser la fréquence des tentatives de reconnexion. De plus, il surveille la connexion en utilisant des tunnels supplémentaires, ce qui le rend très utile pour des scénarios tels que celui sur lequel vous vous interrogez.

Si vous êtes sur Ubuntu, par exemple, vous pouvez effectuer une recherche Web pour autossh upstarttrouver des exemples utiles sur la façon de configurer Ubuntu afin 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.


J'ai effectivement essayé autossh, j'ai lu cet article: goo.gl/jVuuSR , mais cela ne fonctionnait que si j'ai une connexion Internet tout de suite au démarrage du système; mais si la connexion est établie plus tard, cela ne fonctionne pas. Je ne sais pas, peut - être je l' ai fait quelque chose de mal, mais même dans cet auteur de l' article a sleep 10dans son /etc/rc.local, afin d'être sûr connexion internet est déjà prêt quand autossh est appelé.
Dmitry Frank

2
@ DimitryFrank: un peu injuste de ne pas mentionner cela dans votre question, si vous avez essayé. Je le recommande toujours. Avec upstartet d'autres remplacements d'init, vous pouvez lier le démarrage du tunnel à un ou plusieurs périphériques réseau en activité. Le meilleur des solutions (IMO) sur le Web est celui-ci: erik.torgesta.com/tag/ssh-upstart ... et non, sleep 10cela ne changera rien dans certains cas.
0xC0000022L

Je suis désolée de ne pas avoir mentionné cela. Pour être honnête, quand cela n'a pas fonctionné pour moi, j'ai décidé de le faire simplement "à la main" et j'ai complètement oublié autossh. Merci pour ssh-upstart, je vais y jeter un coup d'oeil!
Dmitry Frank

tard dans la soirée, mais j’ai voulu ajouter que je ne pouvais pas obtenir d’autorisation fiable pour maintenir un tunnel inverse. si le tunnel inverse échouait pour une raison quelconque, autossh ne le remarquerait pas et ne reconstruirait pas la connexion. J'ai besoin de plusieurs tunnels provenant de plusieurs serveurs, ce qui complique les choses
DeveloperChris

@DeveloperChris: Eh bien, je lance exactement ce scénario - et de manière fiable. À moins que le serveur distant ne tombe littéralement en panne et que vous deviez le réactiver, le tunnel est toujours rétabli. Peut-être devriez-vous écrire votre propre question et fournir des détails. Cela peut certainement être fait. J'ai utilisé cela pour contourner les problèmes de VPN pendant des mois.
0xC0000022L

9

Je vais deuxième @ suggestion de 0xC0000022L et de l' utilisation autosshaussi bien. Je l'utilise pour maintenir une connexion SSH à partir de mon ordinateur portable lorsque je le prends d'un endroit à l'autre et cela fonctionne. J'utilise cette connexion pour faire tunneler les ports arrière 25 et 2143 pour accéder à mes serveurs personnels SMTP et IMAP.

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 maintiens ensuite une Hostentrée dans mon $HOME/.ssh/configfichier pour 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 sam@mygw.mydom.com nc `echo %h|sed 's/-o//'` %p

Le autossh_mail.shscript est exécuté dans le cadre de mon bureau lorsque je me connecte. Vous pouvez y accéder via gnome-session-properties.

       SS n ° 1

                                          SS n ° 2

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.