先日現場でCDKの実装のPRを確認している際に以下のような修正がありました。(エラーが出たから変更する必要があった)
- 192.168.16.0/19
+ 192.168.32.0/19
ネットワーク詳しい方なら理由は一目瞭然ですが、当時の自分はピンと来ず、
担当者に確認したため、なぜ 192.168.16.0/19 が不適切なのかを残しておきます。
結論
CIDR を「/19」に指定するとサブネットマスクは 255.255.224.0 で、ブロックサイズ(そのオクテットでネットワークが増える刻み幅)= 256 - 224 = 32 です。
したがって 有効なネットワーク開始値(第3オクテット)は 「0, 32, 64, 96, 128, 160, 192, 224」に限られます。
このため 192.168.16.0/19 は 16 が 32 の倍数でないため境界外で、不適切だったというわけです。
理由
上記の結論だけではわからない人も多いと思いますので、これから詳しく説明していきます。
まず、サブネットマスクは「どこまでがネットワーク部か」を示し、CIDR はその長さ(ビット数)を / で表す記法です。
「どこまでがネットワーク部か」と言うのは、言い換えれば、ネットワークに所属するホストの範囲を決めると言うことです。
今回の例で言えば、「/19(= 255.255.224.0 = 11111111.11111111.11100000.00000000)」の場合、第3オクテットの上位3bitがネットワーク部/下位5bitがホスト部となるため、32刻みでネットワークが始まります。
- 例:192.168.N.0/19 が表す範囲は 192.168.N.0 〜 192.168.(N+31).255
(N は 0, 32, 64, 96, 128, 160, 192, 224 のいずれか) - 総アドレス数は 8192、割り当て可能ホスト数は通常 8190(ネットワーク/ブロードキャスト除く)
つまり、「192.168.N.0/19」というのは、第3オクテットの下位5ビットと第4オクテットの8ビットの組み合わせをホストとして利用できるIPアドレスのCIDR範囲な訳です。
また、CIDR範囲はどのオクテットをどの範囲で切り分けるという考えのため、256を2^n(n:0~8)ずつ分けるという考えな訳です。
上記を踏まえた上で最初の以下のIP CIDRを確認してみてください。
192.168.16.0/19
/19はネットワークを第3オクテットの32ずつで切り分けようという考え方なのに対し、16ずつ切り分けようとしています。これは/20の切り分け方なので、CIDR範囲の範囲外となります。
その結果、エラーが出てしまったというわけです。
いかがでしたでしょうか?
CIDR範囲なんて基本/16、/24で分ければいいだろと思っていた人は、細かいCIDRの切り方をすると急にわからなくなるので、自分と一緒の疑問が出た方はぜひこの記事を読んで理解してみてください!