ひとことで言うと
CIDRとは、インターネットにおける土地の区画整理みたいなもの。広大でカオスなIPアドレスの野原を、データが自分の家を見つけられるように、きちんと管理された「ご近所」に変える方法なんだ。
これが解決する問題
1980年代初頭のインターネットに思いを馳せてみましょう。当時はシンプルでした。IPアドレスが必要なら、その「クラス」を申請するだけ。主な選択肢は3つありました。
- クラスA: 16,777,214個のホストアドレス。巨人向け。
- クラスB: 65,534個のホストアドレス。大規模組織向け。
- クラスC: 254個のホストアドレス。小さいやつら向け。
この「クラスフル」なシステムは硬直的で、信じられないほど無駄が多かったのです。例えば、300個のIPアドレスが必要だとしましょう。クラスCでは小さすぎるので、クラスBを取得しなければなりません。おめでとうございます。あなたは65,534個のアドレスを手に入れ、そのうち65,234個を無駄にすることになりました。スクーターが欲しいだけなのに、16輪の巨大トラックを買わされるようなものでした。
1990年代初頭には、専門家たちはデジタルの世界の終わりが地平線の向こうに見えていました。そう、IPアドレスが枯渇するという問題です。インターネットのコア・ルーターが使うグローバルなアドレス帳であるルーティングテーブルも爆発的に増大し、システム全体を這うような速度にまで低下させる恐れがありました。
1993年、あるエンジニアグループがRFC 1518と1519を発表し、Classless Inter-Domain Routing、略してCIDR(「サイダー」と読みます)を定義しました。CIDRは、硬直的なクラスA/B/Cを捨て去りました。そして、どんなサイズのアドレスブロックでも定義できる、新しい柔軟な方法を導入したのです。
これはまさにゲームチェンジャーでした。これにより、インターネットサービスプロバイダ(ISP)は顧客に「ちょうどいい」サイズのアドレスブロックを割り当てることができるようになり、IPv4アドレスの枯渇を劇的に遅らせました。また、「ルート集約」も可能になり、ルーティングテーブルの1つのエントリで何千もの個別のルートを表現できるようになりました。これにより、インターネットのバックボーンが自重で崩壊するのを防いだのです。
内部の仕組み
CIDRを理解するには、まず「IPアドレスは人間のためではなく、コンピュータのためにある」という根本的な真実を受け入れる必要があります。ドット区切りの10進数形式(192.168.1.10)は、私たちが自分に言い聞かせている、便利なウソにすぎません。現実はバイナリなのです。
まずはIPアドレスと2進数のおさらい
IPv4アドレスは32ビットの数値です。それだけ。32個の1と0の並びです。私たちはそれを読みやすくするために、4つの8ビットの塊(オクテット)に切り分け、それぞれを10進数(0-255)に変換しているのです。
172.20.129.45 を例にとってみましょう。
172 . 20 . 129 . 45
10101100 . 00010100 . 10000001 . 00101101
CIDRを含むすべてのIPネットワークの計算は、このバイナリレベルで行われます。
サブネットマスク:魔法の解読リング
すべてのIPアドレスは二重生活を送っています。アドレスの一部は、それが属するネットワーク(通りの名前)を識別し、もう一部は、そのネットワーク上の特定のホスト(家の番号)を識別します。
コンピュータは、どこで一方の部分が終わり、もう一方が始まるのかをどうやって知るのでしょうか? それはサブネットマスクを使います。サブネットマスクは、フィルターのように機能するもう一つの32ビットの数値です。仕組みはこうです。
- サブネットマスクは、連続する
1の後に連続する0が続く形をしています。 1の部分は、アドレスのネットワーク部に対応します。0の部分は、アドレスのホスト部に対応します。
ネットワークアドレスを見つけるために、コンピュータはIPアドレスとサブネットマスクの間でビット単位の AND 演算を実行します。
IPアドレスが 172.20.129.45 で、マスクが 255.255.0.0 だとしましょう。
IPアドレス: 10101100.00010100.10000001.00101101 (172.20.129.45)
サブネットマスク: 11111111.11111111.00000000.00000000 (255.255.0.0)
-----------------------------------------------------------------
ネットワークID: 10101100.00010100.00000000.00000000 (172.20.0.0)
結果の 172.20.0.0 が、このネットワーク内のすべてのデバイスに共通の「通りの名前」になります。
CIDRの登場:サブネットマスクの省略形
255.255.255.0 のように書き出すのは面倒です。CIDR表記はシンプルな省略形です。IPアドレス、スラッシュ(/)、そしてサブネットマスクの先頭に並ぶ 1 の数を書くだけです。この数字はプレフィックス長と呼ばれます。
| CIDRサフィックス | サブネットマスク | 1の数 |
バイナリマスク |
|---|---|---|---|
| /8 | 255.0.0.0 | 8 | 11111111.0000... |
| /16 | 255.255.0.0 | 16 | 11111111.11111111.0000... |
| /24 | 255.255.255.0 | 24 | 11111111.11111111.11111111.00000000 |
| /29 | 255.255.255.248 | 29 | ...11111111.11111000 |
| /32 | 255.255.255.255 | 32 | すべて1(単一ホスト) |
というわけで、マスクが 255.255.0.0 の 172.20.129.45 は、単に 172.20.129.45/16 と書けます。ちょろいもんです。
知りたい情報を計算してみよう
10.50.84.111/22 のようなCIDRアドレスが与えられれば、そのネットワークのご近所に関するすべてを解き明かすことができます。
プレフィックス:
/22。これは、22ビットがネットワーク用で、残りの32 - 22 = 10ビットがホスト用であることを意味します。ネットワークアドレス: これは範囲の最初のアドレスで、ホスト部のビットがすべて
0になります。AND演算で見つけます。- IP:
10.50.84.111->00001010.00110010.01010100.01101111 - マスク
/22:255.255.252.0->11111111.11111111.11111100.00000000 AND演算結果:00001010.00110010.01010100.00000000->10.50.84.0- つまり、ネットワークアドレスは
10.50.84.0です。
- IP:
ホスト数: ホスト部は10ビットあります。可能なアドレスの数は
2^10 = 1024です。利用可能なホスト数: 2つのアドレスを引かなければなりません。なぜでしょう?
- 最初のアドレス(ホストビットがすべて
0)は、ネットワークアドレスそのものです。これは通りの名前であって、家そのものではありません。 - 最後のアドレス(ホストビットがすべて
1)はブロードキャストアドレスです。ここにパケットを送るのは、ネットワーク上のすべてのデバイスに「みんな、聞いてくれ!」と叫ぶようなものです。
- したがって、利用可能なホスト数 =
(2^10) - 2 = 1024 - 2 = 1022となります。
- 最初のアドレス(ホストビットがすべて
ブロードキャストアドレス: これは、ネットワークアドレスのホストビットをすべて
1にしたものです。- ネットワーク:
00001010.00110010.01010100.00000000 - ブロードキャスト:
00001010.00110010.01010111.11111111->10.50.87.255
- ネットワーク:
ホストの範囲: 利用可能なアドレスは、ネットワークアドレスとブロードキャストアドレスの間のすべてです。
- 利用可能な最初のホスト:
10.50.84.1(ネットワークアドレス + 1) - 利用可能な最後のホスト:
10.50.87.254(ブロードキャストアドレス - 1)
- 利用可能な最初のホスト:
つまり、10.50.84.111/22 は 10.50.84.0 ネットワーク上のホストであり、このネットワークは 10.50.84.1 から 10.50.87.254 までの1022台のデバイスをサポートします。
実話にもとづく話
### クラウド費用大惨事
あるイケてる新進気鋭のスタートアップが、パブリッククラウドにインフラを立ち上げました。コーディングに早く取り掛かりたかった彼らは、Virtual Private Cloud (VPC) のデフォルトのネットワーク設定をそのまま受け入れ、巨大な /16 ブロック(65,534個のIP)を確保しました。数ヶ月後、彼らのクラウド環境間に直接的で安全な接続を必要とする大口クライアントを獲得しました。問題は?そのクライアントもまた、まったく同じデフォルトの /16 ブロックを使用していたのです。彼らのアドレス空間、10.10.0.0/16 と 10.10.0.0/16 は、完全に同一でした。同じアドレスだと主張する2つの場所の間でルーティングはできません。そのスタートアップは、血眼になって1週間を費やし、重複しない新しいCIDR範囲でネットワーク全体をゼロから再構築する羽目になりました。
教訓: ネットワークアドレス空間の計画は、都市計画のように行いましょう。今は小さな村しか必要なくても、後で他の都市と接続するための高速道路の余地を残しておくのです。デフォルト設定をそのまま受け入れてはいけません。
### 謎のオフラインデバイス
ある若手ネットワーク管理者が、新しい監視サーバーをセットアップするタスクを任されました。彼に与えられたIP範囲は 192.168.100.0/24 でした。彼はサーバーに 192.168.100.255 というIPを設定しました。サーバーのネットワークインターフェースは起動しましたが、それはまるで幽霊のようでした。ゲートウェイにpingを打つこともできず、ネットワーク上の何もそのサーバーにpingを打つことができませんでした。ケーブルをチェックしたり、ドライバを再インストールしたりして1時間格闘した後、先輩エンジニアが通りかかり、画面を2秒見てこう言いました。「それ、ブロードキャストアドレスだよ」。IPを 192.168.100.254 に変更すると、即座にオンラインになりました。
教訓: どんなサブネットでも、最初と最後のアドレスは特別で、ホストには割り当てられません。それらはそれぞれ、ネットワークのアイデンティティとその拡声器なのです。
### 自宅Wi-Fiの魔術師
ある開発者の自宅ネットワークはめちゃくちゃでした。ラップトップ、スマホ、スマートTV、スピーカー、電球、そして「スマート」トースターまであり、デバイスが常にWi-Fiから切断されていました。ルーターの管理ページを見ると、DHCPサーバーが 192.168.1.0/28 の範囲で設定されていることに気づきました。ちょこっと計算してみると、/28 は (2^(32-28)) - 2 = 14 個の利用可能なIPアドレスしか提供しないことがわかりました。彼女の家族は30以上のデバイスを持っていたのです!彼女はLANのサブネットマスクを 255.255.255.240 (/28) から 255.255.255.0 (/24) に変更し、利用可能なIPを254個に拡張しました。Wi-Fiの不安定さは一瞬で消え去りました。
教訓: サブネット化はデータセンターだけのものではありません。あなたのローカルネットワークに何台のデバイスが参加できるかを決定し、不適切に設定されたサブネットは「Wi-Fiの調子が悪い」よくある原因なのです。
よくある間違いと落とし穴
- 予約済みの2つを忘れる。 古典的なoff-by-twoエラー(2つずれるミス)です。
2^hを計算して、それだけのアドレスがあると誰かに伝えてしまいますが、ネットワークアドレスとブロードキャストアドレスを引くのを忘れています。これは設定エラーや、ほんの少しだけ小さすぎるネットワークにつながります。 - サブネットの重複。 クラウドの話で見たように、通信する必要のある2つのネットワークが重複したIP範囲を持っている場合、地獄を見ることになります。ルーティングが曖昧になり、複雑で醜いNAT(ネットワークアドレス変換)のハック技なしでは、しばしば不可能になります。事前に計画しましょう!
- 10進数で考える。 10進数の数字を見ているだけでは、サブネット化を正しく理解することはできません。
192.168.0.255と192.168.1.0は隣り合っているように見えます。/24のネットワークにいれば、これらは別のネットワークです。/23のネットワークにいれば、これらは同じネットワークです。すべてはバイナリの境界がどこにあるかにかかっています。 /31の誤用。/31は2^(32-31) = 2個のアドレスを持ちます。古いルールでは、ネットワークアドレスとブロードキャストアドレスを予約すると、利用可能なホストはゼロになりました。しかし、RFC 3021 は、ブロードキャストが不要な特別なポイントツーポイントリンク(例:2つのルーターを接続する)のためにこれを更新しました。クライアントがいる通常のネットワークでは、これは役に立ちません。- プレフィックスのタイプミス。
/24のつもりが/23とタイプするのは簡単です。1桁の違いが、254ホストのネットワークと510ホストのネットワークの違いになる可能性があり、ネットワークの境界を完全に変え、競合を引き起こす可能性があります。プレフィックスはダブルチェックしましょう。
なぜこれを気にかけるべきなのか
これは筋金入りのネットワークエンジニアだけの話だって?だとしたら、それは間違いです。
- クラウド&DevOpsエンジニア: これはあなたの日常そのものです。AWS、Azure、GCPでVPC/VNETを設計することは、まさにCIDR計画の演習です。最初にこれを間違えると、後で高価で複雑な移行が必要になります。
- バックエンド開発者: データベースに接続できませんか? アプリサーバーが
10.0.1.0/24に、DBが10.0.2.0/24にあるのかもしれません。それらの間にルーターが設定されていなければ、それらはまるで別の惑星にいるようなものです。サブネットを理解することは、基本的なデバッグのステップです。 - セキュリティ専門家: ファイアウォールのルールは、しばしばCIDRブロックに基づいています。オフィス全体からのアクセスを許可するために、200個の個別のIPを追加するのではなく、
10.5.0.0/22のための1つのルールを追加します。既知の悪意ある攻撃者をブロックするには、彼らのCIDR範囲をブロックします。 - コードを実行するすべての人:
localhostでしか作業しないとしても、あなたはネットワークを使っています。127.0.0.1が巨大な127.0.0.0/8ループバックブロックの中の1つのホストにすぎないことを知っていると、ローカル開発の中核部分の謎を解き明かす助けになります。
相互接続されたサービス、コンテナ、クラウドインフラの世界では、ネットワークはもはや他人事ではありません。そのアドレス帳を理解することは、現代の開発者にとってのスーパーパワーです。
さらに深く
- RFC 4632: Classless Inter-domain Routing (CIDR) - 初期のRFCに取って代わった現代の仕様書。
- RFC 1918: Address Allocation for Private Internets - おなじみのプライベートIP範囲(
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16)を定義したドキュメント。 - RFC 3021: Using 31-Bit Prefixes on IPv4 Point-to-Point Links -
/31を便利にし、IPアドレスを節約する仕様書。 - Wikipedia: Classless Inter-Domain Routing - 歴史的背景を含む、素晴らしくハイレベルな要約。
- Wikipedia: Subnetwork - サブネット化とマスクの仕組みに関する詳細な解説。