備忘録のため,内容の正当性については責任を持ちません。

アクセス制限などに使うために,日本に割り当てられた IP アドレスのリストを作成する。

APNIC から管轄エリア内の各国に割り当てられた IP アドレスのリストは,次の URL で公開されている。

  • ftp://ftp.apnic.net/pub/stats/apnic/delegated-apnic-latest

このリストは RIR statistics exchange format という形式になっている。具体的には次のような書式である。

Format:
    registry|cc|type|start|value|date|status[|extensions...]

簡単にいうと,これは「start から value 個のアドレスが cc (Country Code) に割り当てられている」ということを表す。

しかしこのままではアクセス制限などに利用できないので,次のようなスクリプト (conv.pl) を作成して,CIDR 表記に変更する。

$ vi conv.pl
#!/usr/bin/env perl

use strict;
use warnings;

while (<STDIN>) {
    chomp;
    my ($registry, $cc, $type, $start, $value, undef, $status) = split(/\|/);

    unless ($type eq 'ipv4' && ($status eq 'allocated' || $status eq 'assigned')) { next; }
    unless ($cc eq 'JP') { next; }

    my $SubnetMaskBin = sprintf('%b', scalar($value));
    if ($SubnetMaskBin !~ /^1(0+)$/) {
        # CIDR 表記できない
        next;
    }
    my $prefix = 32 - length($1);

    my $num = 0;
    $num = ($num << 8) + $_ foreach (split(/\./, $start));

    if (($num % $value) != 0) {
        # 分割しなければならない
        next;
    }

    print $start.'/'.$prefix."\n";
}

なお,現時点では CIDR 表記できない (value が 2 の倍数でない) 行や,複数のサブネットに分割しなければならない (ホストアドレス部が 0 にならない) 行は無いようなので,これらの場合は考慮していない。

さらに,同じ国に連続したブロックが割り当てられていると,複数の CIDR ブロックを集約 (aggregation) できる場合がある。この作業には,てっとり早く,aggregate という既存のプログラムを利用することにする。

# rpm -ivh http://***/aggregate-1.6-1.i386.rpm

これらのプログラムを用いて,最終的に,日本の IP アドレスのリストを次の手順で作成できる。

$ wget ftp://ftp.apnic.net/pub/stats/apnic/delegated-apnic-latest
$ perl conv.pl < delegated-apnic-latest | aggregate -q

なお,実際には APNIC 以外の RIR (Regional Internet Registry) からも僅かながら割り当てられているようなので,他の RIP からもリストを取得する必要がありそうだ。


参考リンク

コメント

コメントする




CAPTCHA