IPv4アドレスは、2011年にIANA(インターネット全体のアドレス管理機関)の在庫が尽きている。32ビットで表現できる約43億個という数は、スマートフォン・IoT機器・サーバーが爆発的に増えた現在の接続数には、とうに足りていない。
それなのに、新しいスマホを買って電源を入れれば、何の疑問もなくインターネットに繋がる。自宅のWi-Fiには、ノートPC・スマホ・テレビ・スマートスピーカーが同時にぶら下がっている。枯渇したはずのアドレスは、いったいどこから湧いてきているのか。
答えを先に言ってしまうと、湧いてきてはいない。**家の中の機器は、そもそも「枯渇したアドレス」を1個も使っていない。**この記事では、その仕組みであるNAT(Network Address Translation)を、実際のパケットの書き換えのレベルで追いかける。
プライベートIPアドレスという「使い回し前提」の住所
家庭用ルーターの管理画面を開いたことがあるなら、192.168.1.1 のようなアドレスを見た記憶があるはずだ。これはプライベートIPアドレスと呼ばれ、以下の範囲がRFC 1918によって予約されている。
10.0.0.0/8172.16.0.0/12192.168.0.0/16
この範囲のアドレスには、決定的な特徴がある。インターネット上のルーターは、これらの宛先へのパケットを一切中継しないという取り決めになっている点だ。つまり 192.168.1.5 というアドレスは、世界中の家庭や会社のLANで、何百万回でも重複して使い回してよい。あなたの自宅の 192.168.1.5 と、隣の家の 192.168.1.5 は、何の衝突も起こさない。両者は互いに直接パケットを送り合う手段がないからだ。
一方、インターネットに直接出ていくためには、世界で一意なグローバルIPアドレスが要る。ISP(インターネットサービスプロバイダ)が契約者に払い出すのは、多くの場合たった1個のグローバルIPだ。自宅に5台の端末があっても、契約しているグローバルIPは1個のまま、というのが一般的な家庭回線の実態である。回線によっては、その1個すら契約者専用ではなく、ISP側の設備でさらに複数契約者にNATを重ねるCGNAT(Carrier-Grade NAT)が使われていることもある。枯渇が深刻な地域ほど、この「NATの中でさらにNAT」が起きている。
ここで疑問が残る。1個しかないグローバルIPで、5台分の通信をどうやって区別しているのか。
NATは「代表電話番号」の発想で解決する
会社の代表電話番号にかけると、受付が「どちらにお繋ぎしますか」と聞いて、社内の内線へ転送してくれる。外部から見えるのは代表番号1本だけなのに、社内には何十もの内線が存在し、それぞれが別々の会話をしている。
NATがやっていることは、これと同じ発想である。ルーターは、LAN内の各端末が使うプライベートIPを、外に出ていく瞬間に1つのグローバルIPへと書き換える。戻ってきた応答は、逆の変換を経て、正しい端末に配達される。
ただし電話の内線番号だけでは、家庭用ルーターの状況は再現できない。内線は人間が「どちらにお繋ぎしますか」と聞き分けてくれるが、ルーターにそんな知性はない。実際にどの端末宛かを機械的に見分けるために使われているのが、TCP/UDPのポート番号である。
パケットが書き換わる瞬間を追う
家庭用ルーターで実際に動いているのは、単純なNATではなく、ポート番号まで含めて変換するNAPT(Network Address Port Translation、家庭用ルーターの文脈では単にNATと呼ばれることが多い)である。ノートPC(192.168.1.5、送信元ポート54321)が 93.184.216.34 の80番ポートへHTTPリクエストを送る場面を追う。
ルーターの内部には、この変換対応を記録するテーブルが存在する。Linuxベースの実装であれば conntrack コマンドで実際にこのテーブルを覗くことができ、192.168.1.5:54321 と 203.0.113.9:40001 が対応付いている行を確認できる。テレビが 192.168.1.8:51000 から同じサーバーへ通信すれば、ルーターは別の空きポート(例えば 40002)を払い出し、テーブルにもう1行を追加する。外部から見えるのは常に 203.0.113.9 の1つのIPだが、ポート番号という「内線番号」によって、何百台分の通信でも1個のグローバルIPの裏で同時に捌けてしまう。これが、枯渇したはずのアドレスで世界中の端末がインターネットに出られている種明かしである。
筆者の考え・所感
正直に言うと、NATの存在を知った当初は「よくできた延命策」くらいにしか思っていなかった。IPv6が普及すればNATは要らなくなる過渡期の技術だ、と。その認識が甘かったと痛感したのは、個人開発でP2Pのビデオ通話機能を作ろうとしたときだった。
両者ともNATの内側にいる端末同士を、サーバーを介さず直接繋ごうとすると、驚くほど繋がらない。片方のルーターが「宛先が変わるたびに外部ポート番号を変える」タイプのNAT(Symmetric NAT)だと、STUNサーバー相手に調べたポート番号が、そのまま相手の端末への通信では使えない。宛先ごとに割り当てが変わってしまうからだ。STUNサーバーで自分のグローバルIP・ポートを調べ、それでもダメならTURNサーバーを経由して中継する、という段階的な仕組み(ICE)が必要になる理由を、このとき初めて身体で理解した。NATは単なる住所変換ではなく、「外から中へは原則入れない」というファイアウォール的な性質を副産物として持っている。この副作用と正面から向き合わない限り、P2P通信は簡単には成立しない。
もう一つ実務で驚いたのは、社内の複数拠点を同じプライベートIPレンジ(192.168.1.0/24)で構築してしまい、VPNで接続した瞬間にアドレスが衝突した経験である。プライベートIPは「重複してよい」という性質が、LAN同士を繋いだ途端に牙をむく。設計時にレンジをずらしておくという、地味だが外せない判断の重みを、そのとき覚えた。
まとめ
- IPv4アドレスの枯渇は事実だが、家庭内の端末はそもそもグローバルIPを消費していない
- NATは、プライベートIPとポート番号の組を1つのグローバルIP・ポートに対応付けるテーブルを使い、1個のグローバルIPの裏で多数の端末を同時に通信させている
- NATは住所変換であると同時に、外から中への接続を原則遮断する性質を持ち、これがP2P通信を難しくしている