Comment puis-je empêcher mes sessions SSH de geler?


66

J'ai ServerAliveIntervalet dans le cas de quelques machines également ClientAliveIntervaldéfini à 540 dans les fichiers de configuration client / serveur SSH (je suppose que le réglage sur plus que ce ne serait pas une bonne idée). Je travaille avec de nombreuses sessions SSH qui gèlent actuellement après quelques minutes.

Comment puis-je le réparer? Ce que je veux, c'est qu'une session ne soit pas du tout gelée. Ainsi, si j'ouvre une session à 8 heures et que je ne l'utilise pas pendant 4 heures, par exemple, je l'utilise encore à 12 heures sans devoir me reconnecter. .


Combien de temps pouvez-vous rester connecté (en supposant que cela ne soit pas dû à une déconnexion du réseau)? TCPKeepAlive yes?
iyrin

Je ne suis pas sûr mais 10 min. au plus. Quant à TCPKeepAlive yes- dépend de la machine.
syntagma

11
Il suffit d'utiliser mosh ?
Vi.

1
Ou vous pouvez utiliser autossh...
ThoriumBR

Je dirais que laisser une connexion ouverte pendant 4 heures est un problème de sécurité, et vous devriez plutôt l'utiliser screen. Mais je vote toujours votre question parce que je rencontre le même problème après seulement une minute ou deux.
Dale Anderson

Réponses:


80

Les modifications que vous avez apportées dans /etc/ssh/ssh_configet /etc/ssh/sshd_configsont corrects , mais ne toujours pas avoir d'effet.

Pour que votre configuration fonctionne, apportez ces modifications de configuration sur le client:

/etc/ssh/ssh_config

Host *
ServerAliveInterval 100

ServerAliveInterval Le client enverra un paquet nul au serveur toutes les 100 secondes pour maintenir la connexion active.

Le paquet NULL est envoyé par le serveur au client. Le même paquet est envoyé par le client au serveur. Un paquet TCP NULL ne contient pas d'indicateur de contrôle tel que SYN, ACK, FIN, etc., car le serveur n'exige pas de réponse du client. Le paquet NULL est décrit ici: https://tools.ietf.org/html/rfc6592

Ensuite, configurez la partie sshd sur le serveur.

/etc/ssh/sshd_config

ClientAliveInterval 60
TCPKeepAlive yes
ClientAliveCountMax 10000

ClientAliveInterval Le serveur attend 60 secondes avant d'envoyer un paquet nul au client pour maintenir la connexion active.

TCPKeepAlive Est-il prévu de s'assurer que certains pare-feu ne perdent pas les connexions inactives.

ClientAliveCountMax Server enverra des messages actifs au client même s'il n'a reçu aucun message du client.

Enfin redémarrer le ssh server

service ssh restart ou service sshd restartselon le système sur lequel vous vous trouvez.


Je pense qu’un niveau élevé ServerAliveCountMaxest également nécessaire pour que cela soit aussi fiable que possible. Et si les deux ServerAliveIntervalet ClientAliveIntervalsont suffisamment bas, que je ne pense pas qu'il y aura besoin pour TCPKeepAlive. En outre, s’il existe des boîtes de médiation, elles peuvent toujours perdre leur statut même si tous les paramètres mentionnés précédemment sont configurés avec la plus grande exactitude. Il peut être utile d’utiliser MPTCP (si le client et le serveur le prennent en charge).
Kasperd

Au début, il n’est pas clair si vous voulez parler de config côté client ou côté serveur (je conclus finalement, côté client). Ensuite, dans la description ServerAliveInterval , vous dites "le client enverra ... au serveur", mais dans le paragraphe suivant, "le paquet NULL est envoyé par le serveur au client". Je trouve cela un peu déroutant.
Craig McQueen

1
Après avoir ajouté au serveur, je reçois: / etc / ssh / ssh_config: ligne 57: option de configuration incorrecte: clientaliveinterval / etc / ssh / ssh_config: ligne 59: option de configuration incorrecte: clientalivecountmax
Anders

2
@Anders Vous obtenez l'erreur parce que ClientAliveIntervalet ClientAliveCountMaxsont des options de serveur ssh, donc destinées à sshd_configet nonssh_config
Valentin Bajrami

1
@chandresh vous ne devez pas. Après avoir modifié ssh_configles nouvelles sessions, ce fichier sera lu. Le /etc/environmentfichier est une chose différente qui a le format VAR="value" sans espaces VAR = "value"serait donc invalide. Sourcing de /etc/ssh/ssh_configcette façon, c’est-à-dire: Port 22ou Host * qui les traitera comme des commandes
Valentin Bajrami

