ごまかさずに理解する IP アドレスとサブネット
サブネット計算は面倒という評判がありますが、実際はひとつの考えを一貫して当てはめているだけです。アドレスは数値であり、プレフィックスは先頭の何ビットが固定かを示します。そこが腑に落ちれば、ホスト数も重なりも集約もすべてそこから導けます。本ガイドでは計算、特別な意味を持つ範囲、そして直感が崩れる場所を扱います。
アドレスは数値、プレフィックスは境界
IPv4 アドレスは単一の32ビット数値です。見慣れたドット表記は、その数値を人間の目のために4バイトへ割っただけのもの。192.168.1.10 は 3232235786 です。サブネットマスクがしているのは、その数値をどこで切るかを決めることだけ。先頭のビットがネットワークを、末尾のビットがその中のホストを表します。
CIDR 表記はその切れ目を直接書きます。`/24` は先頭24ビットがネットワークでホストに8ビット残る、`/26` は26ビットを固定して6ビット残す、という意味です。マスク 255.255.255.0 と接尾辞 `/24` は同じことの二通りの書き方であり、考える単位として便利なのはプレフィックス長のほうです。長さは個数なので、比較も包含判定も単なるビット演算になります。
プレフィックスを読む:総数と、使える数
IPv4 で長さ *n* のプレフィックスは 2^(32−n) 個のアドレスを含みます。`/24` は256、`/26` は64、`/30` は4です。通常のブロードキャスト・サブネットでは最初のアドレスがネットワーク識別子、最後がブロードキャストアドレスなので、使えるホスト数は2つ少ない254・62・2になります。最後の数が、ポイントツーポイント接続に伝統的に `/30` を使う理由です。
境界は任意ではありません。プレフィックスは常に自身のサイズの倍数から始まります。`/26` は .0、.64、.128、.192 にあり、その間にはありません——192.168.1.100/26 は実際には 192.168.1.64 から始まるブロックを指します。ふたつのプレフィックスは完全に入れ子になるか、まったく重ならないかのどちらかで、それがルーティングテーブルとファイアウォール規則を扱える理由です。
特別な意味を持つ範囲
IPv4 の3つの範囲はプライベート用途に予約され、公衆インターネットではルーティングされません。10.0.0.0/8、172.16.0.0/12(注意:172.x 全体ではありません)、192.168.0.0/16 です。ほかに 127.0.0.0/8 はループバック、169.254.0.0/16 はリンクローカル——DHCP が失敗したときに機器が自分に割り当てるアドレス——で、100.64.0.0/10 はキャリアグレード NAT。機器が「グローバル」なアドレスを報告しつつ到達不能でありうるのはこのためです。
これを知っていることは雑学以上の意味があります。ログが 10.x だらけならクライアントアドレスはプロキシの背後で記録されたということ、169.254 のアドレスはネットワークが立ち上がらなかったということ、そして「172 はプライベートではない」として 172.20.x をグローバル扱いするのは実際に繰り返される誤りです。許可リストが絡むなら、第1オクテットではなく範囲の境界を確認してください。
IPv6 は計算を変える
IPv6 アドレスは128ビットで、4桁の16進数グループ8つとして書きます。ゼロだけのグループが連続する箇所は1回だけ `::` に短縮できます——それ以上だと展開が一意に定まらないからです。グループ先頭のゼロは省略可能なので、同じアドレスに有効な表記が複数存在し、文字列比較は役に立ちません。比較や重複排除の前に正規化しましょう。
慣習も異なります。単一リンクの標準サイズが `/64` なので「ホストは何台か」という問いはたいてい意味を失います。ブロードキャストアドレスはなく、差し引くべきネットワーク/ブロードキャストの対もありません。プレフィックスは依然として入れ子のビット範囲なので、集約は IPv4 とまったく同じように働きます。数が桁違いに大きいだけです。
並べ替え、集約、比較
アドレスを文字列として並べ替えてはいけません。辞書順では 10.0.0.9 が 10.0.0.100 の後に、9.0.0.1 が 10.0.0.1 の後に来るので、そう並べたレポートは静かに間違っています。数値として並べ替えましょう。そうすれば隣接ブロックが隣り合い、それがあらゆる集約の第一歩になります。
集約は分割の逆です。同じ長さのふたつのプレフィックスが最後の1ビット以外すべて一致するなら、1ビット短いひとつのプレフィックスに統合できます。これを繰り返せば、散らかった許可リストがひと握りのブロックに縮み、規則数の上限や検索時間の面で実際に効いてきます。ただし、任意の開始〜終了レンジが常に単一のプレフィックスになるとは限りません。10.0.0.5〜10.0.0.20 を正確に覆うには複数のブロックが必要で、きりの良い `/27` に丸めれば意図しないアクセスまで許すことになります。
- `/24` = 256個、使用可能254個。`/26` = 64個で62個。`/30` = 4個で2個。
- プレフィックスは自身のサイズの倍数から始まる——192.168.1.100/26 は .64 のブロック。
- プライベート: 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。リンクローカル: 169.254.0.0/16。CGNAT: 100.64.0.0/10。
- アドレスは文字列ではなく数値として比較する。