2015/09/03

国別フィルタの自動生成ツール (CentOS 版)

以前 FreeBSD 版の 国別フィルタの自動生成ツール を紹介したのだが、 最近 CentOS でもサーバを運用しているので CentOS 版を作成したので公開する事にした。 機能は FreeBSD 版同様 APNIC から IPアドレスの割当リストを取得して、 IPアドレスを CIDR 型式に修正した上で iptables (8) のコマンドラインパラメタを自動生成している。
今回は /etc/init.d/iptables を実行してフィルタを初期化した上で、 state RELATED,ESTABLISHED が含まれる行の次の行にルールの追加までを実行する。

  1#!/usr/bin/perl
  2# KRフィルタ
  3use Socket;
  4
  5# 拒否する国コード
  6@country = ('KR', 'CN');
  7# IPアドレス一覧取得URL
  8$url = "http://ftp.apnic.net/stats/apnic/delegated-apnic-latest";
  9
 10# iptables 初期化
 11system("/etc/init.d/iptables restart");
 12
 13# 挿入位置を取得 (接続済みパケットは許可する設定の次に挿入)
 14if(open(IN, "iptables -L INPUT --line-number|")){
 15    while(<IN>){
 16        if(/^(\d+).*RELATED,ESTABLISHED.*/){
 17            $rule = $1 + 1;
 18            last;
 19        }
 20    }
 21    close(IN);
 22}
 23
 24# 初期処理
 25foreach $i (@country){
 26    $country{$i} = 1;
 27}
 28
 29if(open(IN, "wget -q -O - $url|")){
 30    while(<IN>){
 31        if(/^apnic\|(..)\|ipv4\|(\d+.\d+.\d+.\d)\|(\d+)/){
 32            if($country{$1}){
 33                $table{inet_aton($2)} = $3;
 34            }
 35        }
 36    }
 37    close(IN);
 38
 39    # IPアドレス一覧を CIDR 型式に変換
 40    foreach $net (sort keys %table){
 41        $addr = unpack('N', $net);
 42        $num = $table{$net};
 43        while($num == $num[0] && ($addr ^ $addr[0]) == $num){
 44            shift @addr;
 45            shift @num;
 46            $addr &= ~$num;
 47            $num <<= 1;
 48        }
 49        unshift(@addr, $addr);
 50        unshift(@num, $num);
 51    }
 52
 53    # iptables 実行
 54    while (@addr){
 55        for($num = pop(@num), $mask = 32; $num > 1; $num >>= 1, $mask--){}
 56        $filt = inet_ntoa(pack('N', pop(@addr))) . "/$mask";
 57        system("iptables -I INPUT $rule -s $filt -j DROP");
 58        $rule++;
 59    }
 60}
 61
 620;
    


Copyright © 2008-2020 Mitzyuki IMAIZUMI. All rights reserved.