¿Cómo funciona tcp-keepalive en ssh?

85

Estoy tratando de codificar un script de shell que utiliza una conexión ssh para hacer "latidos". Quiero terminar el lado del cliente y el servidor de esa conexión después de un cierto tiempo de espera (después de que la conexión se caiga).

Lo que encontré hasta ahora:

  • TCPKeepAlive sí / no para ssh y sshd
  • ClientAliveCountMax para sshd
  • ClientAliveInterval para sshd
  • ServerAliveCountMax para ssh
  • ServerAliveInterval para ssh

Para cambiar "ClientAliveCountMax", tendría que modificar el sshd_config en cada máquina de destino (esta opción está deshabilitada de forma predeterminada).

Entonces mi pregunta es: ¿puedo usar "TCPKeepAlive" para mis propósitos también (sin cambiar nada más en las máquinas de origen / destino)?

El sistema operativo de destino es SLES11 SP2, pero no creo que sea relevante aquí.

Nils
fuente
Esos parámetros están destinados a situaciones en las que un firewall o dispositivo intermediario a lo largo de la conexión terminará la conexión. Esos parámetros son para enviar datos periódicos para mantener viva la conexión, y también para cerrar la conexión cuando hay X respuestas pendientes. ¿Puedes darnos un poco más de detalle de lo que estás haciendo? ¿Está utilizando la ControlMasteropción y está utilizando conexiones esclavas?
Patrick
Solo quiero construir un medio para determinar si otro nodo está "inactivo" utilizando varias conexiones de red ssh con varias líneas físicas. Lo hago simplemente abriendo una sesión ssh (que más o menos hace un bucle sin fin). Quiero que esa sesión termine si las conexiones se rompen. Me pregunto cuál es el intervalo / recuento de TCPKeepalive.
Nils

Respuestas:

104

Probablemente desee utilizar la configuración de ServerAlive para esto. No requieren ninguna configuración en el servidor y se pueden configurar en la línea de comando si lo desea.

ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST

Esto enviará un mensaje ssh keepalive cada 5 segundos, y si llega el momento de enviar otro keepalive, pero no se recibió una respuesta al último, la conexión se termina.

La diferencia crítica entre ServerAliveIntervaly TCPKeepAlivees la capa en la que operan.

  • TCPKeepAliveopera en la capa TCP. Envía un paquete vacío TCP ACK. Los cortafuegos se pueden configurar para ignorar estos paquetes, por lo que si atraviesa un cortafuegos que desconecta las conexiones inactivas, es posible que estas no mantengan la conexión activa.
  • ServerAliveIntervalopera en la capa ssh. En realidad, enviará datos a través de ssh, por lo que el paquete TCP tiene datos cifrados y un firewall no puede determinar si es un paquete activo o un paquete legítimo, por lo que funcionan mejor.
Patricio
fuente
1
Creo que esta es la dirección correcta. Las pruebas iniciales han demostrado que esto funcionará: terminará enviando y recibiendo subprocesos ssh / sshd los últimos 5 segundos después de que la conexión se caiga. Me quejo de que TCPKeepalive simplemente usa los valores predeterminados de la pila TCP, por lo que también es más difícil de configurar.
Nils
Esto también resuelve el problema del usuario fantasma. Creo que esto también se puede hacer en la configuración PuTTY , cambiando Seconds between keepalivesa 1800 en Configuración | Conexión.
Bob Stein
7

La TCPKeepAliveopción es en realidad un método muy diferente para mantener las conexiones vivas de las opciones similares a ClientAlive o ServerAlive.

Son por BSD página del manual de SSH , se expresa que:

Los mensajes vivos del cliente se envían a través del canal encriptado y, por lo tanto, no se podrán suplantar. La opción de keepalive de TCP habilitada por TCPKeepAlivees spoofable. El mecanismo de cliente activo es valioso cuando el cliente o el servidor dependen de saber cuándo una conexión se ha vuelto inactiva.

La TCPKeepAliveasegurarse de si el sistema debe enviar mensajes de mantenimiento de conexión TCP al otro lado. La opción predeterminada siempre está habilitada.

Si está utilizando ClientAliveInterval, puede deshabilitar TCPKeepAlive. Esta opción enviará un mensaje a través del canal encriptado para solicitar una respuesta del cliente (el valor predeterminado es 0, por lo que no se envían mensajes al cliente) y ClientAliveCountMaxestablece el número de mensajes vivos del cliente antes de que sshd desconecte al cliente, al finalizar el sesión.

kenorb
fuente