¿Cómo puedo evitar que mis sesiones de SSH se congelen?


66

Tengo, ServerAliveIntervaly en el caso de algunas máquinas, también ClientAliveIntervalconfigurado en 540 en archivos de configuración de cliente / servidor SSH (supongo que configurarlo en más de eso no sería una buena idea). Trabajo con muchas sesiones de SSH que actualmente se congelan después de unos minutos.

¿Cómo puedo arreglarlo? Lo que quiero es tener una sesión para no congelarse en absoluto, de modo que si abro una sesión a las 8 y no la uso durante 4 horas, por ejemplo, todavía la vuelvo a usar a las 12 sin tener que iniciar sesión nuevamente .


¿Cuánto tiempo puede permanecer conectado actualmente (suponiendo que esto no se deba a la desconexión de la red)? TCPKeepAlive yes?
iyrin

No estoy seguro pero 10 min. a lo sumo. En cuanto a TCPKeepAlive yes- depende de la máquina.
sintagma

11
¿Solo usa mosh ?
Vi.

1
O podría usar autossh...
ThoriumBR

Yo diría que dejar una conexión abierta durante 4 horas es un problema de seguridad, y deberías usarlo en su screenlugar. Pero todavía estoy votando su pregunta porque estoy experimentando el mismo problema después de solo un minuto o dos.
Dale Anderson el

Respuestas:


80

Los cambios que ha realizado /etc/ssh/ssh_configy /etc/ssh/sshd_configson correctos pero aún no tendrán ningún efecto.

Para que su configuración funcione, realice estos cambios de configuración en el cliente:

/etc/ssh/ssh_config

Host *
ServerAliveInterval 100

ServerAliveInterval El cliente enviará un paquete nulo al servidor cada 100 segundos para mantener viva la conexión

Paquete NULL Es enviado por el servidor al cliente. El cliente envía el mismo paquete al servidor. Un paquete TCP NULL no contiene ningún indicador de control como SYN, ACK, FIN, etc., porque el servidor no requiere una respuesta del cliente. El paquete NULL se describe aquí: https://tools.ietf.org/html/rfc6592

Luego configurando la parte sshd en el servidor.

/etc/ssh/sshd_config

ClientAliveInterval 60
TCPKeepAlive yes
ClientAliveCountMax 10000

ClientAliveInterval El servidor esperará 60 segundos antes de enviar un paquete nulo al cliente para mantener viva la conexión

TCPKeepAlive está ahí para garantizar que ciertos firewalls no eliminen las conexiones inactivas.

ClientAliveCountMax Server enviará mensajes vivos al cliente aunque no haya recibido ningún mensaje del cliente.

Finalmente reinicie el ssh server

service ssh restart o service sshd restartdependiendo del sistema en el que se encuentre.


Creo que ServerAliveCountMaxtambién se necesita un alto para que esto sea lo más confiable posible. Y si ambos ServerAliveIntervaly ClientAliveIntervalestán situados lo suficientemente baja, no creo que no habrá necesidad de TCPKeepAlive. Además, si hay middleboxes, aún pueden perder el estado incluso con todas las configuraciones mencionadas anteriormente configuradas exactamente correctas. Puede ser útil usar MPTCP (si el cliente y el servidor lo admiten).
Kasperd

Al principio no está claro si te refieres a la configuración en el lado del cliente o en el lado del servidor (eventualmente concluyo, del lado del cliente). Luego, en la descripción ServerAliveInterval , dice "el cliente enviará ... al servidor", pero en el siguiente párrafo " el servidor envía el paquete NULL al cliente". Encuentro esto un poco confuso.
Craig McQueen

1
Después de agregar al servidor obtengo: / etc / ssh / ssh_config: línea 57: opción de configuración incorrecta: clientaliveinterval / etc / ssh / ssh_config: línea 59: opción de configuración incorrecta: clientalivecountmax
Anders

2
@Anders Obtiene el error porque ClientAliveIntervaly ClientAliveCountMaxson opciones de servidor ssh, por lo tanto, para sshd_configy nossh_config
Valentin Bajrami

