既存のブロックリストを変換して 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 形式に変換
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; }
やってることはたいしたことない
- 第2フィールドのIPアドレス部を前後2つに分割
- ipfilter.dat の書式に従い並べ替える
- 最終行に処理した行数をコメント出力
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.必要があればゼロ埋め
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 形式にできれば何かと重宝するかも