3秒でわかる
IP アドレスの範囲を「先頭アドレス / 何ビットを固定するか」の形で表す記法。サブネット設計やアクセス許可の指定に使います。
もう少し詳しく
どういうものか
Classless Inter-Domain Routing の略で、IP アドレスの集まりを 192.168.1.0/24 のように書く記法。スラッシュの後ろの数字はプレフィックス長といい、32 ビットのアドレスのうち先頭から何ビットがネットワーク部として固定されるかを表す。残りのビットが、その中の個々の機器に割り当てられる部分になる。
/24 なら先頭 24 ビットが固定で、残り 8 ビットが自由に動く。組み合わせは 2 の 8 乗で 256 通り、つまり 192.168.1.0 から 192.168.1.255 までを指す。
なぜ必要か
かつては先頭のビット列で A、B、C とクラスが決まっており、少し多めに要るだけで 65536 個の枠を渡すような無駄が生じていた。CIDR は境界をビット単位で自由に決められるため、必要な規模に近い大きさで切り出せる。クラウドの VPC 設計、ファイアウォールの許可設定、ルーティングの記述は、いずれもこの記法で書く。
具体例
10.0.0.0/16 -> 10.0.0.0 から 10.0.255.255 まで 65536個
10.0.1.0/24 -> 10.0.1.0 から 10.0.1.255 まで 256個
10.0.1.0/28 -> 10.0.1.0 から 10.0.1.15 まで 16個
203.0.113.7/32 -> 203.0.113.7 のみ 1個
0.0.0.0/0 -> すべてのIPアドレスホスト数は 2 の (32 - プレフィックス長) 乗で求まる。/24 なら 2 の 8 乗で 256、/28 なら 2 の 4 乗で 16 になる。
Python なら計算を任せられる。
import ipaddress
net = ipaddress.ip_network("10.0.1.0/28")
print(net.num_addresses) # 16
print(net.network_address, net.broadcast_address)
print(ipaddress.ip_address("10.0.1.9") in net) # Trueつまずきやすいところ
数字が大きいほど広いと勘違いすること。実際は逆で、/16 は広く、/28 は狭い。固定されるビットが増えるほど、動ける範囲が減ると考えると間違えにくい。
使える IP の数も注意点になる。/24 の 256 個のうち、先頭はネットワークアドレス、末尾はブロードキャストアドレスとして予約され、機器には割り当てられない。AWS ではさらに各サブネットの先頭 4 個と末尾 1 個が予約されるため、/28 の 16 個のうち使えるのは 11 個になる。
セキュリティグループに 0.0.0.0/0 を書くと全世界からの接続を許すことになる。SSH の 22 番で開けたまま放置する事故が後を絶たない。
覚え方
/ の後ろは「固定する長さ」。長く固定するほど動ける余地は狭い。