Home > お知らせ > NATとは

NATとは

NATとは

Network Address Translationのことです。発信元(ソース)IPや、送信先(ディスティネーション)IPといったネットワークアドレスを変換します。発信元IPを変換するものをSNAT、送信先IPを変換するものをDNATと呼びます。まず、SNATの例ですが、次のようになります。

・SNATの例

「クライアント(192.168.0.10:5000)」→(123.4.5.6:80あて)→「NATサーバー(GW)(受付:192.168.0.1、GIP:111.123.123.*)(ソースIP書き換え111.123.123.*:5000)」→「123.4.5.6:80」

SNATでは、上記のように、NATサーバーが、ソースIP(発信元IP)を書き換えます。リクエスト先の(123.4.5.6:80)からは、(111.123.123.*:5000)からのアクセスに見えます。よって、リクエスト応答は(111.123.123.*:5000)に返します。NATサーバーは、このポートに返ってきたパケットの宛先IPは、(192.168.0.10:5000)であると記憶しているので、宛先IPを(192.168.0.10:5000)に替えてクライアントに送ります。

このようにして、IPアドレスの書き換え操作のみで、アドレス帯の異なるネットワークと外向けIPひとつで通信できるようになります。

ただし、単にIPアドレスだけを書き換えると問題が発生する場合があります。例えば、上記の例の通信が行われている最中に、クライアント2から、同じ5000番ポートからアクセスが来た場合、NATサーバーは、IPアドレスのみの書き換えを行っていると、(111.123.123.*:5000)宛に戻ってきたパケットをどちらのクライアントに送ればいいのかわからなくなってしまいます。このようなことが起こらないように、port番号も変更する(クライアント2はport:5001を使おう!みたいな感じ。)ものを、「IPマスカレード」といいます。ふつう、natというと、IPマスカレードのことを言うことが多いようです。(この機能は、家庭のブロードバンドルーターとかに標準で入っています。この機能のおかげで、複数台のPCがインターネットに接続できます。)

次に、DNATですが、良く使われる例として、「家庭でサーバー立ち上げたい」ときに使います。

・DNATの例

「クライアント(123.4.5.6:5000)」→(111.123.123.*:80あて)→「NATサーバー(GW)(受付:111.123.123.*:80、内部IP192.168.0.1)(宛先IP書き換え192.168.0.10:80)」→「バックエンドサーバー192.168.0.10:80」

こんな感じで、外部からのアクセスが来た場合、宛先IPを書き換えて、内部のサーバーに投げるときに使えます。バックエンドサーバーは、送信元(123.4.5.6:5000)から来たパケットとして処理を行い、戻りパケットは、ゲートウェイであるNATサーバーに送り、NATサーバーが、送信元IPを書き戻してクライアントに送ります。

 「未知のIP帯→既知のIP帯」:DNAT

 「既知のIP帯→未知のIP帯」:SNAT

みたいな感じです。IPv4のグローバルIPが枯渇してきたために考えられたものですが、よくできていますね。

NATの問題点

NATは万能ではありません。例えば、「既知のIP帯→既知のIP帯(同一IP帯)」で、NATを使用すると、問題が発生します。次の例は、サブネットマスク255.255.255.0で考えてください。

・DNATの例(問題発生)

「クライアント(192.168.0.10:5000)」→(192.168.0.20:80あて)→「NATサーバー(受付:192.168.0.20)(宛先IP書き換え192.168.0.30:5000)」→「192.168.0.30:80」

上記例のように、NATサーバーによって、宛先IPアドレスを書き換えて別のサーバーに転送しています。「こんな必要あるのか?」と思われた方、ときどきあります。特に、サーバー周りですが。

さて、上記のようなDNATに何の問題があるのでしょうか。送信は問題無く行われるのですが、問題は、戻りパケットの方にあります。宛先である「192.168.0.30:80」では、パケットは次のような形になっているはずです。

  「送信元:192.168.0.10:5000、宛先:192.168.0.30:80」

このパケットを返信すると、「送信元:192.168.0.30:80、宛先:192.168.0.10:5000」となります。送信元は、送信先が同一アドレス帯であるので、そのままパケットを宛先に送ります。NATサーバーには返しません。

 このパケットを受け取ったクライアントPCは、「送信元:192.168.0.10:5000、宛先:192.168.0.20:80」で送ったパケットの返答が、(192.168.0.30)と、異なるアドレスから返ってきたので、受け取りを拒否します。(というよりも、そもそも返答と気付きません。)

このように、パケットを何度送信しても、戻ってこないことになり、通信が成立しません。

 また、SNATは同一IP帯では、成立しません。(そもそも初めのパケットが、NATサーバーに届かないため。)

 上記のDNAT問題を解決するパターンは、2つあり、1つはリバースプロキシやロードバランサ等の転送で行われることがある、宛先も送信元も同時に書き換える(パケット自体作り替えるとか・・)です。また、もうひとつが、DSR構成です。

DSRは次回・・

間違いや誤植がありましたら、お教えください。

Comments:0

Comment Form

Trackbacks:0

Trackback URL for this entry
http://dev.tapweb.co.jp/2010/08/239/trackback
Listed below are links to weblogs that reference
NATとは from tap dev blog

Home > お知らせ > NATとは

Search
Feeds

Return to page top