Parece que necesitas autossh. Esto monitoreará un túnel ssh y lo reiniciará según sea necesario. Lo hemos usado durante un par de años y parece funcionar bien.
autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C
Más detalles sobre el parámetro -M aquí
Todos los cortafuegos con estado se olvidan de una conexión después de no ver un paquete para esa conexión durante un tiempo (para evitar que las tablas de estado se llenen de conexiones donde ambos extremos murieron sin cerrar la conexión). La mayoría de las implementaciones de TCP enviarán un paquete de actividad después de mucho tiempo sin recibir noticias del otro lado (2 horas es un valor común). Sin embargo, si hay un firewall con estado que se olvida de la conexión antes de que se puedan enviar los paquetes keepalive, una conexión de larga duración pero inactiva morirá.
Si ese es el caso, la solución es evitar que la conexión quede inactiva. OpenSSH tiene una opción llamada ServerAliveInterval que se puede usar para evitar que la conexión esté inactiva durante demasiado tiempo (como beneficio adicional, detectará cuándo el compañero murió antes, incluso si la conexión está inactiva).
He usado el siguiente script Bash para seguir generando nuevos túneles ssh cuando el anterior muere. El uso de un script es útil cuando no quiere o no puede instalar paquetes adicionales o usar el compilador.
while true
do
ssh <ssh_options> [[email protected]]hostname
sleep 15
done
Tenga en cuenta que esto requiere un archivo de claves para establecer la conexión automáticamente, pero ese también es el caso con autossh.