1
@chandresh no tienes que hacerlo. Después de modificar ssh_configlas nuevas sesiones leerá ese archivo. El /etc/environmentarchivo es una cosa diferente que tiene el formato de VAR="value" sin espacios, por VAR = "value"lo que no sería válido. Buscar de /etc/ssh/ssh_configesa manera, por ejemplo, leerá: Port 22o Host * lo que los tratará como comandos
Valentin Bajrami

13

Sugerencia personal: uso screenen el host remoto; logrará mantener viva su conexión mientras permanezca activa en una terminal.

Esto es lo que normalmente agrego /etc/screenrcpara una identificación rápida de mis sesiones de pantalla:

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

EDITAR: Sugerencias.

La hardstatuscadena mostrará una línea de estado inferior como esta: Ejemplo de sesión de pantalla con tres pestañas abiertas

El búfer de desplazamiento hacia atrás también se extiende a 8192 líneas en lugar de las habituales 1000-1500 (dependiendo de la distribución).


Gracias, dos preguntas: 1. ¿Puede explicar las opciones en su screenrcarchivo? ¿Cómo configuro el sistema la pantalla de inicio / tmux justo después de iniciar sesión?
sintagma

8
Solo para aclarar, screenno mantiene viva su conexión ssh. Ejecuta procesos en un terminal virtual independiente del terminal de usuario al que se conecta para sshque el proceso no dependa de su conexión. Aún perderá su sshconexión hasta que se resuelva.
Iyrin

1
Por " mantener la conexión viva " quiero decir esencialmente " evita que la conexión esté inactiva ", que tiene el mismo resultado. Si no hay entrada durante 4 horas, SSH se quedará inactivo y eventualmente cerrará la conexión, todos los procesos secundarios también desaparecerán.

2
Por mucho que me encantó screen, aconsejo a los nuevos usuarios para comenzar tmux.
dotancohen

2

Con OpenSSH:

Necesitas habilitar

TCPKeepAlive yes

tanto en su cliente ssh_config (p. ej. /etc/ssh/ssh_configo en ~/.ssh/config) como en su servidor SSH de destino que ejecuta OpenSSH (p. ej. / etc / ssh / sshd_config).

Entonces, cada vez que su conexión está inactiva, OpenSSH envía un paquete ficticio a su host de destino ...


Esto también puede hacer que la conexión se 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. corte linux.die.net/man/5/sshd_config
iyrin

Honestamente, pero "[…] network goes down […] client host crashes […] route is down […]"son errores graves que ninguna configuración SSH puede detectar. El problema principal aquí son las sesiones SSH inactivas, no las fallas de la red. Por lo tanto, para resumirlo: habilítelo TCPKeepAlive yestanto en el servidor como en el cliente. - establecido ClientAliveInterval en el servidor - establecido IdleTimeouten el servidor - establecido ClientAliveCountMax Eso debería ser el truco ...
Martin Allert

2

Si el problema es una computadora portátil hibernada o una conexión de red menos que perfecta, recomendaría usar la moshque se ejecuta sshy permite la reconexión automática.

Desde el sitio web :

Mosh (caparazón móvil)

Aplicación de terminal remota que permite la itinerancia, admite conectividad intermitente y proporciona eco local inteligente y edición de línea de pulsaciones de teclas del usuario.

Mosh es un reemplazo para SSH. Es más robusto y receptivo, especialmente a través de Wi-Fi, celulares y enlaces de larga distancia.

Mosh es un software gratuito, disponible para GNU / Linux, BSD, macOS, Solaris, Android, Chrome e iOS.

En combinación con tmux(o el anterior screen), esto me permite conectarme ssha un servidor desde mi computadora portátil y permanecer conectado durante días, incluso cuando cambie las conexiones wifi y sobreviva la pérdida de datos móviles.


Aquí hay un enlace a mosh.org y mosh en Github
joeytwiddle

1

Verifique la configuración de sshd en la máquina host /etc/sshd_configpara la IdleTimeoutconfiguración .

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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.