惰性で学ぶIPv4

惰性で理解するIPネットワーキング(4)プライベートアドレスとNAPT

RFC1918 プライベートアドレスのはなし

192.168.X.0ってなんか特殊なアドレスなの?

なぜほとんど場合、おうちのネットワークアドレスは192.168.X.0/24なのか? 今回はこの点を考察していこう。

まずネットワークが正しく動作するためには同じアドレスをもつ端末が複数あったら困るのはわかるよね。例えばマンションに同じ番号の部屋が二つあったらカオスなことになるよね。せっかくAmazonで買ったPS5がどちらの部屋に届くかわからないし、逆に頼んでもいないのにクアトロ・フォルマッジが届くかもしれない。(ラッキー?)

なのでインターネット上で使用するアドレスは好き勝手に使うことはできないことになっている。簡単に言うと金を払って買う、または借りる必要がある。その際、IPv4アドレスを重複しないように注意深く払い出しているので、インターネット上には原則おなじIPアドレスは存在しない(某DNSサーバの8.8.8.8のようにわざと同じアドレスをあちこちに置いてある場合もある。これをエニーキャストアドレスと呼ぶ。だがその件は今は忘れてくれ)。このインターネット上で使えるIPv4アドレスをグローバルアドレスと言う。このあたりの仕組みはhttps://www.nic.ad.jp/ja/ip/admin-basic.htmlを読むといいよ。

じゃあみんなグローバルアドレスを買えばいいのかというと、個人で買うには(個人で無くても)いろいろな意味でハードルが高い。一般的にはサービスプロバイダと契約したときに1個貸してもらえるのが普通。でもさすがに1個だと足りないよね。少なくてもNintendoスイッチとスマホ用に2個は要るし、そもそもその1個のアドレスはルータに割り当てられてしまう。じゃあどうすんの? そこで登場するのがプライベートアドレス。

whois コマンドでそのグローバルアドレスの所有者がわかるぞ

プライベートアドレス

実は誰に断らずに好き勝手に使っていいアドレスが存在する。それがRFC1918 プライベートアドレス。具体的には以下のアドレス範囲だ。

10.0.0.0 - 10.255.255.255 (10.0.0.0/8)
172.16.0.0 - 172.31.255.255 (172.16.0.0/12)
192.168.0.0 - 192.168.255.255 (192.168.0.0/24)

上記のアドレス範囲は自分の家のネットワークに勝手に使って良い。3種類のサイズが用意されているが、複数のネットワークアドレスを好きなだけ使っていい。10.0.0.0/8は一つのネットワークアドレスだが、空間的はべらぼうにデカい。一方192.168.0.0/24はマスクが24bitなので自由な空間が8bitしかないが、ネットワークアドレス自体は256ある。(192.168.0.0/24, 192.168.1.0/24, .... 192.168.255.0/24のように)

このうち、一番小さいネットワークアドレスの最初のブロックが192.168.1.0/24だ。なのでこのアドレスがネットワーク製品のデフォルト値として登録されていることが多い(実は192.168.0.0/24でもいいんだけど、日本製の機器のデフォルトとしてはあまり見ない。かも)

そのため、一般家庭のネットワークアドレスはルータのデフォルト値を踏襲して192.168.1.0/24を使っているケースが多いんだけど、実際のところは172.16.0.0/16をドーンと割り当てても全く問題ないし、自分でサブネットを切って使っても良い。(例:172.16.1.0/24, 172.16.2.0/24)

これらのプライベートアドレスは一般家庭で無く、企業ネットワークでも普通に使われている。例えば本社では10.0.0.0/8、支社で192.168.X.0/24のように規模にあわせてデザインする。社内用の端末にグローバルアドレスをつけている例はあまりないはずだ。(なくはない。大昔からネット接続している企業とか)

ところでなぜこれらのアドレスは勝手に使っていいの? みんなが192.168.1.0/24を使ったらクアトロ・フォルマッジじゃん。と思うと思う。実はこのアドレスを使った通信はインターネット上には出て行けない。サービスプロバイダ側でブロックされている。なのでそもそもアドレスの競合を想定する必要が無いから自由に使っていいんです。

あれ? ウチのパソコンからネットみれるけどなぁ・・・

え! それじゃあ意味ないじゃん!

そのとおり。プライベートアドレスだけではあくまでローカルな接続で完結したネットワークしか作れない。Nintendoスイッチでインターネット対戦はできないし、スマホのWIFI接続でyoutubeを見ることもできない。なのでいつまで待ってもフォルマッジは来ない。ホントすまんです。でもまだあきらめないで。

実はプライベートアドレスを持つ複数の端末を1個のグローバルアドレスで代表できる夢の技術が存在する。それがNAPT(Network Port Address Translation)。PAT(Port Address Translation)、IPマスカレードともいう。こいつが天才なのでなんと一個のグローバルアドレスで数十〜数百のプライベートアドレスをもつ端末が自由にインターネット上の端末と通信できる。この機能が有能すぎてIPv6の普及は20年は遅れたと思う。

しかもインターネット側からの通信要求はデフォルトでブロックする。特にフィルターを設定しなくてもこちらから通信を開始した宛先サーバからの応答パケットだけが通過できるのだ。これはセキュリティなんて1ミリも気にしない一般家庭でのインターネット使用において非常に都合の良い安心設計だといえる。(NATの実装方式によって安全度の差がある)

NAPTはNAT(Network Address Translation)という技術の一部だが、NATのすべてを解説すると3年くらいかかると思われるのでまずは上記の2点、複数の端末を救済できる点と、外部からの接続要求には応えない点を把握しよう。

NAPT (PAT)の特徴

まず普通に通信した場合のIPパケットについて理解しよう。

