NAT
Network Address Translation ・ なっと
プライベートIPとグローバルIPを変換する仕組み。IPv4アドレス枯渇への現実解。
概要
NAT(Network Address Translation)は、パケットが通過するルータで IPアドレスを書き換える仕組みです。最も身近な使われ方は、家庭やオフィスの内側で使う「プライベートIPアドレス」(192.168.x.x など、インターネットでは通用しない住所)と、インターネットで通用する「グローバルIPアドレス」の変換です。自宅の Wi-Fi につながったスマホやPCが、たった1つのグローバルIPアドレスを共有してインターネットを使えるのは、ルータの NAT が裏で住所を書き換え続けているからです。
つまり NAT は「マンションの代表番号」のような役割を果たします。外の世界から見えるのは代表番号(グローバルIP)1つだけで、内線番号(プライベートIP)は外からは見えません。内側から外へ電話をかけるたびに、交換手であるルータが「この通話は301号室のもの」と台帳に記録し、返事が来たら正しい部屋に取り次ぎます。
開発の現場では、「サーバから見えるクライアントのIPアドレスが実際の端末のものではない」「同じオフィスの全員が同じIPに見える」「外から自宅のPCに直接接続できない」といった形で NAT の存在に気づくことになります。ネットワーク越しの通信をデバッグするうえで、避けて通れない基礎知識です。
なぜ生まれたか
IPv4 のアドレスは32ビット、つまり約43億個しかありません。インターネットが研究者のネットワークだった時代には十分すぎる数でしたが、1990年代に商用利用が爆発的に広がると、「地球上のすべての機器に一意のアドレスを割り当てる」という前提が崩れることが確実になりました。これが有名な「IPv4アドレス枯渇問題」です。
根本解決として設計されたのがアドレス空間を128ビットに拡張した IPv6 ですが、世界中の機器とネットワークを一斉に置き換えることは不可能です。そこで1994年に RFC 1631 として提案されたのが NAT でした。「組織の内側では自由に使えるプライベートアドレスを使い、外に出る瞬間だけ少数のグローバルアドレスに変換する」という発想で、グローバルアドレスの消費を劇的に節約したのです。応急処置として生まれた NAT は、結果的にインターネットの構造を30年にわたって規定し続けており、IPv6 が普及しつつある現在でも大半の家庭・企業ネットワークは NAT の内側にあります。
詳細
NAPT — ポート番号まで使ったアドレスの多重化
素朴な NAT はプライベートIPとグローバルIPを1対1で変換するだけですが、それではグローバルIPの節約になりません。実際に広く使われているのは NAPT(Network Address Port Translation、Linux では IPマスカレードとも呼ばれます)で、IPアドレスに加えてポート番号も書き換えることで、1つのグローバルIPを多数の端末で同時に共有します。
内側の端末がパケットを外へ送るとき、ルータは「送信元 192.168.1.10:51000 → 変換後 203.0.113.5:62001」のような対応を変換テーブルに記録し、パケットの送信元を書き換えて送出します。外から返事が 203.0.113.5:62001 宛てに届いたら、テーブルを引いて 192.168.1.10:51000 に転送します。ポート番号が「どの端末のどの通信か」を区別する鍵になるため、1つのグローバルIPで数万の同時通信を捌けるのです。
図の2台はどちらも同じポート 51000 を使っていますが、ルータが外向きには別々のポート(62001 と 62002)に割り当て直すため衝突しません。この変換テーブルのエントリには有効期限があり、通信が途絶えるとしばらくして消されます。「アイドル状態の TCP 接続が突然切れる」というトラブルの原因が、実はこの NAT テーブルのタイムアウトだった、というのは実務でよくある話です。
実際にパケットを送って、変換テーブルが埋まっていく様子を確かめてみてください。外側から始まる通信がなぜ届かないのかも、テーブルを見れば一目で分かります。
| 内側(プライベート) | 外側(グローバル) | 宛先 |
|---|---|---|
| (まだ空 — 内側から通信すると行が増える) | ||
家庭内LANの2台がグローバルIPアドレス1個(203.0.113.5)を共有しています。パケットを送って、ルータの変換テーブルがどう埋まるかを見てください。
NAT越え問題 — 内側から始めないと通信できない
NAPT の変換テーブルは「内側から外側への通信」をきっかけに作られます。裏を返すと、外側から内側の端末へ最初のパケットを送る手段がありません。テーブルにエントリがない宛先不明のパケットは捨てられるからです。これが「NAT越え(NATトラバーサル)問題」で、オンラインゲーム、IP電話、P2Pファイル共有、ビデオ通話など、端末同士が直接つながりたいアプリケーションの共通の悩みになりました。
代表的な回避策が3つあります。1つ目はポートフォワーディング(静的NAT)で、「グローバルIPのポート8080宛ては必ず 192.168.1.10 へ転送する」とルータに固定設定する方法です。2つ目は STUN で、外部サーバに問い合わせて「自分は外からどう見えているか」を知り、その情報を相手と交換して双方から同時に接続を試みる「ホールパンチング」を行います。3つ目は TURN で、どうしても直接つながらない場合に外部の中継サーバ経由で通信します。WebRTC はこの3つを組み合わせて自動的に最適な経路を探す仕組みを標準で備えており、NAT越え技術の集大成といえます。
副作用としてのセキュリティ、そして CGN へ
NAT には「外から内側の端末に直接到達できない」という性質があるため、結果的に簡易的な防御として機能してきました。ただしこれはあくまで副作用であり、通信の中身を検査しているわけではないので、ファイアウォールの代わりにはなりません。内側の端末構成を隠せる点は利点であると同時に、VPN や一部の古いプロトコルが NAT と相性が悪い原因にもなっています。なお、端末側へのプライベートアドレスの配布は通常 DHCP が担っており、家庭用ルータでは NAT・DHCP・簡易ファイアウォールが1台に同居しています。
近年はアドレス枯渇がさらに進み、ISP 自身が NAT を行う CGN(Carrier-Grade NAT)が携帯回線を中心に一般化しました。利用者の端末はプライベートアドレスしか持たず、数百〜数千の契約者で1つのグローバルIPを共有します。この結果「IPアドレスでユーザーを特定・制限する」という古い設計は成り立たなくなり、アクセス制御やレート制限の設計では「同一IP=同一ユーザーとは限らない」ことを前提にする必要があります。NAT は応急処置として生まれながら、インターネットの前提そのものを書き換えた技術なのです。
