IPアドレスとサブネット — どこまでが自分の町なのか
一言でいうと
IPアドレスは、ネットワーク部とホスト部に分かれ、その境界を決めるのがサブネットマスクで、この境界が、「直接送れる相手」と「ゲートウェイに任せるべき相手」を分けます。
なぜ必要なのか
世界中のすべてのホストを、1つの表に収めることはできません。ルーターが40億件のエントリを調べることはできないからです。そのため、アドレスに階層を入れました。前半が同じアドレスを1つの塊にまとめて、「この塊は向こうへ」と1行で書けるようにしたのです。
どう動くのか
192.168.10.37/24の/24は、前半24ビットがネットワーク部という意味です。つまり、ネットワークは192.168.10.0で、ホスト部は最後の8ビットです。
- 使用可能なアドレスは、2の8乗からネットワークアドレスとブロードキャストアドレスを引いた254個です。
/25に分けると、半分ずつ2つになり、それぞれ126個になります。/30は、4個のうち2個だけが使えるので、ルーター同士をつなぐリンクに使われます。
ホストがパケットを送るときの判断は単純です。宛先アドレスと自分のアドレスに、それぞれマスクをかけて、ネットワーク部が同じなら、同じネットワークなので、ARPで相手のMACアドレスを調べて、直接送ります。違えば、デフォルトゲートウェイのMACアドレスに送ります。このとき、IPヘッダーの宛先は最終的な宛先のままで、リンク層の宛先だけがゲートウェイになる点が核心です。
ルーターの判断は、最長プレフィックス一致(longest prefix match)です。ルーティングテーブルに10.0.0.0/8と10.1.2.0/24の両方があり、宛先が10.1.2.5なら、より具体的な/24のほうを選びます。デフォルトルート0.0.0.0/0は、プレフィックス長が0なので、常に最後の候補です。
プライベートアドレス帯(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)は、インターネットでルーティングされません。そのため、外へ出るときにNATが送信元アドレスをパブリックアドレスに書き換え、ポート番号で、どの内部ホストの接続かを記憶します。NATが状態を持つという事実から、いくつもの結果が導かれます。外から中へ先に接続をかけることはできず、長く静かな接続はNATの表から消されて切れます。アイドル状態の接続が、数分後に静かに死ぬ現象のよくある原因です。
現場での姿
Kubernetesクラスターを作るとき、Pod CIDR、Service CIDR、ノードネットワークが重なると、ルーティングが静かに壊れます。重なった区間のトラフィックが見当違いの場所に行き、症状は「特定のPod同士だけが通信できない」のように、散発的に現れます。アドレス帯の設計は、クラスターを作る前に、紙に書き出しておくほうがよいです。後で変更するには、クラスターを作り直す必要がある場合が多いからです。
続くクイズで確認すること
マスクでネットワークを計算し、最長プレフィックス一致で次のホップを選ぶ過程をたどれるかを確認します。