「通信したいサーバとネットワーク接続できない。」
「サーバ側から見たクライアントの IP アドレスが想定と異なる。」
といったトラブルは多くの人が経験していて、インフラ担当の人から NAT という言葉も耳にしたことがあるでしょう。
なんとなくは理解しているけど具体的に説明できない NAT について、この機会に調べたことを説明したいと思います。
IP について
PC やスマホなどインターネットに接続している機器には、 IP アドレスが付与されています(自分で設定することも可能)。
IP アドレスは住所のようなものです。住所は特定の住宅やビルを判別するために使用し、IP アドレスは特定の PC や スマホを判別します。
あなたの PC (やスマホ)は、この IP を用いてゲームのサーバや Gmail のサーバとやり取りをしています。電話や手紙と同じです。
理想をいえば IP アドレスは全世界で一意であるべきですね。あなたの住所が世界で一意なのと同じです。
しかしながら、IP アドレスの枯渇問題があり、世界中のすべての機器で一意になる番号を振ることはできません。
IPアドレス枯渇問題 - Wikipedia
IP アドレスは 8 ビット ( 10 進数で 0 ~ 255 )4 つで表すため 256 × 256 × 256 × 256 = 4,294,967,296 (約 43 億)種類の機器にしか割り振ることが出来ません。
要は IP アドレスの数が足りないのです。
だから一つのグローバル IP アドレスを複数の端末で共有する必要があります。
そこで登場するのが NAT です。
グローバル IP アドレスとプライベート IP アドレス
グローバル IP アドレスは世界中で通用するアドレスで勝手に決めることはできません。
ICANN を頂点とする非営利団体が管理していて、日本には JPNIC という支部があります。
プライベート IP アドレスとは家庭内、部署内、会社内などの組織内でのみ使用するアドレスです。ネットワークの外には見えないアドレスなので、自由に割り振ることが出来ます。(厳密には IP アドレスの採番ルールに則る必要はあります。)
グローバル IP は複数台で共有する
世界中で同じ IP アドレスを持つ機器が複数台存在したとしても、異なるプライベートネットワークとして存在することは可能です。同じネットワーク内で、IP アドレスが一意であれば正しく通信できます。
以下の図では A と E の IP アドレスが重複していますが、NAT 機器を挟んで別々のネットワークになっているので問題ありません。
この図では A、B、C の 3 台で 1 つのグローバル IP を使用して D、E、F の 3 台で別のグローバル IP を使用していることになります。
NAT とは
NAT は Network Address Translation の略で日本語で「ネットワークアドレス変換」と言います。
意味もそのまんまで、送信元や送信先の IP アドレスを変換する機能のことです。
NAT 機器と呼ばれるルーターやゲートウェイがこの機能を持ちます。
実際には通常、ポート番号も変換するので正確には NAPT (Network Address Port Translation)と言いますが、多くの場合「NAT」と言えば IP アドレスとポート番号の変換を意味しています。
それでは具体的に IP がどのように変換されるのか見ていきましょう。
図の左下の自分の PC からインターネットを経由して右上の WEB サーバにリクエストを送り、レスポンスが返ってくるまでの流れを説明します。
自分からはネットワーク B の WEB サーバの端末は直接見えません。なので送信先 IP アドレスにはネットワーク B の NAT 機器のグローバル IP アドレスを指定します。
送信元 IP アドレス | 送信元ポート | 送信先 IP アドレス | 送信先ポート |
---|---|---|---|
1.1.1.1 | 10000 | 9.9.9.9 | 80 |
情報を受け取ったネットワーク A 側の NAT 機器はインターネットに情報を流す際に NAT 変換を行い、送信元の IP アドレスを自分のグローバル IP アドレスに変換します。また、送信元ポートも変換しネットワーク A 内のどの端末からの情報を中継したのか判別するために覚えておきます。
送信元 IP アドレス | 送信元ポート | 送信先 IP アドレス | 送信先ポート |
---|---|---|---|
8.8.8.8 | 10001 | 9.9.9.9 | 80 |
これでネットワーク B 側の NAT 機器に情報が伝達されました。
ネットワーク B 側の NAT 機器は、送信先ポートを見て 80 番なので WEB サーバへのリクエストと判断し、送信先 IP を変換してネットワーク B 内のプライベートネットワーク内に情報を流します。
送信元 IP アドレス | 送信元ポート | 送信先 IP アドレス | 送信先ポート |
---|---|---|---|
8.8.8.8 | 10001 | 5.5.5.5 | 80 |
これで無事に WEB サーバへリクエストが届きました。
続いて WEB サーバからのレスポンスがどのように NAT 変換されリクエスト送信者に届くのか見ていきましょう。
まず、WEB サーバは受け取った送信元情報をそのまま送信先としてレスポンスを返します。
送信元 IP アドレス | 送信元ポート | 送信先 IP アドレス | 送信先ポート |
---|---|---|---|
5.5.5.5 | 80 | 8.8.8.8 | 10001 |
ネットワーク B 側の NAT 機器は送信元を自身のグローバルIPアドレスに変換してインタネットにレスポンスを流します。
送信元 IP アドレス | 送信元ポート | 送信先 IP アドレス | 送信先ポート |
---|---|---|---|
9.9.9.9 | 80 | 8.8.8.8 | 10001 |
ネットワーク A 側の NAT 機器はレスポンスを受信し、ポート番号からどの端末への情報か判断して送信先を書き換えます。
送信元 IP アドレス | 送信元ポート | 送信先 IP アドレス | 送信先ポート |
---|---|---|---|
9.9.9.9 | 80 | 1.1.1.1 | 10000 |
これで自分の端末でレスポンスを受け取ることができました。
以上で自分の端末から WEB サーバ へリクエストを送り、そのレスポンスを受け取る一連の流れの中で送信先、送信元の IP アドレスおよびポート番号が変換されていく様子を見てみました。
NAT のまとめ
グローバル IP の枯渇問題を解決するため、及び異なるネットワークに接続するため、送信元や送信先の IP アドレスやポート番号を適宜書き換えることを NAT とと呼びます。
また実際にどのように変換されるかを見てきました。
アプリケーションエンジニアであったとしても、 NAT の仕組みを理解し、ネットワークトラブルに対処する技術を身につておきましょう。
Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)
- 作者:山本 陽平
- 出版社/メーカー: 技術評論社
- 発売日: 2010/04/08
- メディア: 単行本(ソフトカバー)