読者です 読者をやめる 読者になる 読者になる

KITA Eng.

北海道でサーバー技術者として歩み出したひとが綴るblog。

グローバルIPアドレス国別割り当てのデータを生成するスクリプトが書き上がるまでの道のりは険しかった…(原因編)

python3 shell script

kitaeng.hateblo.jp

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"の形になってくれるので、簡単だったんですが…。

手作業で例外部分だけ直すなんてのはちょっと美しくないのでどうしたものかとなったわけです。

皆さんならばどう解決しますか??

つづく...