autossh ne tue pas ssh lors de la liaison

10

J'ai commencé mon autossh avec un temps de sondage de 30 s:

AUTOSSH_POLL=30 AUTOSSH_LOGLEVEL=7 autossh -M 0 -f -S none -f -N -L localhost:34567:localhost:6543 user1@server1

Et cela fonctionne bien:

Sep  5 12:26:44 serverA autossh[20935]: check on child 23084
Sep  5 12:26:44 serverA autossh[20935]: set alarm for 30 secs

Mais si je retire physiquement le câble réseau, ce qui signifie que le tunnel ne peut plus fonctionner, autossh ne tue pas le démon ssh. Pourquoi? Je comprends qu'autossh ne peut rien faire si le lien est en panne, mais à mon avis, il devrait essayer de faire ce qui suit:

  1. Vérifiez le processus ssh enfant ( check on child ...)
  2. Vérifiez l'extrémité distante !!! (une opération de type ping à travers le tunnel)
  3. Sachez que le tunnel est en panne
  4. Arrêtez le processus ssh
  5. Essayez de recréer le tunnel
  6. Sachez que cela ne fonctionne pas et configurez une minuterie (augmentant exponentiellement?) Pour vérifier à nouveau bientôt

C'est pourquoi j'exécute autossh: si quelque chose arrive au tunnel (que ce soit un problème logiciel ou matériel), il devrait essayer de le redémarrer. Au lieu de cela, il attend simplement la fin du processus ssh. Ne devrait-il pas essayer de le redémarrer, même s'il n'y a aucun espoir de rétablir la connexion?

Quel type de vérification fait l'autossh? Vérifiez simplement que le ssh est opérationnel? N'effectue-t-il aucune sorte de vérification à distance?

Éditer

Comme demandé, j'ajoute la partie pertinente de la configuration ssh:

# (see http://aaroncrane.co.uk/2008/04/ssh_faster)
# The ServerAliveInterval tells SSH to send a keepalive message every 60 seconds while the connection is open;
#   that both helps poor-quality NAT routers understand that the NAT table entry for your connection should
#   be kept alive, and helps SSH detect when there’s a network problem between the server and client.
ServerAliveInterval 60
# The ServerAliveCountMax says that after 60 consecutive unanswered keepalive messages, the connection should
#   be dropped. At that point, AutoSSH should try to invoke a fresh SSH client. You can tweak those
#   specific values if you want, but they seem to work well for me.
ServerAliveCountMax 60

TCPKeepAlive yes
dangonfast
la source
qu'en est-il d'essayer de réduire le délai d'attente?
Nikolaidis Fotis
Nous avons utilisé autossh pendant un certain temps, mais il était beaucoup trop peu fiable sur les connexions instables, en particulier lorsqu'il était combiné avec des transferts de port. Nous utilisons maintenant OpenVPN et nous en sommes très satisfaits.
Nils Toedtmann
@NikolaidisFotis: le délai d'attente est très bien. C'est ... expirer. Mais cela ne fait pas la bonne chose (à mon humble avis) à chaque fois que le délai d'attente entre en jeu, à savoir: vérifier l'extrémité distante !
dangonfast
@NilsToedtmann: merci, je vais essayer. Est-il facile à mettre en œuvre? Avez-vous un lien vers un bon guide pratique?
dangonfast
OpenVPN est assez simple, nous l'avons juste «installé et installé» et avons commencé avec les configurations par défaut pour le serveur ou le client, en utilisant les dev tundeux et en définissant remotela configuration du client. Le seul élément ennuyeux est de gérer les certificats. Nous utilisons l'autorité de certification «easy-rsa» fournie avec OpenVPN. Une fois que vous avez les certificats, le reste est facile.
Nils Toedtmann

Réponses:

11

Mais si je retire physiquement le câble réseau, ce qui signifie que le tunnel ne peut plus fonctionner, autossh ne tue pas le démon ssh. Pourquoi?

autossh s'exécute sur votre ordinateur client, il ne peut donc pas tuer directement le processus du démon ssh sur le serveur. Cependant, vous pouvez spécifier une valeur non nulle pour ClientAliveIntervalin /etc/ssh/sshd_configsur le serveur (voir man sshd_config) et redémarrer le service sshd sur le serveur pour appliquer la modification de configuration. Ensuite, en cas de déconnexion du réseau, le processus du démon ssh sera tué après ClientAliveInterval * ClientAliveCountMaxquelques secondes (mais pas par autossh).

Maintenant, si vous vouliez demander "Pourquoi l'autossh ne tue-t-il pas le processus client ssh?" , vous avez spécifié -M 0. À partir de la page de manuel autossh:

Setting the monitor port to 0 turns the monitoring function off, and autossh will only restart ssh upon ssh's exit.

Au lieu d'utiliser autossh pour surveiller la connexion, vous attendez que ssh se termine après un délai de ServerAliveCountInterval * ServerAliveCountMaxquelques secondes. Vous avez demandé 60 vérifications sur serveur avant la fermeture de ssh, avec un intervalle de 60 secondes séparant les vérifications consécutives, vous attendez donc une heure avant la fermeture de votre client ssh.

Vous pouvez également envisager d'utiliser l' ExitOnForwardFailureoption côté client (voir man ssh_config), afin que ssh se termine s'il ne peut pas établir de tunnel, puis autossh peut essayer de relancer ssh.

James W
la source
Merci, c'est logique. Je voulais en effet parler de "processus client", pas de processus serveur.
dangonfast
Et après avoir relu la page de manuel autossh, je me souviens maintenant pourquoi j'ai défini -M 0: il n'est pas facile d'utiliser un port de surveillance, et il est indirectement déconseillé: à bien des égards, cela peut être une meilleure solution que le port de surveillance
dangonfast