digital 千里眼 @abp_jp

アナログな日常とデジタルの接点

既存のブロックリストを変換して ipfilter.dat を作成する

  • 「%03s」は間違い。正しくは「%03d

2010-08-06 修正

I-BlockList( http://iblocklist.com/lists.php )のブロックリストを利用する

元々は PeerGuardian, Protowall, and Moblock 等で使うためのリストのようです。フォーマットが多少違うだけなので自分で変換して使えるようにすればいいですね

ブロックリストの書式を確認

具体的にいくつかのリストを見てみる

# List distributed by IBlocklist.com
# List builder v6
 
LOW ID:000.000.000.000-000.255.255.255
DoD NIC:006.000.000.000-007.255.255.255
IBM:009.000.000.000-009.255.255.255
LII DoD HP:011.000.000.000-011.255.255.255
        続く
  • コロン区切り
  • 2フィールドからなるリスト
  • 第1フィールドはコメント(余白有り)
  • 第2フィールドがIPアドレス範囲
  • 第2フィールド内で開始アドレスと終了アドレスがハイフン(-)でつながれている
# List distributed by IBlocklist.com
# List builder v6
 
sh_drop:110.44.0.0-110.44.15.255
sh_drop:115.166.64.0-115.166.95.255
sh_drop:116.199.128.0-116.199.159.255
sh_drop:116.50.8.0-116.50.15.255
        続く
  • IPアドレスがゼロ埋めされているリストとされていないリストが存在する
  • コメント行は先頭がシャープ記号

であることがわかります。ではさっそく変換を始めましょう

1.コメント部の掃除

第1フィールド(=コメント部)内で問題となるのは区切り文字(デリミタ)が混入するケースだ。awk でうまく切り分けられなくなる。コロンが2重についてるともっと厄介だ。これらを掃除するとしよう

  • コロンの連続をなくす
sed -e "s/:\+/:/ig" 処理対象のファイル
  • コロンの連続をなくした結果、先頭に空白ができるかもしれないのでそれの除去
sed -e "s/:\+/:/ig" 処理対象のファイル | sed -e "s/^ +//mg"
  • 1行に2つのコロンは必要ありません。前方のコロンを空白に置き換えます(IBlockList.sed
# Cleaning ":" in the 1st field because ":" should be used only for field separator.
s/^\(.*\):\([^:]\+\):\([^:]\+\)$/\1 \2:\3/img

使い方は至ってシンプル。でも適当な回数繰り返す必要がある...ここら辺は改善の余地有りです

sed -e "s/:\+/:/ig" 処理対象のファイル | sed -e "s/^ +//mg" | sed -f IBlockList.sed | sed -f IBlockList.sed | sed -f IBlockList.sed | sed -f IBlockList.sed | sed -f IBlockList.sed | sed -f IBlockList.sed

2.ipfilter.dat 形式に変換

  • awk を使います。コードは以下の通り
  • ファイル名は"IBlockList.awk"とします
BEGIN {
    FS = ":";
#    OFS = ",";
    match_counter = 0;
}

/^ *[^#]/ && /:/ && /-/ {
    if( split($2, IPFromTo, "-") != 2 )
    {
        print "[Error]:split failed:", FNR, $2, split($2, IPFromTo, "-");
        exit 2;
    }
    printf "%-s - %-s , %03d , %s\r\n", IPFromTo[1], IPFromTo[2], 40, $1;
    ++match_counter;
}

END {
    printf "### The total number of matched records in the IBlockList: %d\r\n", match_counter;
}

やってることはたいしたことない

  1. 第2フィールドのIPアドレス部を前後2つに分割
  2. ipfilter.dat の書式に従い並べ替える
  3. 最終行に処理した行数をコメント出力
sed -e "s/:\+/:/ig" 処理対象のファイル | sed -e "s/^ +//mg" | sed -f IBlockList.sed | sed -f IBlockList.sed | sed -f IBlockList.sed | sed -f IBlockList.sed | sed -f IBlockList.sed | sed -f IBlockList.sed | gawk -f IBlockList.awk

3.必要があればゼロ埋め

以前使った FillByZero.awk を使います

sed -e "s/:\+/:/ig" 処理対象のファイル | sed -e "s/^ +//mg" | sed -f IBlockList.sed | sed -f IBlockList.sed | sed -f IBlockList.sed | sed -f IBlockList.sed | sed -f IBlockList.sed | sed -f IBlockList.sed | gawk -f IBlockList.awk | gawk -f FillByZero.awk >ipfilter.dat

ハイできあがり!!ipfilter.dat のイメージは

000.000.000.000 - 000.255.255.255 , 040 , LOW ID
006.000.000.000 - 007.255.255.255 , 040 , DoD NIC
009.000.000.000 - 009.255.255.255 , 040 , IBM
       中 略
222.082.249.232 - 222.082.249.239 , 040 , WLMQ NONGJITUIGUANG
222.126.123.168 - 222.126.123.175 , 040 , Tabernacle FaiTh Inter Inc
222.133.028.128 - 222.133.028.191 , 040 , Dezhou River Affair Bureau
### The total number of matched records in the IBlockList: 6465

今回紹介した書式のブロックリストは多いので、自分で ipfilter.dat 形式にできれば何かと重宝するかも