ポート番号について

実はIP通信はIPアドレスだけで宛先を特定するのではない。ポート番号というものがある。端末のインタフェースまでを特定するのがIPアドレスで、端末のなかで稼働しているアプリケーションを特定するのがポート番号だと思って良い。たとえば郵便を送る場合、住所だけではなく、受け取ってほしい人の名前も書いとかないと家族の誰に宛ててきた郵便なのかわからないよね。この場合、住所がIPアドレスでポート番号が宛名になる。そんなかんじ。

たとえばWEBサーバの宛先ポート番号はTCP 80、DNSサーバへの宛先ポートはUDP 53 と決まっている。宛先ポート番号を見分けることによって同じサーバがWEBサーバとDNSサーバを兼務していてもちゃんとサービスが提供できるわけだ。

TCPとUDPの違いについては今は知らなくてもOK。どちらもポート番号がある

ポート番号には送信元の番号も設定される。送信元の場合、ほとんどの場合においてランダムな値がセットされる。送信元ポート番号は新しい通信が始まるときに都度ランダムに設定されるので、同じ端末から複数のWEBトラフィックを同じWEBサーバに発生させていても問題なく区別できる。この”送信元ポート番号はランダムでいい”、という点がNAPTのポイント。

上図の説明。PC1がSV1にHTTPで通信したところ。宛先IPアドレスはSV1、宛先ポートは80。送信元IPはPC1、送信元ポートは50001(ランダムに決まる)でパケットを送信している。返信のパケットは宛先と送信元がひっくり返っている。

ただ本来プライベートアドレスはインターネット上に送出されない。そのため、この図のような通信は(ルータの右側がインターネット上のネットワークだとすると)できない。プライベートアドレスを使っているパケットはサービスプロバイダ側で破棄される。

プライベートアドレスはあくまでローカルな世界でしか使えないということか・・・

次に説明するNAPTを使えばプライベートアドレスでもインターネットにアクセスできるぞ

NAPTの処理(内側からインターネット側へ)

さてNAPTの番です。NAPTの場合、まず内部側の端末からインターネット側に通信をする際に、次の処理を行う。

  1. 送信元IPアドレス、ポートが既にNATテーブルに登録されているかを確認する
  2. 送信元IPアドレスをグローバルアドレスに変換する(NATテーブルに登録済みならそれを使う)
  3. 送信元ポート番号を必要に応じて違う番号に変換する(NATテーブルに登録済みならそれを使う)
  4. 上記の2点を記述したNATテーブルエントリーを生成する(新規エントリーの場合)

上記手順2のとき、変換に使用するグローバルアドレスはルータが自分のインタフェースに割り当てているアドレスを流用して良い。これが大きなポイント。複数の端末が単一のグローバルアドレスを送信元アドレスとして使える。すべて同じIPアドレスに変換されると聞くと、それじゃあ全員の通信が混ざっちゃうじゃない、と思うかもしれないが、そこはポート番号を変えることにより区別できる。例えば2番目の端末PC2が通信し始めたとすると、以下のような状況になる。

PC1とPC2はどちらも100.1.1.1を送信元IPアドレスとして変換されるがそれぞれポート番号が違う。なのでそれぞれの通信はキチンと別々に到達する。このようにしてひとつのグローバルアドレスで複数の端末またはセッションをカバーできるようにしているのだ。(天才かよ)

NAPTではないただのNATの場合は変換前のアドレスと変換後のアドレスが1:1で必要になるぞ

NAPTの処理(インターネット側から内側へ)

前述の逆のプロセス。

  1. パケットの宛先、送信元のIPアドレス、ポート番号とマッチするエントリーがNATテーブルにあるか探す。なければDROPさせる
  2. NATテーブルに従って、宛先IPアドレスをオリジナルの送信元IPアドレスに変換する
  3. NATテーブルに従って、宛先ポートアドレスをオリジナルの送信元ポート番号に変換する

NAPTの場合、内側の端末が外側のサーバに通信を開始しないとNATテーブルのエントリーが作成されない。そのため、外部の端末から勝手に君の家のネットワークにアクセスすることはできない。

自宅にWEBサーバを立てて公開したい場合はどうすればいいんですか?

その場合は80番などの特定ポート用の静的NATを併用するといい

テーブルの管理

NATテーブルのエントリーはそのまま放置しておくとどんどん増えていつかすべてのポート番号を使い切ってしまう。なので、ある程度の時間参照されなかったエントリーは削除される。とはいえ、端末一台でも同時に数十のTCPセッションを発生させることはざらにある。なのでネットワークの規模によっては一個のグローバルアドレスだけではポート番号が足りなくなる可能性もある。まあお家で使う分には大丈夫。

一個のグローバルアドレスでは足りない場合は追加でグローバルアドレスを用意することより、保持できるエントリー数を増やせるものもあるぞ

まとめ

さてまとめ。

説明したこと
  • 192.168.1.0/24というのはプライベートアドレスの一部
  • プライベートアドレスではインターネットに出て行けないので競合を気にせず自由に使える
  • NAPTを使えば一個のグローバルアドレスで複数のプライベートアドレス端末をインターネットに接続できる
  • NAPTの場合、内部側の端末から開始した通信によるNATテーブルエントリーが存在しないかぎり、外部からの通信はできない

NATの実装はメーカーによって結構違う。なのでここでは概念を理解するにとどめて、実際の動作は実機で確認した方が良いよ。

なぜ192.168.1.0/24が多く使われているのか、なぜみんな同じアドレスを使っているのにちゃんとインターネット通信できるのかわかったと思う。

なるほどー。ウチのネットワークでもNAPTを使っているんですねきっと。

-惰性で学ぶIPv4
-