2014年2月6日木曜日

Keep-AliveとNATテーブルの関係

SSHなんかで外部のサーバに接続していて、しばらく何もせずに放置しておくと通信できなくなることがあったりする。対策を立てていないと頻繁に起きる。

これの原因は、接続の途中にあるルータ。ルータはプライベートIPアドレスの領域とグローバルIPアドレスの領域の境目では、アドレスを変換してやりとりする(プライベートIPアドレスをもつパケットはインターネットに出るとすぐに破棄されてしまうので)。その際変換元のプライベートIPアドレスと返還後のグローバルIPアドレスの対応関係を記憶しており、これがNATテーブルと呼ばれる。

もっとも、最近は単なるNATではなく複数のプライベートIPアドレスをポート番号を変えつつ通信することで1つのグローバルIPアドレスと対応させるNAPT(IPマスカレード)の方が多いと思う。
(参考 → NAT - ネットワークエンジニアを目指して

まあ、NATにしてもNAPTにしても、プライベートIPアドレスとグローバルIPアドレスの対応一覧表を内部に持っているわけだ。

で、NATテーブルにしろNAPTテーブルにしろ、無限に記録するわけには行かない。だから記録できる数の上限もあるし、一定時間使わなければ破棄していく。

で、接続を確立してから一定時間以上通信がないと、接続経路の途中にあるルータのNATテーブル(またはNAPTテーブル)が破棄されてしまい、いざ通信しようとしたらできない、ということになるわけだ。

で、対策としては、一定間隔で何か通信するということになる。一定間隔でデータが流れていれば、NATテーブルやNAPTテーブルの該当レコードはクリアされない。このような、接続を維持するために一定間隔でデータを流す行為や機能をKeep-Aliveと呼ぶわけね。

例えば簡易な方法としてはSSHではログインした端末でpingをlocalhost宛に打ったりとかする。他にもクライアントソフトが定期的に無害なパケットを流すなど、対策方法はいくつかある。
(参考 → keep-alive for ssh

※この記事について指摘・意見・提案・感想などありましたら下のコメント欄にどうそ。

0 件のコメント:

コメントを投稿