13

Suggestion personnelle: utiliser screensur l’hôte distant; il réussira à garder votre connexion active aussi longtemps qu'elle restera active dans un terminal.

Voici ce que j'ajoute généralement à /etc/screenrcl'identification rapide de mes sessions d'écran:

hardstatus alwayslastline
hardstatus string "%{= kG}[ %{G}%H %{g}][ %{=kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B}%Y-%m-%d %{W}%c %{g}]"
defscrollback 8192

EDIT: Conseils.

La hardstatuschaîne affichera une ligne d'état inférieure telle que celle-ci: Exemple de session d'écran avec trois onglets ouverts

La mémoire tampon de défilement est également étendue à 8192 lignes au lieu des 1000 à 1500 habituelles (en fonction de la distribution).


Merci, deux questions: 1. Pouvez-vous expliquer les options dans votre screenrcfichier? Comment configurer le système l’écran de lancement / tmux juste après ma connexion?
syntagma

8
Juste pour clarifier, screenne garde pas votre connexion ssh en vie. Il exécute les processus dans un terminal virtuel indépendant du terminal utilisateur sshauquel vous vous connectez, afin que le processus ne repose pas sur votre connexion. Vous perdrez toujours votre sshconnexion jusqu'à ce qu'elle soit résolue.
iyrin

1
Par " garder la connexion en vie ", je veux dire essentiellement " empêche la connexion de tourner au ralenti ", ce qui a le même résultat. S'il n'y a aucune entrée pendant 4 heures, SSH va rester inactif et, éventuellement, fermer la connexion, tous les processus enfants ayant également disparu.

2
Autant que j'ai aimé screen, je conseille aux nouveaux utilisateurs de commencer tmux.
dotancohen

2

Avec OpenSSH:

Vous devez activer

TCPKeepAlive yes

à la fois dans votre client ssh_config (par exemple /etc/ssh/ssh_configou dans ~/.ssh/config) et votre serveur SSH de destination exécutant OpenSSH (par exemple, / etc / ssh / sshd_config).

Donc chaque fois que votre connexion est inactive, OpenSSH envoie un paquet factice à votre hôte de destination ...


Cela peut également entraîner une The default is ''yes'' (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. ...this means that connections will die if the route is down temporarily, and some people find it annoying. déconnexion de
iyrin

Honnêtement, mais ce "[…] network goes down […] client host crashes […] route is down […]"sont des erreurs graves, aucune configuration SSH ne peut intercepter. Le problème principal ici concerne les sessions SSH inactives, pas les pannes de réseau. Par conséquent, pour résumer: - activez TCPKeepAlive yesà la fois le serveur et le client. - mis ClientAliveInterval sur le serveur - mis IdleTimeoutsur le serveur - mis ClientAliveCountMax Cela devrait faire l'affaire ...
Martin Allert

2

Si le problème est lié à un ordinateur portable en veille prolongée ou à une connexion réseau inférieure au préfet, je vous recommanderais d'utiliser celle moshqui fonctionne sshet qui permet la reconnexion automatique.

Sur le site :

Mosh (shell mobile)

Application de terminal à distance qui permet l'itinérance, prend en charge la connectivité intermittente et fournit une modification intelligente de l'écho local et de la ligne des touches des utilisateurs

Mosh remplace SSH. Il est plus robuste et réactif, en particulier via les liaisons Wi-Fi, cellulaires et longue distance.

Mosh est un logiciel gratuit, disponible pour GNU / Linux, BSD, macOS, Solaris, Android, Chrome et iOS.

En combinaison avec tmux(ou les anciens screen), cela me permet de me connecter via sshun serveur à partir de mon ordinateur portable et de rester connecté pendant des jours, même lors de la modification de connexions Wi-Fi et des pertes de données sur les mobiles.


Voici un lien vers mosh.org et vers mosh sur Github
joeytwiddle

1

Vérifiez votre configuration sshd sur la machine hôte /etc/sshd_configpour le IdleTimeoutparamètre .

IdleTimeout time
Sets idle timeout limit to time in seconds (s or nothing afternumber), 
in minutes (m), in hours (h), in days (d), or in weeks (w).If the 
connection have been idle (all channels) for that long time thechild 
process is killed with SIGHUP, and connection is closed down.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.