next up previous contents
Next: J.2 IPFilter の NAT Up: J. NAT(NAPT) Previous: J. NAT(NAPT)

J.1 NATとは

NAT(Network Address Translation)はネットワーク層での一種のプロクシーだと 言えます。通常、Internet 上ではパケットは全て発信元、送信先共にグローバルな IPでなければなりません。しかし、IP資源の枯渇によって全ての通信において グローバルなIPを用いることは破綻しかえていました。そこで、ルータなどの グローバルなネットワークとの接合部分において、IPのすり替えを行う仕組みが 開発され、これがNATと呼ばれるものです。従って、このNATは、内部において発信 されたプライベートアドレスを発信源に持ち、グローバルアドレスを送信先に持つ パケットを外部に流す際に、プライベートアドレスについての変換を行います。 勿論、プライベートアドレスはグローバルアドレスへと変換し(変換の際の グローバルアドレスはNATマシンが知っている)て外へと送り出します。その パケットに対する返信パケットは逆に変換を行ったグローバルアドレスに戻ってくるので、 先のすり替えテーブルを参照して、本来のプライベートアドレスに直して内部に送り出す わけです。これによって、グローバルなネットワークにはまったくプライベートアドレス は現れないという事が実現できたのですが、この際にプールしておくグローバルアドレス を一対一対応で行うと、接続している内部のプライベートアドレスの数に対応するだけの グローバルアドレスが必要になります(これでも、接続されていない台数分のIPアドレス は節約できますし、何よりもネットに分けた際の無駄が生じないという利点はあります)。 この考えを更に推し進めて、よりグローバルアドレスの消費を劇的に押さえたのが NAPT(Network Address Port Translation)と呼ばれるものです。NAPTはLinuxでの 実装がもっとも有名なためにその実装名であるIPマスカレードとも呼ばれますが、 IPマスカレードはあくまでも実装名であって、機能の名前ではありません。また、 NAPTという名前も近年古典的なNATとの区別のために言われ始めたもので、機能的には NAPTでありながらNATと呼ばれているものもあります。そういう意味では、広義のNATと 狭義のNATがあると言って良いでしょう。ともあれ、NAPT がNATと違う点は、 プライベート側の発信をIPだけではなくport番号まで含めて識別に利用した点です。 これによって、狭義のNATに比べて、グローバルIPの消費が押さえられ、グローバル IPが一つでも運用が可能になっています(NATマシン上のグローバルIPを使うことも 出来ます)。

更に、この書き換えを行うことによって、接続されていない(NAT上のグローバルと プライベートの対応表にない)接続は原理的に接続が成立しないので、内部を一定 程度保護するというセキュリティ上の利点も生じます。しかし、この原理を見れば 分かる通り、もしコネクションのパケット自体にアドレスなどの情報を載せて 出ていった場合(当然そのアドレスを別のコネクションを張るために利用したい 訳ですが)、NAPTはそれに関知しないのですから、そうしたアプリケーションは 利用できなくなります。一部のアプリケーション(例えば、FTPなど)については NAPTが特別にアプリケーション層のプロトコルまで解釈することで対応する場合 もありますが、個別的対応しか手がなく、そういう意味でプライベートアドレスの ネットワークはインターネットではないという人もいます(IPv6が待望されるのは そうした意味もあるのです)。



Noriyo Kanayama