Comment fonctionne tcp-keepalive en ssh?

85

J'essaie de coder un script shell qui utilise une connexion ssh pour effectuer des "pulsations". Je souhaite mettre fin à la connexion côté client et côté serveur après un certain délai (une fois la connexion interrompue).

Ce que j'ai trouvé jusqu'à présent:

  • TCPKeepAlive oui / non pour ssh et sshd
  • ClientAliveCountMax pour sshd
  • ClientAliveInterval pour sshd
  • ServerAliveCountMax pour ssh
  • ServerAliveInterval pour ssh

Pour changer "ClientAliveCountMax", je devrais modifier sshd_config sur chaque ordinateur cible (cette option est désactivée par défaut).

Ma question est donc la suivante: puis-je également utiliser "TCPKeepAlive" (sans rien changer d'autre sur les machines source / cible)?

Le système d'exploitation cible est SLES11 SP2 - mais je ne pense pas que ce soit pertinent ici.

Nils
la source
Ces paramètres sont tous destinés aux situations dans lesquelles un pare-feu ou un périphérique intermédiaire le long de la connexion mettra fin à la connexion. Ces paramètres servent à envoyer des données périodiques pour maintenir la connexion en vie, ainsi qu’à l’arrêter lorsque X réponses sont en attente. Pouvez-vous donner un peu plus de détails sur ce que vous faites? Utilisez-vous l' ControlMasteroption et utilisez-vous des connexions esclaves?
Patrick
Je veux juste construire un moyen de déterminer si un autre nœud est "en panne" en utilisant plusieurs connexions ssh-network avec plusieurs lignes physiques. Je le fais en ouvrant simplement une session ssh (qui fait plus ou moins une boucle sans fin). Je veux que cette session se termine si les connexions sont rompues. Je me demande quel est l'intervalle / nombre pour TCPKeepalive.
Nils

Réponses:

104

Vous voudrez probablement utiliser les paramètres ServerAlive pour cela. Ils ne nécessitent aucune configuration sur le serveur et peuvent être définis sur la ligne de commande si vous le souhaitez.

ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST

Cela enverra un message ssh keepalive toutes les 5 secondes, et s'il est temps d'envoyer un autre keepalive, mais que la dernière réponse n'a pas été reçue, la connexion est interrompue.

La différence critique entre ServerAliveIntervalet TCPKeepAliveest la couche sur laquelle ils opèrent.

  • TCPKeepAliveopère sur la couche TCP. Il envoie un paquet TCP ACK vide. Les pare-feu peuvent être configurés pour ignorer ces paquets. Ainsi, si vous passez par un pare-feu qui supprime les connexions inactives, il se peut que ceux-ci ne maintiennent pas la connexion en vie.
  • ServerAliveIntervalopère sur la couche ssh. En fait, il enverra des données via ssh. Le paquet TCP contient donc des données cryptées et un pare-feu ne peut pas dire si c'est un paquet keepalive ou légitime, alors ils fonctionnent mieux.
Patrick
la source
1
Je pense que c'est la bonne direction. Les premiers tests ont montré que cela fonctionnerait - il mettrait fin à l'envoi et à la réception des sous-processus ssh / sshd au plus tard 5 secondes après la fin de la connexion. Je pense que TCPKeepalive utilise simplement les paramètres par défaut de la pile TCP - il est donc plus difficile à configurer aussi.
Nils
Cela résout également le problème des utilisateurs fantômes. Je crois que cela peut également être fait dans les paramètres PuTTY , en passant Seconds between keepalivesà 1800 sous Paramètres | Lien.
Bob Stein
7

L’ TCPKeepAliveoption est en réalité une méthode très différente pour maintenir les connexions vivantes des options de type ClientAlive ou ServerAlive.

Sont par page de manuel BSD SSH , nous pouvons lire que:

Les messages actifs du client sont envoyés via le canal crypté et ne seront donc pas spoofables. L'option TCP keepalive activée par TCPKeepAliveest spoofable. Le mécanisme client actif est utile lorsque le client ou le serveur dépendent du fait de savoir quand une connexion est devenue inactive.

Le TCPKeepAliveassurez - vous que le système doit envoyer des messages TCP keepalive de l'autre côté. L'option par défaut est toujours activée.

Si vous utilisez ClientAliveInterval, vous pouvez désactiver TCPKeepAlive. Cette option envoie un message via le canal chiffré pour demander une réponse du client (la valeur par défaut est 0, aucun message n’est donc envoyé au client) et ClientAliveCountMaxdéfinit le nombre de messages du client en cours avant que sshd ne le déconnecte, en mettant fin au session.

Kenorb
la source