アクセス制限などに使うために,日本に割り当てられた 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 からもリストを取得する必要がありそうだ。
コメント