サーバへssh接続時に長時間放置しても接続を切れなくする方法 †
NATな環境で放置したSSH接続が切断される問題について
これは、 NATをしているルータが一定時間パケットの流れないコネクションを接続断と判断し、 NATテーブルをクリアしてしまうために起こると考えられます。 SSHクライアントがいざパケットを流そうとしたときに、初めて接続断に気づくというわけです。(NATテーブルをクリアする際に両側のソケットに対してハングアップを知らせてくれればすぐに切れると思うのですが、少なくとも職場のブロードバンドルータは何もしないようです)
SSHに限らず、コネクションを作った後で長期間何もパケットが流れないようなサービスであれば同じように切れるはずですが、SSH以外はまず該当しないでしょう。
対策としては、SSHの設定で「KeepAlive」をオンにすれば万事解決… のような気がしますが、これは後述するように全く効果がありません。有効な方法は以下のようにいくつかありますが、どれもメリットとデメリットがあります。
ということでサーバへ定期的にパケットが送られていれば、接続は維持されるようです。
Poderosaの設定で定期的にダミーパケットを送信する機能がありました。
「ツール」→「オプション」→「ターミナル」→「KeepAliveパケットを送信する」にチェック。
何分おきに送信するかも指定できます。
うちではすぐに接続が切れてしまっていたので、3分に設定しました。
ルータにより接続が遮断されてしまう場合、サーバにゾンビが残ってました。
# ps -ef | grep ssh
と打って、複数出てきたらゾンビです。
無駄なメモリを使っているのでkillしておこう。