プライベートアドレスからインターネット-NAT

 皆さんの自宅のパソコンのWindows powershellで"ipconfig /all"というコマンドを実行してみて下さい。多分、ほとんどの人のパソコンでは、IPv4アドレスとして192.168.1.?のようなプライベートアドレスが表示されたのではないでしょうか?プライベートアドレスでは、インターネットが出来ません。内部ネットワークとインターネットの境界に設置されているルータ(通常エッジルータ、Edge Router)は送信元がプライベートアドレスになっているパケットを破棄してしまいます。何故でしょうか?プライベートアドレスは、IANAとは無関係に割り当てられたアドレスですので、世界中で同じアドレスがいくつも使われている可能性があります。従って、通信が混乱する可能性があります。というより、その前にルータがプライベートアドレスを知りませんので、ルーティングそのものが出来ません。

 ではどうしてプライベートアドレスを使うのでしょうか?それは、重複を許されるアドレスですのでアドレスの消費を抑えてくれるのです。IPv4アドレス空間は2^32と小さいのです。世界人口よりも小さな数です。IPv4アドレスは今ほとんど割り当てられてしまい、残りはごくわずかです。従って、重複を許されるプライベートアドレスは非常に貴重だと言わざるを得ません。しかし、その便利さの見返りにインターネットが出来ないという制限を受けてしまいます。

 これを何とかできないでしょうか?ここで登場するのがNAT(Network Address Translation)です。NATを利用するとプライベートアドレスでインターネットが出来るのです。なんと素晴らしいことでしょう!ということで、現在はほとんどの家庭のネットワークはプライベートアドレスになっています。

 NATには送信元(Source)NAT(SNAT)と宛先(Destination)NAT(DNAT)があります。送信元NATはプライベートアドレスのネットワークからグローバルアドレスのネットワークに接続するための手法で、宛先NATはプライベートネットワークで稼働するサーバに外部ネットワークからアクセスする手法、あるいはサーバ負荷分散などを行うための手法です。




1 送信元NAT

 送信元NATはインターネット通信のパケットの送信元アドレスを別のアドレスに書き換える技術です。一般的にはプライベートアドレスをグローバルアドレスに書き換えます。

 既に説明したようにグローバルIPアドレスで構築されているインターネットと企業等のLANの境界上にあるいわゆるエッジルータは送信元がプライベートアドレスのパケットを外に出すことはしません。宛先がグローバルアドレスなら、宛先までは辿り着けますが、このパケットの返事をどこに送ればいいか分かりません。ルータはプライベートアドレスに関する知識を全く持っていないので、返事が元々の送信元にまで届かないのです。このような通信は無駄ですので、初めから捨ててしまった方がいいのです。

 NATは一般的にはルータの機能としてインストールされています。送信元のNAT機能が付いたルータ(以下、送信元NAT)はルーティングテーブルを参照してパケットを送り出すべき出口がもしグローバルアドレスのネットワーク(インターネット)なら、送信元のアドレスをグローバルアドレスに書き換えて送り出します。その際に、アドレス変換情報を記録としてファイルに残します。





NATによるインターネット接続

 上の例では変換テーブルは次のようになります。グローバルネットワーク上の宛先ホストは返信を20.2.2.254宛に返します。NATはアドレス変換テーブルを確認して、返信を192.168.10.1に返します。

アドレス変換テーブル
送信側 宛先ホスト
変換前 変換後
192.168.10.1 20.2.2.254 100.20.20.5

 上の例を見てわかるのは、送信側でグローバルアドレスを用意している必要があるということです。同時に外部接続ができるホストは用意しているグローバルアドレスの数に制限されます。これでは、アドレス枯渇問題の解決策としてはちょっと役不足です。そこで考えられたのがIPアドレスと一緒にポート番号を付けかれる方法です。この方法を導入すれば、グローバルアドレスを1つ用意するだけで、同時に複数のホストがインターネット接続を実現することが出来ます。この手法は当初Linuxに実装されIPマスカレード(Masquerade)と呼ばれていますが、Linux以外でもNAPT(Network Address Port Translation)の名前で利用されています。また、機能してはNAPTだが呼び名がNATとなっている場合もありますので、注意して下さい。

NAPTを使ったインターネット接続

NAPTのアドレス変換テーブル
送信側 宛先ホスト
返還前 返還後
IPアドレス ポート番号 IPアドレス ポート番号 IPアドレス ポート番号
192.168.10.1 3456 20.2.2.254 2010 100.20.20.5 80
192.168.10.2 3456 20.2.2.254 2020 100.20.20.5 80
192.168.10.3 5691 20.2.2.254 2021 100.20.20.5 80

 グローバルアドレスが1つしかない場合でもポートを合わせて変換し、アドレス変換テーブルに記録することで、通信の同一性を識別することが可能となります。送信元がIPアドレス192.168.10.1、ポート番号3456の接続も、送信元が192.168.10.2、ポート番号3456の接続もNATがポート番号を変換することで、異なる接続と認識することが出来ます。


2 宛先NAT

 宛先NATはパケットの宛先IPアドレスを変換する技術です。宛先を変更することで、プライベートネットワーク内部で公開サーバを運用することが可能となります。また、この技術を使うことでサーバの負荷分散を行うことが出来ます。

2.1 ポートフォワーディング

 外部のグローバルネットワーク(インターネット)から特定のポート宛にアクセスがあった場合に、予め定めておいた内部ネットワークの特定ホストに転送する手法です。特定ポート宛に外からアクセスがあったときに、宛先を特定のプライベートアドレスに付け替えて、内部ネットワークに送信します。内部のプライベートネットワーク内に公開サーバを置く場合などに利用できます。

ポートフォワーディング
ポート番号が8080の場合に192.168.10.2に宛先を書き換えて接続



2.2 サーバ負荷分散

 サーバ負荷分散(SLB、Server Load Balancing)とは、サイトのトラフィックを複数のサーバに配信し、サーバの負荷を分散させる技術です。サーバ負荷分散では、仮想サーバ(Virtual Server)をユーザに対して提示します。エンドユーザには仮想サーバが現実のサーバに見えるので、仮想サーバのIPアドレス(Virtual IP、VIP)にアクセスします。これに対して負荷分散装置がNAT機能を使って、実際のサーバに振り分けます。振り分けにおいては、様々なパフォーマンス指標、負荷分散方式などが考慮されます。

NATを使った負荷分散




3 NATの問題点

 NATはプライベートアドレスでの不自由(インターネットに接続できない)を解消したという点で非常に画期的な手法です。また、そのことによってIPv4アドレスの寿命を長らえさせることが出来ました。
 
 しかし問題点がないわけではありません。その1つがプライベートアドレスを使った企業が合併した場合です。合併前はアドレスが重複していても全く問題がありません。ところが、合併を機に両者のネットワークをVPN(Virtual Private Network)を使って結合するとアドレスの重複の問題が表面化します。

 IPv6とNATの相性という問題もあります。NAPTは上位層のポート番号を参照することによって接続を識別しますが、ポート番号はパケットのペイロード部分に書かれています。もしIPv6でIPSecのESPを使っている場合は、ポート番号の参照が出来ませんので、NAPTは機能できなくなります。





更新履歴

2016/02/10 作成































 ページの先頭