web-dev-qa-db-fra.com

Quelles options `ServerAliveInterval` et` ClientAliveInterval` dans sshd_config font exactement?

J'ai trouvé cette question , mais je suis désolé de ne pas bien comprendre les paramètres des deux variables ServerAliveInterval et ClientAliveInterval mentionnées dans la réponse acceptée. Si mon serveur local arrive à expiration, dois-je définir cette valeur à zéro? Sera-t-il alors jamais expirer? Dois-je plutôt le régler à 300 secondes ou quelque chose?

Ma question est simplement: certaines de mes connexions expirent lorsque je suspends puis remets en veille mon ordinateur portable avec la réponse Write failed: Broken pipe et certains non. Comment puis-je configurer correctement un sshd local afin qu'il n'échoue pas avec un tube cassé?

177
M. Tibbits

ServerAliveInterval : nombre de secondes pendant lesquelles le client attendra avant d'envoyer un paquet nul au serveur (pour maintenir la connexion active) .

ClientAliveInterval : nombre de secondes pendant lesquelles le serveur attendra avant d'envoyer un paquet nul au client (pour maintenir la connexion active) .

La définition d'une valeur de 0 (la valeur par défaut) désactivera ces fonctionnalités afin que votre connexion puisse chuter si elle est inactive pendant trop longtemps.

ServerAliveInterval semble être la stratégie la plus courante pour maintenir une connexion en vie. Pour éviter le problème de pipe cassé, voici la configuration ssh que j'utilise dans mon fichier .ssh/config:

Host myhostshortcut
     HostName myhost.com
     User barthelemy
     ServerAliveInterval 60
     ServerAliveCountMax 10

Le paramètre ci-dessus fonctionnera de la manière suivante,

  1. Le client attendra inactif pendant 60 secondes (temps ServerAliveInterval) et enverra un "paquet nul sans opération" au serveur et attendra une réponse. Si aucune réponse ne vient, il continuera d'essayer le processus ci-dessus jusqu'à 10 fois (ServerAliveCountMax) (600 secondes). Si le serveur ne répond toujours pas, le client déconnecte la connexion ssh.

ClientAliveCountMax côté serveur peut également aider. Il s'agit de la limite de la durée pendant laquelle un client est autorisé à ne pas répondre avant d'être déconnecté. La valeur par défaut est 3, comme dans trois ClientAliveInterval.

227
Barthelemy

Ceci est expliqué dans sshd_config manuel (man sshd_config):

ClientAliveInterval

Définit un délai d'expiration en secondes après lequel si aucune donnée n'a été reçue du client, sshd enverra un message via le canal crypté pour demander une réponse au client. La valeur par défaut est 0, indiquant que ces messages ne seront pas envoyés au client. Cette option s'applique uniquement à la version 2 du protocole.

ClientAliveCountMax

La valeur par défaut est 3. Si ClientAliveInterval (voir ci-dessous) est défini sur 15 et que ClientAliveCountMax est laissé par défaut, les clients SSH qui ne répondent pas seront déconnectés après environ 45 secondes. Cette option s'applique uniquement à la version 2 du protocole.

Pour les options client, voir l'explication dans man ssh_config:

ServerAliveInterval

Définit un délai d'expiration en secondes après lequel si aucune donnée n'a été reçue du serveur, ssh enverra un message via le canal crypté pour demander une réponse du serveur. La valeur par défaut est 0, indiquant que ces messages ne seront pas envoyés au serveur. Cette option s'applique uniquement à la version 2 du protocole.

ServerAliveCountMax

La valeur par défaut est 3. Si, par exemple, ServerAliveInterval est défini sur 15 et ServerAliveCountMax est laissé par défaut, si le serveur ne répond plus, ssh se déconnectera après environ 45 secondes. Cette option s'applique uniquement à la version 2 du protocole.

D'après ce qui précède, 0 signifie qu'il est désactivé. Par conséquent, vous devez définir ces valeurs suffisamment haut pour éviter l'erreur Pipe cassée.

29
kenorb

La réponse de Barthelemy est cool mais ne va pas vraiment à la racine du problème. Vous suspendez votre machine et souhaitez que la session SSH soit toujours en vie lorsque vous démarrez votre ordinateur.

Il n'y a pas une telle configuration pour ssh qui maintienne la connexion en vie comme ça. SSH utilise TCP, pour commencer, vous avez besoin de la prise de contact à trois voies, puis restez en vie après un certain temps d'inactivité. Lorsque vous fermez/mettez en veille prolongée toutes vos connexions TCP sont fermées avec FIN. Aucun moyen de surmonter cela.

Pour une solution de contournement sale, vous pouvez utiliser VPS ou une autre boîte en ligne avec écran pour conserver la connexion. Mon conseil ne le fait pas pour des raisons de sécurité.

20
3h4x

Puisque vous ne pouvez pas garantir qu'une connexion SSH (étant TCP) restera active une fois qu'une extrémité cessera d'envoyer des ACK aux paquets reçus, j'utilise personnellement http://www.harding.motd.ca/autossh/ = pour redémarrer toutes mes connexions SSH presque dès que je suspends.

Étant donné que GNU Screen sera utilisé du côté serveur, le fait de le rattacher me ramène là où j'étais auparavant.

Vous pouvez l'écouter sur des ports supplémentaires afin qu'il vérifie continuellement que les connexions sont toujours actives, mais personnellement, je trouve que cela fonctionne assez bien avec celui désactivé et en s'appuyant simplement sur le propre ServerAliveInterval/ServerAliveCountMax de SSH.

Une autre option est http://mosh.mit.edu/ qui utilise UDP et se rétablit de manière transparente du manque de connectivité à long terme.

16
grifferz

Vous pouvez également exécuter des commandes avec Nohup si vous souhaitez qu'elles s'exécutent quelle que soit votre connexion SSH.

par exemple.

$ Nohup tar -xzf some_huge.tar.gz &

Le & n'est pas, je pense, nécessaire, mais c'est pratique car il fait tourner le processus en arrière-plan pour que vous puissiez faire d'autres choses.

J'utilise toujours Nohup pour tout processus qui prend un certain temps, de sorte que je n'ai pas à recommencer si je perds la connexion pour une raison quelconque - panne de courant (à mon emplacement distant, pas sur l'hôte évidemment), panne de réseau, peu importe.

5
Buttle Butkus

Mettez votre longue session de course à l'intérieur de l'écran Voir écran -h pour plus de détails

De cette façon, vous pouvez vous reconnecter à la machine en utilisant ssh et rattacher à la session écran

1
user180529