#author("2017-12-16T22:24:44+09:00","default:nowsky","nowsky")
#author("2017-12-17T00:34:12+09:00","default:nowsky","nowsky")
*CountryCode IPList [#d36c24e3]
グローバルIPv4アドレス、ユニキャストIPv6アドレスは、
5つの地域インターネットレジストリ(RIR:Regional Internet Registry)で管理を行っており、
RIRで国別に割り当てたIPアドレスリストは都度更新される形でインターネット公開されている。
|LEFT:80|LEFT:|c
|CENTER:~RIR|CENTER:~IPLIST|
|[[ARIN:+https://www.arin.net/]]| http://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest|
|[[RIPE NCC:+https://www.ripe.net/]]|http://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-extended-latest|
|[[APNIC:+https://www.apnic.net/]]|http://ftp.apnic.net/pub/stats/apnic/delegated-apnic-extended-latest|
|[[LACNIC:+https://www.lacnic.net/]]|http://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-extended-latest|
|[[AfriNIC:+https://www.afrinic.net/]]|http://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-extended-latest|
 
スクリプトで国別IPアドレスリストが必要になり、RIRのアドレスリストを利用する事があるのだが、
セグメント情報がCIDR形式で記載されていない為、用する際に工夫が必要となる。
これら配布ファイルをCIDR形式に修正して一般公開しているサイトは多数あるのだが、
ファイルをIPv4/IPv6両方生成しつつ、デュアルスタックで配布サイト運営している所が無かったのでやってみた。
~
*注意事項 [#hb126ce1]
+ ファイル利用による損益について、&color(#ff0000){一切の責任を負いません};
+ 配布状況によって、ダウンロードURLの変更・ファイルの公開停止をする場合があります
+ 毎日深夜0時30分頃にファイルを更新しますが、メンテナンスで更新の遅れる事があります
+ ファイルを自動取得する場合、サーバ負荷軽減の為に&color(#ff0000){圧縮ファイルをご利用下さい};
+ ファイルの圧縮形式は違いますが元ファイルは全て同じ物となります
+ ファイルの圧縮形式は違いますが元ファイルは全て同じです
~
* ファイル [#fed9af0e]
#iframe(https://www.ns-lab.org/iplist/,style=width:100%;height:240px;,iestyle=width:100%;height:240px;)

* 利用例 [#z5383e2c]
|LEFT:80|LEFT:|c
|CENTER:~Format|CENTER:~ファイル展開|CENTER:~標準出力|
|gzip|$ tar zxf cidr_ipv4.gz|$ gzip -cd cidr_ipv4.gz|
|bzip2|$ tar jxf cidr_ipv4.bz2|$ bunzip2 -cd cidr_ipv4.bz2|
|xz|$ tar Jxf cidr_ipv4.xz|$ xzcat -cd cidr_ipv4.xz|
|LEFT:|LEFT:|c
|CENTER:~Format|CENTER:~ファイル展開|
|gzip|$ gzip -cd cidr_ipv4.gz > cidr_ipv4.txt|
|bzip2|$ bunzip2 -cd cidr_ipv4.bz2 > cidr_ipv4.txt|
|xz|$ xzcat -cd cidr_ipv4.xz > cidr_ipv4.txt|
~
----
~
* 説明 [#tc5b9b72]
IPアドレスリストをCIDR形式に整形するスクリプトについても、実際に当サーバで利用している物を公開。
スクリプトはLinuxでの実行を前提にPerlで作成してあります。
ライセンスについて、筆者が作成したスクリプトは好きに改変して問題ありませんが、
&color(#ff0000){外部ライブラリのライセンスについてはライブラリ配布元に帰属とします。};
~
* 参考サイト [#p360c105]
- [[Mark Suter:+https://zwitterion.org/software/aggregate-cidr-addresses/]]
- [[AbacusTechnologies:+https://kana.me/entry/ip-ranges-by-country]]
- [[てくにかるむ:+http://multix.jp/delegated-apnic-acl/]]
~
* スクリプト [#dc097c60]
|LEFT:80|CENTER:100|CENTER:100|c
|CENTER:~公開日|~ファイル名|~MD5|
|2017/12/15|[[iplist_20151215.zip:https://www.ns-lab.org/files/iplist/iplist_20171215.zip]]|b1d878a9d2f8472891b0a24b6b779d25|
|LEFT:80|CENTER:100|LEFT:100|LEFT:200|c
|CENTER:~公開日|~FILE|CENTER:~MD5|CENTER:~更新内容|
|2017/12/17|[[iplist_20171217.zip:https://www.ns-lab.org/files/iplist/iplist_20171217.zip]]|6aed24625f0aea04a4e4888a53560f7d|IPリストの圧縮処理を変更|
|2017/12/15|[[iplist_20171215.zip:https://www.ns-lab.org/files/iplist/iplist_20171215.zip]]|b1d878a9d2f8472891b0a24b6b779d25|初公開|
~
* 初期設定 [#qb8d13b2]
実行パス・ファイル保存先は変数に直書きしている為、下記に従って実行前に該当箇所を書き換えてください。
また、スクリプトにヘルプも埋め込んであるので、必要に応じて「./script.pl --help」で確認してください。
 
#region(&color(#ff0000){make-country-iplist.pl};)
 用途:スクリプト全体の統括、レポートメールの送信
 ---
 $CIDR_ROOT_DIR   = "出力ファイルの保存先"
 $MAIL_FROM       = "メールレポートの送信元アドレス"
 $MAIL_TO         = "メールレポートの宛先アドレス"
 $SCRIPT_ROOT_DIR = "スクリプトの保存ディレクトリ"
 $SCRIPT_OPTION   = "スクリプトの共通オプション"
#endregion
#region(&color(#ff0000){make-country-getrir.pl};)
 用途:RIRのIPアドレスリスト取得
 ---
 $CIDR_ROOT_DIR   = "出力ファイルの保存先"
#endregion
#region(&color(#ff0000){make-country-modify.pl};)
 用途:IPアドレスリストをCIDR形式に整形
 ---
 $CIDR_ROOT_DIR   = "出力ファイルの保存先"
#endregion
#region(&color(#ff0000){make-country-output.pl};)
 用途:整形済IPアドレスリストのテキスト化、ファイル結合処理
 ---
 $CIDR_SCRIPT     = "外部ライブラリの実行パス"
 $CIDR_ROOT_DIR   = "出力ファイルの保存先"
#endregion
#region(&color(#ff0000){make-country-webdir.pl};)
 用途:整形済IPアドレスリストの圧縮、WEBディレクトリへ複製
 ---
 $IPLIST_OWNER    = "WEB公開ファイルのユーザ"
 $IPLIST_GROUP    = "WEB公開ファイルのグループ"
 $IPLIST_PERMIT   = "WEB公開ファイルのパーミッション"
 $WEB_ROOT_PATH   = "WEB公開ファイルの保存先ディレクトリ"
 $CIDR_ROOT_DIR   = "出力ファイルの保存先"
#endregion
~
* 実行コマンド [#f18f6174]
スクリプト変数を下記内容に設定し、未記載の変数をデフォルトとした場合の実行例。
CPU処理速度にも左右されますが処理完了まで5分程時間が必要となります。
外部ライブラリ(aggregate-cidr-addresses)は、IPv6対応の為に1行書き換えてください。
-変数設定例
 $CIDR_ROOT_DIR   = "/var/iplist";
 $SCRIPT_ROOT_DIR = "/usr/local/bin/iplist";
 $CIDR_SCRIPT     = "/usr/local/bin/iplist/aggregate-cidr-addresses";
 $IPLIST_OWNER    = "www";
 $IPLIST_GROUP    = "www";
 $IPLIST_PERMIT   = "644";
 $WEB_ROOT_PATH   = "/var/www/htdocs";
~
-実行準備
 # cd /usr/local/bin/iplist
 # wget "https://zwitterion.org/software/aggregate-cidr-addresses/aggregate-cidr-addresses"
 # diff aggregate-cidr-addresses.orig aggregate-cidr-addresses
   89c89
   <     print $_->prefix(), "\n";
   ---
   >     print 6 eq $_->version ? $_->print() : $_->prefix(), "\n";
 
 # mkdir /var/iplist
 # chmod 755 make-country-*.pl aggregate-cidr-addresses
 # ls
   aggregate-cidr-addresses  make-country-iplist.pl  make-country-output.pl
   make-country-getrir.pl    make-country-modify.pl  make-country-webdir.pl
~
-実行方法
ローカル用IPリストの生成(WEB公開無し)
 $ ./make-country-iplist.pl
 
WEB公開用IPリストの生成
 $ ./make-country-iplist.pl --web
 
ヘルプの表示
 $ ./make-country-iplist.pl --help