it-swarm-es.tech

¿Qué opciones hacen exactamente `ServerAliveInterval` y` ClientAliveInterval` en sshd_config?

Encontré esta pregunta , pero lo siento, no entiendo la configuración de las dos variables ServerAliveInterval y ClientAliveInterval mencionadas en la respuesta aceptada. Si mi servidor local está agotando el tiempo, ¿debo establecer este valor en cero? ¿Entonces nunca se agotará el tiempo? ¿Debería configurarlo en 300 segundos o algo así?

Mi pregunta es simplemente, algunas de mis conexiones se agotan cuando suspende y luego suspendo mi computadora portátil con la respuesta Write failed: Broken pipe y algunos no. ¿Cómo puedo configurar correctamente un sshd local para que no falle con una tubería rota?

177
M. Tibbits

ServerAliveInterval : número de segundos que el cliente esperará antes de enviar un paquete nulo al servidor (para mantener viva la conexión) .

ClientAliveInterval : número de segundos que el servidor esperará antes de enviar un paquete nulo al cliente (para mantener viva la conexión) .

Establecer un valor de 0 (el valor predeterminado) deshabilitará estas funciones, por lo que su conexión podría caerse si está inactiva durante demasiado tiempo.

ServerAliveInterval parece ser la estrategia más común para mantener viva una conexión. Para evitar el problema de la tubería rota, aquí está la configuración ssh que uso en mi archivo .ssh/config:

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

La configuración anterior funcionará de la siguiente manera,

  1. El cliente esperará inactivo durante 60 segundos (tiempo ServerAliveInterval) y enviará un "paquete nulo no operativo" al servidor y esperará una respuesta. Si no recibe respuesta, seguirá intentando el proceso anterior hasta 10 (ServerAliveCountMax) veces (600 segundos). Si el servidor aún no responde, el cliente desconecta la conexión ssh.

ClientAliveCountMax en el lado del servidor también podría ayudar. Este es el límite de cuánto tiempo se permite que un cliente no responda antes de desconectarse. El valor predeterminado es 3, como en tres ClientAliveInterval.

227
Barthelemy

Esto se explica en sshd_config manual (man sshd_config):

ClientAliveInterval

Establece un intervalo de tiempo de espera en segundos después del cual, si no se han recibido datos del cliente, sshd enviará un mensaje a través del canal encriptado para solicitar una respuesta del cliente. El valor predeterminado es 0, lo que indica que estos mensajes no se enviarán al cliente. Esta opción solo se aplica a la versión 2 del protocolo.

ClientAliveCountMax

El valor predeterminado es 3. Si ClientAliveInterval (ver más abajo) se establece en 15, y ClientAliveCountMax se deja en el valor predeterminado, los clientes SSH que no respondan se desconectarán después de aproximadamente 45 segundos. Esta opción solo se aplica a la versión 2 del protocolo.

Para las opciones del cliente, vea la explicación en man ssh_config:

ServerAliveInterval

Establece un intervalo de tiempo de espera en segundos después del cual, si no se han recibido datos del servidor, ssh enviará un mensaje a través del canal encriptado para solicitar una respuesta del servidor. El valor predeterminado es 0, lo que indica que estos mensajes no se enviarán al servidor. Esta opción solo se aplica a la versión 2 del protocolo.

ServerAliveCountMax

El valor predeterminado es 3. Si, por ejemplo, ServerAliveInterval se establece en 15 y ServerAliveCountMax se deja en el valor predeterminado, si el servidor no responde, ssh se desconectará después de aproximadamente 45 segundos Esta opción solo se aplica a la versión 2 del protocolo.

Según lo anterior, 0 significa que está deshabilitado. Por lo tanto, debe establecer estos valores lo suficientemente altos como para evitar el error ¡Tubería rota.

29
kenorb

La respuesta de Barthelemy es genial, pero en realidad no llega a la raíz del problema. Suspende su máquina y desea que la sesión SSH siga viva cuando enciende su computadora.

No existe tal configuración para ssh que mantenga viva la conexión de esa manera. SSH usa TCP, para empezar necesitas el apretón de manos de tres vías y luego mantenerte vivo después de un tiempo de inactividad. Cuando apaga/hiberna todas sus conexiones TCP se cierran con FIN. No hay forma de superar eso.

Para una solución sucia, puede usar VPS u otro cuadro en línea con pantalla para mantener la conexión. Mi consejo no lo haga por razones de seguridad.

20
3h4x

Como no puede garantizar que una conexión SSH (que sea TCP) permanezca activa una vez que un extremo deja de enviar ACK a los paquetes recibidos, personalmente uso http://www.harding.motd.ca/autossh/ = para reiniciar todas mis conexiones SSH casi tan pronto como cancele la suspensión.

Dado que la pantalla GNU) se usará en el lado del servidor, volver a conectar me lleva a donde estaba antes.

Puede hacer que escuche en puertos adicionales para que verifique continuamente que las conexiones aún estén activas, pero personalmente creo que funciona lo suficientemente bien con eso deshabilitado y simplemente confiando en el propio SSH ServerAliveInterval/ServerAliveCountMax.

Otra opción es http://mosh.mit.edu/ que usa UDP y se recupera sin problemas de la falta de conectividad a largo plazo.

16
grifferz

También puede ejecutar comandos con Nohup si desea que se ejecuten independientemente de su conexión SSH.

p.ej.

$ Nohup tar -xzf some_huge.tar.gz &

Los & es, creo, no es necesario, pero es conveniente ya que hace que el proceso se ejecute en segundo plano para que pueda hacer otras cosas.

Siempre uso Nohup para cualquier proceso que tome un tiempo, de modo que no tenga que comenzar de nuevo si pierdo la conexión por cualquier motivo: corte de energía (en mi ubicación remota, no en el Host, obviamente), corte de red, lo que sea.

5
Buttle Butkus

Ponga su sesión de larga duración dentro de la pantalla Vea la pantalla -h para más detalles

De esa manera, puede volver a conectarse a la máquina usando ssh y volver a conectar a la sesión de pantalla

1
user180529