グローバルIPアドレス国別割り当てのデータを生成するスクリプトが書き上がるまでの道のりは険しかった…(原因編)
RIRsが提供してくれている、RIR statistics exchange formatになっているIPアドレスの割り当て状況のデータを加工するスクリプトを書きました。思考、試行過程をちょっと備忘録的に記録しておきます。
RIR statistics exchange formatについて
このフォーマットの仕様が道のりを険しくする最大の要因です。
普段IPアドレスの一覧を作るときや、iptablesとかの設定に入れるときは、
- "192.168.2.1" <-- 個別のIPそれぞれ
- "192.0.2.0/24" <--ブロックでまとめて
と表現することが多いと思います。IPアドレスの国別IPアドレス割り当てなんて話になれば、膨大な数のIPアドレスを扱うことになるので、個別のIPを列挙していくというよりも、ブロックでまとめての表現をつかうのがベターと思うのですが……。
RIR statistics exchange formatでは、割り当て開始のIPアドレスと、そこから何個分を割り当てているかという形で表現されています。そこから何個分を割り当てているかというところが鬼門です。
CIDR表記で扱う時の各CIDRに対応するIPアドレスの個数は、2 ^ (32 - CIDR)
で表せて、
CIDR | IPアドレス数 | CIDR | IPアドレス数 | |
---|---|---|---|---|
/32 | 1 | /16 | 65,536 | |
/31 | 2 | /15 | 131,072 | |
/30 | 4 | /14 | 262,144 | |
/29 | 8 | /13 | 524,288 | |
/28 | 16 | /12 | 1,048,576 | |
/27 | 32 | /11 | 2,097,152 | |
/26 | 64 | /10 | 4,194,304 | |
/25 | 128 | /9 | 8,388,608 | |
/24 | 256 | /8 | 16,777,216 | |
/23 | 512 | /7 | 33,554,432 | |
/22 | 1,024 | /6 | 67,108,864 | |
/21 | 2,048 | /5 | 134,217,728 | |
/20 | 4,096 | /4 | 268,435,456 | |
/19 | 8,192 | /3 | 536,870,912 | |
/18 | 16,384 | /2 | 1,073,741,824 | |
/17 | 32,768 | /1 | 2,147,483,648 | |
/0 | 4,294,967,296 |
という具合になるわけですが、RIR statistics exchange formatでは、この表に出てくるIPアドレス数以外の個数が現れます。
「えっ!?」ってなりますよね?
例えばこんなレコードがあります。value
というのがIPアドレスの個数です。
registry | cc | start | value | date | status |
---|---|---|---|---|---|
ripencc | CH | 195.242.163.0 | 768 | 20080617 | assigned |
768個って、上の表では出てきません。768 = 256 * 3
なので、なるべくブロックが細かくならないように分けるとすると、/24と/23で分割してあげないといけません。
registry | cc | start | value | date | status |
---|---|---|---|---|---|
ripencc | CH | 195.242.163.0 | 256 | 20080617 | assigned |
ripencc | CH | 195.242.164.0 | 512 | 20080617 | assigned |
こんな具合に書いていてくれればいいんですけど、そうじゃない……。
上のCIDR一覧に出てくるような数字だけが、valueに入っているなら、単純にvalueの部分を対応するCIDRに置換していって、開始IPアドレスのstart
と結合してあげれば、"192.0.2.0/24"の形になってくれるので、簡単だったんですが…。
手作業で例外部分だけ直すなんてのはちょっと美しくないのでどうしたものかとなったわけです。
皆さんならばどう解決しますか??
つづく...