web-dev-qa-db-fra.com

Comment fonctionne tcp-keepalive dans ssh?

J'essaie de coder un script Shell qui utilise une connexion ssh pour faire des "battements de coeur". Je veux mettre fin au côté client et côté serveur de cette connexion après un certain délai d'expiration (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 le sshd_config sur chaque machine cible (cette option est désactivée par défaut).

Donc ma question est - puis-je aussi utiliser "TCPKeepAlive" à mes fins (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.

92
Nils

Vous souhaiterez probablement utiliser les paramètres de 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 vient le temps d'envoyer un autre keepalive, mais qu'une réponse à la dernière n'a pas été reçue, alors la connexion est interrompue.

La différence critique entre ServerAliveInterval et TCPKeepAlive est la couche sur laquelle ils opèrent.

  • TCPKeepAlive fonctionne sur la couche TCP. Il envoie un paquet ACK TCP ACK vide. Les pare-feu peuvent être configurés pour ignorer ces paquets, donc si vous passer par un pare-feu qui supprime les connexions inactives, celles-ci peuvent ne pas maintenir la connexion en vie.
  • ServerAliveInterval opère sur la couche ssh. Il enverra en fait des données via ssh, donc le paquet TCP contient des données chiffrées et un pare-feu ne peut pas dire si c'est un keepalive ou un paquet légitime, donc cela fonctionne mieux.
114
Patrick

L'option TCPKeepAlive est en fait une méthode très différente de maintenir les connexions actives à partir des options de type ClientAlive ou ServerAlive.

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

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

Les TCPKeepAlive vérifient si 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 enverra un message via le canal crypté pour demander une réponse au client (la valeur par défaut est 0, donc aucun message n'est envoyé au client) et ClientAliveCountMax définit le nombre de messages vivants du client avant que sshd ne se déconnecte le client, en mettant fin à la session.

7
kenorb