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:
- Verificar el proceso ssh secundario (
check on child ...
) - Verifique el extremo lejano !!! (una operación similar a un ping a través del túnel)
- Darse cuenta de que el túnel está abajo
- Detener el proceso de ssh
- Intenta crear el túnel nuevamente
- 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
fuente
dev tun
ambas y configurandoremote
la 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.Respuestas:
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
ClientAliveInterval
in/etc/ssh/sshd_config
en el servidor (verman 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 seClientAliveInterval * ClientAliveCountMax
eliminará 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 * ServerAliveCountMax
segundos. 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
ExitOnForwardFailure
opción en el lado del cliente (verman ssh_config
), para que ssh salga si no puede establecer un túnel, y luego autossh puede intentar iniciar ssh nuevamente.fuente
-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