Sembra che tu abbia bisogno di autossh. Questo monitorerà un tunnel ssh e lo riavvierà se necessario. Lo usiamo da un paio d'anni e sembra funzionare bene.
autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C
Maggiori dettagli sul parametro -M qui
Tutti i firewall con stato dimenticano una connessione dopo non aver visto un pacchetto per quella connessione per un po' di tempo (per evitare che le tabelle di stato si riempiano di connessioni in cui entrambe le estremità sono morte senza chiudere la connessione). La maggior parte delle implementazioni TCP invierà un pacchetto keepalive dopo molto tempo senza sentire dall'altra parte (2 ore è un valore comune). Se, tuttavia, è presente un firewall stateful che dimentica la connessione prima che i pacchetti keepalive possano essere inviati, una connessione longeva ma inattiva cesserà.
In tal caso, la soluzione è impedire che la connessione diventi inattiva. OpenSSH ha un'opzione chiamata ServerAliveInterval che può essere utilizzata per impedire che la connessione rimanga inattiva per troppo tempo (come bonus, rileverà prima quando il peer è morto anche se la connessione è inattiva).
Ho usato il seguente script Bash per continuare a generare nuovi tunnel ssh quando il precedente muore. Usare uno script è utile quando non vuoi o non puoi installare pacchetti aggiuntivi o usare il compilatore.
while true
do
ssh <ssh_options> [[email protected]]hostname
sleep 15
done
Nota che questo richiede un file di chiavi per stabilire automaticamente la connessione, ma questo è anche il caso di autossh.