地域インターネットレジストリ(RIR: Regional Internet Registry)の用意している各国各地域に割り当てられているIPアドレスの割り当てリストから国コードを用いてデータを抽出し、一つにまとめることが可能な隣接するブロックは可能な限り一つにまとめ、結果を指定された出力形式で出力する。 IPv4のアドレスだけが対象。
とくにtcpserverで使える出力が欲しくて作った。10.2-3.のような出力ができる。
Objective Caml(OCaml)で書いてあるので多少は速い。
バグはある。
名称はそのうち変えるかもしれない。
このプログラムを使った結果について作者は何ら保証も補償もできない。ソースコードをよく読みこんでから使うこと。
このプログラムはOCamlを使って書いてあるので、コンパイルにはOCamlの開発環境が必要である。 また、OMake用の簡単なOMakefileを付けてあるので、OMakeとocamlfind(Findlib)があったほうがよいが、無くてもコンパイルはできる。
ソースコードを展開したディレクトリでOMakeを実行すると実行ファイルができる。
% omake
OMakeを使わずにコンパイルするならば次のようにする。
% ocamlopt -o cnfilter str.cmxa iPv4.ml range.ml cnfilter.ml
できた実行ファイルをどこか適当なところへ置く。 OMakeだとリンクになってたりするので実行ファイル本体を確認すること。 ファイル名は適当に変えてもよい。
% cp cnfilter /path/to/bin
いい加減なヘルプ表示でわかる?
Usage: cnfilter [options] [files] options: -a Print as abbrev notation if possible, e.g. 10.0.0.0/255.0.0.0 -> 10. -c Set country codes, for example -c CN,KR,BR. (default:all ipv4 records to be selected) -i Print something via stderr -k Keep network blocks without merging. This implies --sv -n Print as two integers separated by a tab.-p Print as CIDR or prefix length style like 192.168.1.0/24 -t Print as tcpserver style like 10.2-3. -v Invert matching. '-v -c JP' means all other codes except JP --cc Read a file for country codes. --cc /path/to/ccs --pre Set a phrase which is the leader of each line --post Set a phrase which is the follower of each line --sv Same as -n option but dot-decimal notation for start addresses -help Display this list of options --help Display this list of options
filesにはdelegated-apnic-latestとかそういうやつを指定する。 それらのファイルは別途用意すること。 ここに指定がなければ標準入力から読み込む。
-cオプションで国コードを指定する。 ファイルから国コードを読むときは--ccオプションを使う。 国コードを指定するファイルには一行に一つずつ国コードを書くこと。 行頭に国コードが書いてなさそうな行は無視する。 行末に余計な文字が付いたりする場合も余計な部分は無視するので適当にコメント付けてても大丈夫。 どこの国かわからないのあるじゃん。 -cも--ccも国コードは小文字で書いて大丈夫。
出力形式は-aとか-pとか-tとかで切り替えられる。 あと-nも。
--preとか--postで出力行の各行行頭行末に文字列が付加できる。 tcpserver向けだとたとえば次のように使えばよい。
% cnfilter -t --post :deny delegated-* 58.14-25.:deny 58.30-63.:deny 58.66-67.:deny ...
結果は標準出力へ出力される。
これぐらいか。 他にわからないことがあれば、ソースコードが相談相手になってくれる。