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

161

Encontré esta pregunta , pero lo siento, no entiendo la configuración de las dos variables ServerAliveIntervaly ClientAliveIntervalmencioné 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 simple, algunas de mis conexiones se agotan cuando suspende y luego suspendo mi computadora portátil con la respuesta Write failed: Broken pipey otras no. ¿Cómo puedo configurar correctamente un sshd local para que no falle con una tubería rota?

M. Tibbits
fuente

Respuestas:

203

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.

Barthelemy
fuente
Ok, entonces interpretaría que cero segundos implica "no seguir vivo", ¿por eso no sondea al cliente / servidor?
M. Tibbits
3
yup 0 = no envíe un paquete nulo. Otra diferencia sería que ServerAliveInterval está configurado en la configuración del cliente, mientras que ClientAliveInternal está configurado en la configuración del servidor.
Barthelemy
8
Esto parece un buen consejo para evitar que la inactividad provoque tiempos de espera, pero no entiendo cómo se relaciona con la pregunta del OP de prevenir tuberías rotas cuando el cliente suspende. Cuando está dormido, el cliente no podría enviar un paquete nulo, ¿entonces esta configuración es discutible?
Sparhawk
La porción de ServerAlive es, sin duda. ClientAliveInterval / ClientAliveCountMax es lo que ayudaría aquí.
javawizard
1
Mirando hacia atrás a esta vieja respuesta, creo que respondió a la pregunta en el título y no a la pregunta en el segundo párrafo, de ahí que los comentarios sobre ServerAliveInternal no sean útiles para suspender, con lo que estoy de acuerdo. @JonasWielicki ClientAliveInterval podría ser malo en caso de suspensión porque el cliente suspendido no respondería al servidor y el servidor eventualmente desconectaría al cliente después de ClientAliveCountMax.
Barthelemy
18

Esto se explica en el sshd_configmanual ( 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(consulte a continuación) se establece en 15 y ClientAliveCountMaxse 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, sshse 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, ServerAliveIntervalse establece en 15 y ServerAliveCountMaxse deja en el valor predeterminado, si el servidor deja de responder, sshse 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 un error de tubería rota .

kenorb
fuente
Publicación útil Pero estoy muy frustrado por esto. Estoy configurando grandes intervalos en todo el lugar y mi conexión todavía se está rompiendo después de unos pocos minutos. (usando openssh en Ubuntu, no estoy seguro si eso es relevante)
Sridhar Sarnobat
1
@ user7000 Configure ambos, el cliente (ssh) y el servidor (sshd). Esto puede ayudar: Cómo solucionar problemas con 'El extremo remoto cerró inesperadamente la conexión SSH' .
kenorb
Creo que estoy llegando a alguna parte. Puede ser que no estaba poniendo un espacio antes ServerAliveIntervalen mi archivo de configuración.
Sridhar Sarnobat
16

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.

3h4x
fuente
1
De hecho, esta es la única respuesta a la pregunta.
Calimo
1
De hecho, esta es una solución de seguridad terrible, nunca hagas eso.
jahrichie
14

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 me deshago.

Dado que GNU Screen estará en uso en el lado del servidor, volver a conectarlo 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 solo 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.

Grifferz
fuente
5

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

p.ej

$ nohup tar -xzf some_huge.tar.gz &

El &es, creo, no es necesario, pero es conveniente ya que hace que el proceso de ejecución en segundo plano para que pueda hacer otras cosas.

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

Buttle Butkus
fuente
Tenga en cuenta que nohup en zsh no funciona correctamente.
Sridhar Sarnobat
@ user7000 ¿qué tiene de incorrecto?
Buttle Butkus
No recuerdo, creo que básicamente no mantuvo el proceso en ejecución después de que el cliente se desconectó. Fue hace unos años y dejé de usar nohup y usé disown en su lugar.
Sridhar Sarnobat
2
Supongo que los zshusuarios deberían quedarse en disown -hlugar de nohup, a menos que el problema se haya solucionado desde entonces.
Buttle Butkus
0

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

usuario180529
fuente
Me pregunto qué porcentaje de personas que sugieren pantallas realmente lo usan ellos mismos.
Sridhar Sarnobat
Creo que tmux es una mejor sugerencia, verifique la fecha de modificación del código github.com/tmux/tmux vs git.savannah.gnu.org/cgit/screen.git/log
Suhaib