autossh no mata ssh cuando el enlace está inactivo

10

He comenzado mi autossh con un tiempo de sondeo de 30 s:

AUTOSSH_POLL=30 AUTOSSH_LOGLEVEL=7 autossh -M 0 -f -S none -f -N -L localhost:34567:localhost:6543 user1@server1

Y está funcionando bien:

Sep  5 12:26:44 serverA autossh[20935]: check on child 23084
Sep  5 12:26:44 serverA autossh[20935]: set alarm for 30 secs

Pero si elimino físicamente el cable de red, lo que significa que el túnel ya no puede funcionar, autossh no mata al demonio ssh. ¿Por qué? Entiendo que autossh no puede hacer nada si el enlace está inactivo, pero en mi opinión debería intentar hacer lo siguiente:

  1. Verificar el proceso ssh secundario ( check on child ...)
  2. Verifique el extremo lejano !!! (una operación similar a un ping a través del túnel)
  3. Darse cuenta de que el túnel está abajo
  4. Detener el proceso de ssh
  5. Intenta crear el túnel nuevamente
  6. Tenga en cuenta que no funciona, y configure un temporizador (¿exponencialmente creciente?) Para verificar nuevamente pronto

Es por eso que estoy ejecutando autossh: si algo le sucede al túnel (ya sea un problema de software o hardware), debería intentar reiniciarlo. En cambio, solo está esperando que el proceso ssh muera. ¿No debería estar tratando de reiniciarlo, incluso si no hay esperanza de restablecer la conexión?

¿Qué tipo de verificación está haciendo autossh? ¿Solo verifica que el ssh esté funcionando? ¿No está haciendo ningún tipo de control remoto?

Editar

Según lo solicitado, agrego la parte relevante de la configuración ssh:

# (see http://aaroncrane.co.uk/2008/04/ssh_faster)
# The ServerAliveInterval tells SSH to send a keepalive message every 60 seconds while the connection is open;
#   that both helps poor-quality NAT routers understand that the NAT table entry for your connection should
#   be kept alive, and helps SSH detect when there’s a network problem between the server and client.
ServerAliveInterval 60
# The ServerAliveCountMax says that after 60 consecutive unanswered keepalive messages, the connection should
#   be dropped. At that point, AutoSSH should try to invoke a fresh SSH client. You can tweak those
#   specific values if you want, but they seem to work well for me.
ServerAliveCountMax 60

TCPKeepAlive yes
dangonfast
fuente
¿Qué hay de tratar de reducir el tiempo de espera?
Nikolaidis Fotis
Usamos autossh por un tiempo, pero era demasiado poco confiable en conexiones defectuosas, en particular cuando se combinaba con reenvíos de puertos. Ahora usamos OpenVPN y estamos muy contentos con él.
Nils Toedtmann
@NikolaidisFotis: el tiempo de espera está bien. Está ... agotando el tiempo. Pero no hace lo correcto (en mi humilde opinión) cada vez que entra el tiempo de espera, a saber: ¡ verificar el extremo lejano !
dangonfast
@NilsToedtmann: gracias, lo intentaré. ¿Es fácil de implementar? ¿Tienes algún enlace a un buen tutorial?
dangonfast
OpenVPN es bastante sencillo, simplemente 'apt-get install' lo iniciamos y comenzamos con las configuraciones predeterminadas para el servidor o el cliente, utilizando dev tunambas y configurando remotela configuración del cliente. El único bit molesto es administrar los certificados. Utilizamos la CA 'easy-rsa' que viene con OpenVPN. Una vez que tenga los certificados, el resto es fácil.
Nils Toedtmann

Respuestas:

11

Pero si elimino físicamente el cable de red, lo que significa que el túnel ya no puede funcionar, autossh no mata al demonio ssh. ¿Por qué?

autossh se ejecuta en su máquina cliente, por lo que no puede eliminar directamente el proceso ssh daemon en el servidor. Sin embargo, puede especificar un valor distinto de cero para ClientAliveIntervalin /etc/ssh/sshd_configen el servidor (ver man sshd_config) y reiniciar el servicio sshd en el servidor para aplicar el cambio de configuración. Luego, en el caso de una desconexión de la red, el proceso del demonio ssh se ClientAliveInterval * ClientAliveCountMaxeliminará después de segundos (pero no por autossh).

Ahora, si querías preguntar "¿Por qué autossh no mata el proceso del cliente ssh?" , Ha especificado -M 0. Desde la página de manual de autossh:

Setting the monitor port to 0 turns the monitoring function off, and autossh will only restart ssh upon ssh's exit.

En lugar de usar autossh para monitorear la conexión, está esperando que ssh salga después de un tiempo de espera de ServerAliveCountInterval * ServerAliveCountMaxsegundos. Ha solicitado 60 comprobaciones de servidor activo antes de que salga ssh, con un intervalo de 60 segundos que separa las comprobaciones consecutivas, por lo que esperará una hora antes de que su cliente ssh salga.

También puede considerar usar la ExitOnForwardFailureopción en el lado del cliente (ver man ssh_config), para que ssh salga si no puede establecer un túnel, y luego autossh puede intentar iniciar ssh nuevamente.

James W
fuente
Gracias, esto tiene sentido. De hecho, quise decir "proceso de cliente", no proceso de servidor.
dangonfast
Y después de volver a leer la página de manual de autossh ahora recuerdo por qué configuré -M 0: no es fácil usar un puerto de monitoreo, y se desaconseja indirectamente: en muchos sentidos, esta puede ser una mejor solución que el puerto de monitoreo
dangonfast