SSH : diminuer les deconnexions intempestives avec ServerAliveInterval

Vous arrive t-il souvent d’ouvrir une session ssh (par exemple sur le serveur ssh du mutualisé ovh, ou ailleurs…), de l’utiliser un peu, de faire autre chose en laissant tourner ssh, puis de constater que vous vous faites déconnecter dès que vous retourner sur votre session ssh inactive ?

Personnellement, ça m’est arrivé bien plus d’une fois… Si ça vous arrive aussi, rassurez-vous, c’est souvent simple à résoudre !

Qui est le fautif ?

Eh bien, la plupart du temps, cela ne vient pas de la machine sur laquelle vous êtes connecté en ssh… Pas forcément donc de l’accès ssh du mutualisé OVH donc, par exemple…

Ensuite, cela ne vient pas forcément de l’infrastructure interne de votre fournisseur d’accès Internet. Sauf à y inclure votre box configuré en routeur NAT…

Les routeurs NAT (box ou non) sont en effet une raison fréquente des coupures des connexions ssh en cas d’inactivité.

Pourquoi ? Tout simplement parce que ssh utilise le protocole TCP, qu’un routeur NAT maintient une table (limitée) des connexions TCP actives, et que pour conserver de la mémoire (et de l’efficacité), les connexions TCP inactives depuis trop longtemps sont coupées

La parade : faire transiter un minimum de données régulièrement à travers la connexion ssh

En fait, régler ce problème est assez simple : il suffit de s’assurer que des données (très peu) transitent assez régulièrement à travers la connexion ssh, même lorsque vous ne tapez rien au clavier et que rien de nouveau ne doit apparaître à l’écran.

Il s’agit donc de faire passer des données sans grande importance en elle-même, juste pour être sûr que la connexion TCP soit perçue comme active.

Et rassurez-vous, ça se fait de façon automatisée et surtout de façon assez simple !

Un petit tour dans le fichier de configuration du client ssh

Le client ssh en ligne de commande prend ses options de configuration à différents emplacements :

  1. Sur la ligne de commande (choix prioritaire) : avec la syntaxe -o option
  2. Dans le fichier de configuration personalisée de l’utilisateur (~/.ssh/config)
  3. Dans le ficheir de configuration globale du système (choix le moins prioritaire, dans le fichier /etc/ssh/ssh_config)

Personnellement, j’ai choisi de modifier ça dans le fichier ~/.ssh/config.

Le réglage s’applique pour toutes mes connexions ssh sortantes, ça se place donc dans la section (unique) repérée par Host *.

Les réglages choisis sont les suivants :


Host *
ServerAliveInterval 15
ServerAliveCountMax 20
# Sur les valeurs, ça se discute...

Qu’est ce que ça signifie ?

L’option ServerAliveInterval 15 signifie que des données sont transmises toutes les 15 secondes pour demander au serveur de confirmer que la connexion ssh est bien fonctionnelle. En plus de vérifier, cet échange de données permet surtout de maintenir la connexion active (effet collateral voulu).

Un réglage de 15 secondes ça veut dire très souvent : avec 30 ou même 60, j’aurais quand même eu l’effet recherché…

L’option ServerAliveCountMax 20 dit au client ssh d’attendre 20 non-réponses du serveur (20 * 15s = 300s = 5min) pour considérer de lui-même la connexion ssh comme étant morte. Tout simplement parce que mon but n’est pas que la connexion soit coupée plus vite en cas de soucis divers, mais tout simplement d’utiliser ServerAliveInterval pour maintenir la connexion active…

Au final mon fichier ~/.ssh/config ressemble un peu à ça :


Host *
ServerAliveInterval 15
ServerAliveCountMax 20
# (...)
# Autres réglages non précisés s'appliquant
# sur toutes les connexions de l'utilisateur ...

# Puis un réglage plus spécifique pour l'exemple...
Host exemple
Hostname 172.16.123.123
User david-exemple
Port 443
DynamicForward 3333
LocalForward 3336 calvino.freenode.net:6667
# (...) autres réglages de la section

# Puis d'autres section Host
# (...)

Ou un changement côté serveur…

Le même type de mécanisme pour garder une connexion active peut être initié par le serveur. Ça peut être intéressant si vous gérez un serveur et que vous n’êtes pas le seul à y accéder en ssh ;)

Cette fois ci on modifie /etc/ssh/sshd_config :


# (...)
# voir la page man de sshd_config ;)
# ne mettez ces valeurs dans le fichier
# que si vous comprenez comment ça marche
ClientAliveInterval 15
ClientAliveCountMax 20
# (...)

Attention : n’oubliez pas de redémarrer le daemon openssh sur le serveur. Par exemple avec /etc/init.d/ssh restart. Ne pas oublier cependant qu’un mauvais contenu du fichier de config peut avoir pour effet de rendre toute connexion impossible, agissez avec prudence !

Conclusion

Si vos connexions ssh inactives sont souvent victimes de déconnexions, essayez d’utiliser ServerAliveInterval dans votre fichier de configuration du client ssh, c’est simple et bien pratique…

NB :

  • Il peut y avoir aussi plein d’autres raisons de déconnexions de sessions SSH, “inactives” ou non… Je n’en ferais pas le tour des causes possibles…
  • Je m’intéresse ici au client ssh openssh en mode texte sous GNU/Linux : le procédé diffère un peu pour appliquer le réglage avec Putty sous MS Windows…

Adresse de l’original : http://www.daviddallet.com/weblog/posts/2010/04/25/ssh-diminuer-les-deconnexions-intempestives-avec-serveraliveinterval/
Article original écrit par David Dallet, sous licence libre CC-BY-SA France 2.0 – Pour copier cet article merci de conserver cette notice ainsi que le lien vers l’original. En cas de modification (ou de copie partielle), le lecteur doit être clairement informé.

Creative Commons License

SSH : diminuer les deconnexions intempestives avec ServerAliveInterval
(fr) Commenter cet article - Partager - Lire un autre article (Blog de David Dallet)
(en) Comment this post - Share It - Read another post on David Dallet's Weblog

Vus : 3231
Publié par Ddmdllt : 31