NAT テーブルのタイムアウト

お客先に出張中のメンバーから、「ssh が 5分くらいで勝手に切断されてしまう」という相談がありました。


メンバーもいろいろと忙しかったようで、ゆっくり話しを聞けませんでしたが、おそらくBBルータのNAT テーブルがタイムアウトしてしまっているのではないか?と思いました。


BBルータは、ルータという名前ではありますが、実際の動きはLANの内側で使っているプライベートなIPアドレスと、インターネットに出て行くためのグローバルアドレスを付け替えてつじつまを合わせる動作をしています。
このような動きをNAT(最近はポート番号も付け替えるのが当たり前なのでNAPT)やIPマスカレードと言います。


詳しい内容は省きますが、要はそれらの情報をテーブルに情報を保持しているということです。


テーブルはルータ内部のメモリに保存されるので、時間が経って利用されなくなったり、
切断されたコネクションについては削除されます。


ssh の場合、何も通信を行っていないと、本当に一切のパケットが流れないため、NATテーブルから該当エントリが削除されてしまい、その後何かしようと思うと切断されていることに気がつく。という感じになります。


対策としては、何か通信をしていればいいのですが、そういう訳にはいかないときは、
定期的に通信を行うsshクライアントを使えばいいでしょう。
たとえば、WindowsならPuTTYがそれに対応していますし、Debian が配布しているsshは、


~/.ssh/config
に、
ProtocolKeepAlives 120
などと書くと、2分ごとに通信を行って切断を防ぐようになります。


トンネルなどを長期間はって、何らかの作業を行いたい場合はとても便利です。