ServerAliveCountMax en SSH

25

¿Qué hace realmente ServerAliveCountMax en SSH?

Estoy tratando de asegurarme de que cuando me conecto a mi servidor a través de SSH, la conexión permanezca abierta durante un largo período de tiempo en lugar de que la conexión se apague después de un corto período de inactividad. Este es el ejemplo

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 2

Escuché de una fuente que la configuración anterior siempre enviará una respuesta al servidor cada 60 segundos siempre que el servidor reciba esa respuesta. Sin embargo, si por alguna razón la respuesta no llega al servidor, intentará enviar otro mensaje. Si ese mensaje también falla, cerrará la conexión. (Siento que esto está mal)

La segunda y la tercera fuente embargo dicen algo diferente. Afirman que se enviará un mensaje al servidor cada 60 segundos si hay un período de inactividad, pero solo enviará 2 solicitudes y luego cerrará la conexión.

Entonces, ¿qué hace exactamente ServerAliveCountMax?

John Crawford
fuente

Respuestas:

32

Su sentimiento de que "esto está mal" es correcto. Ver la página del manual :

 ServerAliveCountMax
         Sets the number of server alive messages (see below) which may be
         sent without ssh(1) receiving any messages back from the server.
         If this threshold is reached while server alive messages are
         being sent, ssh will disconnect from the server, terminating the
         session.  It is important to note that the use of server alive
         messages is very different from TCPKeepAlive (below).  The server
         alive messages are sent through the encrypted channel and there‐
         fore will not be spoofable.  The TCP keepalive option enabled by
         TCPKeepAlive is spoofable.  The server alive mechanism is valu‐
         able when the client or server depend on knowing when a connec‐
         tion has become inactive.

         The default value is 3.  If, for example, ServerAliveInterval
         (see below) is set to 15 and ServerAliveCountMax is left at the
         default, if the server becomes unresponsive, ssh will disconnect
         after approximately 45 seconds.  This option applies to protocol
         version 2 only.

 ServerAliveInterval
         Sets a timeout interval in seconds after which if no data has
         been received from the server, ssh(1) will send a message through
         the encrypted channel to request a response from the server.  The
         default is 0, indicating that these messages will not be sent to
         the server.  This option applies to protocol version 2 only.
Michael Hampton
fuente
3
La página del manual es clara en el Intervalset para 0deshabilitarla. Pero no está claro si se establece Maxa 0. ¿Enviaría infinitos ping vivos, o ninguno?
gcb
no me queda claro si configurar ServerAliveInterval 0 mantendrá la conexión abierta indefinidamente o no
Francesco
1
@Francesco De manera predeterminada, la conexión permanecerá abierta para siempre, a menos que un extremo la cierre explícitamente.
Michael Hampton
6

Los mensajes vivos del servidor son útiles cuando un servidor SSH se ha configurado para cerrar conexiones después de un período de tiempo sin tráfico (los proveedores de alojamiento web compartido que ofrecen acceso SSH casi siempre hacen esto, por ejemplo). Establecer estas dos opciones envía un paquete cada ServerAliveIntervalsegundo, por un máximo de ServerAliveCountMaxveces, manteniendo así la sesión viva.

Para responder a los comentarios sobre la incertidumbre de establecer cualquiera de las opciones 0, he leído el código fuente de la opensshimplementación, y esto es lo que veo ...

  • La configuración ServerAliveIntervalde 0NO enviará los paquetes, pero mantendrá viva la sesión indefinidamente, suponiendo que la conexión no se interrumpe debido al tiempo de espera de TCP y que el servidor no está configurado para descartar clientes inactivos.

  • Establecer ServerAliveCountMaxen 0tiene el mismo efecto que establecer ServerAliveIntervalen 0.

  • Establecer un valor negativo o algo mayor que INT_MAX(es decir, 2,147,483,647) dará como resultado un error de "valor entero ..." .

  • Establecer ServerAliveCountMaxentre INT_MAX/1000+1(es decir, 2,147,484) a INT_MAX(es decir, 2,147,483,647) también sería equivalente a establecer cualquier valor en 0.

Entonces, en esencia, la mayor cantidad de tiempos de espera que puede obtener (mientras aún envía los paquetes) es INT_MAX/1000( es decir, 2,147,483). Con un tiempo de espera 1y sin tráfico en las sesiones, eso te llevaría casi 25 días.

Obviamente, otras implementaciones de SSH pueden tener resultados diferentes.

Drew Chapin
fuente