よく悩むしたぶん理解できてないので、整理のために書く。
私はnatが嫌いだ。できることならnatなどしたくない。あんなものはしないに越したことはない。
natというのは、IPアドレスを変換することである。
ユニーク(唯一で重複がないという意味)なIPアドレス同士の通信なのに、途中で送信元あるいはあて先が変更されてしまうと、誰が誰と通信しているのかわからなくなってしまう。送信者も受信者も中継者も混乱する。
ではなぜnatなどということをするのか。
一番多い目的は、privateアドレスをグローバルアドレスに変換することだろう。
家庭でインターネットを利用するような場合だ。
つまり、ルータがあって、内側(LAN側)では192.168.1.0/24などのプライベートアドレスを使用し、
外側(WAN側)には200.xxx.xxx.xxx などのグローバルアドレスが割り当てられているケース。
家にあるパソコンのIPアドレスは 192.168.1.1/24 とかになっている。
ブラウザで http://www.yahoo.co.jp/ とアドレスを指定して(わざわざURLを全部書くことはまずないだろうが)、目的のサーバ(サイト)にアクセスする。
このとき、www.yahoo.co.jp というホスト名(fqdn)はIPアドレスに変換される。
これをおこなうのがDNSサーバである。
たとえば、今 ping www.yahoo.co.jp をやってみると、
183.79.11.230 宛に通信しているのがわかる。
ちなみに私のパソコンのIPアドレスは 192.168.0.16 である。
192.168.0.16 → 183.79.11.230
という通信である。
「プライベートアドレスとグローバルアドレスは直接通信できない」
ということを聞いたことがないだろうか?
それは、事実上は正しいといえなくもないが、TCP/IPの仕組みとしては可能である。
プライベートアドレスもグローバルアドレスも関係ない。
実際に、インターネットにプライベートアドレスを送信元としたパケットを送出することはできる。
宛先にしても。
でも、そのパケットはすぐに破棄されるだろう。
「プライベートアドレスはインターネットに流してはいけない」
というのもよく聞くセリフで、これはその通りなのだが、
経緯としては、グローバルアドレスは重複しないように管理しようと決めて、
例外としてプライベートアドレスというものを作ったのである。
プライベートアドレスの範囲は決まっていて、
192.168.0.0/16
10.0.0.0/8
172.16.0.0/12
である。
さっき、yahooにpingしたときのアドレス 183.79.11.230はグローバルアドレスである。
でも、このIPアドレスをパソコンに設定しようと思えばすることはできる。
インターネットに接続しなければ、どんなIPアドレスを使用することもできる。
通信もできるかもしれない。
でも、インターネットというのはどこに誰がいるのかわからなくても通信できる仕組みで、
そのネットワークに同じIPアドレスが複数存在するとその仕組みは成立しなくなる。
話が長くなってめんどくさくなってきたのでそろそろ終わりにしよう。
natの第一の用途は、このprivate/global変換である。
これがほとんどである。
しかし、もう一つ用途がある。
私も最近ようやくわかった。
これが本題である。プライベートアドレスのことなどどうでもよかったのだ。実は。
(Network A) --- Router1 --- (Network B) --- Router2 --- (Network C)
Network Aから Network B, Network Cのいずれにもアクセスしたいとする。
すごく単純な構成だが、この要件を満たすには「ルーティング」が必要である。
Router1はNetwork A, Bと接続しているがCには接続していないので、
Cに到達するためのnext hopを設定しなければならない。
それは、Router2である。
そして、Router2にとってはAが未知のネットワークで、そこへ到達するためのnext hopは
Router1である。
では上記のような構成ではどうか。
host1はhost2へアクセスしたい。
host2はhost3へアクセスしたい。
ただし、host2のデフォルトゲートウェイはRouterA、
host3のデフォルトゲートウェイはRouterCで、変更できず、
host3にstatic routeを追加することもできない。
このときhost2に、192.168.2.0/24 → RouterB という経路を追加しても、
host3が192.168.1.0/24の経路を知らないため通信が成立しない。
host3にstatic routeを書けばいいのだが事情があって書けない。
というようなときに、natを使う。
RouterBで、192.168.1.0/24のソースアドレスを、192.168.2.0/24に接続しているI/FのIPアドレスにNATするのである。
もっと、一般化して説明したかったのだが・・・
またの機会に。