Avec certains serveurs, il arrive parfois de subir des déconnexions intempestives après une période d'inactivité plus ou moins longue. Vous ouvrez la connexion SSH, vous l'utilisez un peu, vous faites autre chose pendant un certain temps en laissant votre connexion ouverte, puis, quand vous revenez, vous constatez que la connexion SSH s'est interrompue.
En fait, le plus souvent, il ne s'agit pas d'un problème au niveau du serveur SSH, ni même du réseau de votre fournisseur d'accès Internet. Dans la plupart des cas, la connexion inactive est interrompue par les routeurs NAT (comme votre box Internet par exemple).
En effet, SSH utilise une connexion TCP, et les routeurs NAT conservent une table des connexions TCP actives, et suppriment de cette table les connexions inactives depuis trop longtemps pour faire un peu de ménage, ce qui provoque la déconnexion.
Pour contourner ce problème, il faut faire en sorte que des données (quelques octets suffisent) transitent de manière régulière sur la connexion, même lorsque vous ne tapez rien au clavier ou qu'il ne doit rien être affiché. Les routeurs NAT percevront ainsi la connexion comme étant active, et la conserveront dans leurs tables. La bonne nouvelle, c'est que cette solution est très simple à mettre en place, que ce soit sur Windows avec PuTTY ou sur Linux avec le client SSH de base.
Sur Windows (PuTTY)
Avec PuTTY, dans les propriétés de la session, rendez-vous dans la catégorie Connection, pour définir l'option Seconds between keepalives à une valeur différente de zéro, mais inférieure au délai en secondes au bout duquel vous avez constaté que la connexion inactive était coupée.
Cliquez ensuite sur Open pour ouvrir la connexion ou retournez à l'écran principal pour enregistrer ces paramètres dans votre session.
Sur Linux
Sur Linux, il y a plusieurs possibilités selon ce que vous souhaitez faire précisément. Si vous êtes administrateur de la machine cliente (root) et que vous souhaitez corriger ce problème pour tous les utilisateurs, il faut éditer le fichier /etc/ssh/ssh_config. Si vous préférez appliquer les réglages que pour vous, éditez le fichier ~/.ssh/config (créez-le s'il n'existe pas). Dans les deux cas, voici ce qu'il faut mettre :
Host * ServerAliveInterval 60 ServerAliveCountMax 2 |
L'option ServerAliveInterval 60 signifie que des données seront envoyées toutes les 60 secondes pour demander au serveur de confirmer que la connexion est toujours ouverte, et permet au passage de garder une connexion active au niveau des routeurs NAT.
L'option ServerAliveCountMax 2 indique au client SSH de considérer la connexion comme fermée si l'on ne reçoit pas de réponse après deux demandes de confirmation. Mais ici, ce n'est pas ce qui nous intéresse le plus.
Par ailleurs, si vous êtes administrateur du serveur SSH, vous pouvez également mettre la configuration suivante dans le fichier /etc/ssh/sshd_config pour corriger le problème pour tous les clients qui se connectent à ce serveur :
ClientAliveInterval 300 ClientAliveCountMax 2 |
Le principe reste le même que pour la configuration côté client, seul les noms des paramètres changent. Toutefois n'oubliez pas de redémarrer le service SSH pour que ces changements de configuration soient pris en compte (/etc/init.d/ssh restart par exemple).
Enfin, si vous ne souhaitez pas modifier votre configuration de manière persistante, vous pouvez utiliser une option de la ligne de commande du client SSH :
ssh -o "ServerAliveInterval 60" user@domain |
Merci ca m'a été très utile pour comprendre pourquoi ma connexion fail sur un gros script
Merci, je cherchais depuis un moment pourquoi les connexions ssh coupaient quand je me connectais depuis mon entreprise.
Les pare-feu c'est bien mais c'est parfois un peu trop zélé .
Salut et merci !
tu as une coquille :
(pour linux)
Bien vu, merci, c'est corrigé