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;