autossh が必要なようです。これにより、ssh トンネルが監視され、必要に応じて再起動されます。数年間使用していますが、うまく機能しているようです。
autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C
-M パラメータの詳細はこちら
すべてのステートフル ファイアウォールは、しばらくの間その接続のパケットを確認しないと、その接続を忘れます (状態テーブルが、接続を閉じずに両端が切断された接続でいっぱいになるのを防ぐため)。ほとんどの TCP 実装は、相手側からの通知がなくても長い時間が経過するとキープアライブ パケットを送信します (一般的な値は 2 時間です)。ただし、キープアライブ パケットが送信される前に接続を忘れるステートフル ファイアウォールが存在する場合、長く存続するがアイドル状態の接続は切断されます。
その場合の解決策は、接続がアイドル状態にならないようにすることです。 OpenSSH には ServerAliveInterval というオプションがあり、接続が長時間アイドル状態になるのを防ぐために使用できます (ボーナスとして、接続がアイドル状態であっても、ピアがすぐに停止したことを検出します)。
次の Bash スクリプトを使用して、前の ssh トンネルが停止したときに新しい ssh トンネルを生成し続けました。スクリプトを使用すると、追加のパッケージをインストールしたくない場合や、コンパイラを使用できない場合に便利です。
while true
do
ssh <ssh_options> [[email protected]]hostname
sleep 15
done
これには、接続を自動的に確立するためのキーファイルが必要ですが、autossh の場合も同様であることに注意してください。