特定のIPアドレスをブロックしたい場合は,どうするのが,運用的に良いか考えてみた。
- 自宅サーバで,ルータ経由でアクセスしており,ルータでもIPフィルタの指定は可能であるが,ルータの処理が重くなるので,自宅のPC全てのインターネットアクセスが遅くなる。ルータではIPアドレスのフィルタは行うべきではない。
外からのアクセスは,ルータでIPマスカレードの指定で行っているので,公開しているサーバ上で,IPアドレスのブロックをすれば良い。 - RedHat系のiptablesのツールだと,デフォルトは全てブロックして,RH-Firewall-1-INPUTというチェインに許可するポート番号等を指定するようになる。あまり,system-config-securitylevelのツールなどに影響を与えたくないので,RH-Firewall-1-INPUTチェインをいじりたくない。
- RH-Firewall-1-INPUTチェインの前に,1つチェインを用意して,IPを指定していくのが良いのではないか。
- パケットは,state NEWだけ拾えば,良いだろう。(それ以外は,コネクションが無ければ無視される)。
#! /bin/sh
# create_chain.sh 下のコードは,大まかな処理の流れを示している。実際のコードはリンク先を参照のこと
iptables -N FIL0-MYINPUT
iptables -I INPUT -p tcp -m state --state NEW -j FIL0-MYINPUT
これで,FIL0-MYINPUTが,RH-Firewall-1-INPUTチェインの前に挿入される。これに,ブロックするIPアドレスを追加していけば良いだろう。
#!/bin/sh
# add_ip.sh [-l] <TAG> <IP/Network Address>... 下のコードは,大まかな処理の流れを示している。実際のコードはリンク先を参照のこと
TAG=$1
FIL=DROP-$1
REJ=Rej-$1
shift
iptables -N ${FIL}
# iptables -A ${FIL} -j LOG --log-prefix "[${REJ}]" # ログを出力する場合,コメントを外す
iptables -A ${FIL} -j DROP
for IP in $* ; do
iptables -A FIL0-MYINPUT -s ${IP} -j ${FIL}
done
IPアドレスのリストをファイルにして,取り込む場合,add_ip.shを以下のようにしても良い。
#!/bin/sh
# add_ipfilter.sh [-l] <TAG> <Block List Ffile> 下のコードは,大まかな処理の流れを示している。実際のコードはリンク先を参照のこと
TAG=$1
FIL=DROP-$1
REJ=Rej-$1
BLOCKLIST=$2
iptables -N ${FIL}
iptables -A ${FIL} -j LOG --log-prefix "[${REJ}]"
iptables -A ${FIL} -j DROP
cat ${BLOCKLIST}|
while read line ; do
IP=`echo $line|sed -e 's/\#.*//' -e 's/[ \t]//g'`
if [ ! -z $IP ] ; then
iptables -A FIL0-MYINPUT -s ${IP} -j ${FIL}
fi
done
例1 :
# create_chain.sh
# add_ip.sh BLOCK 192.168.0.0/24 172.16.0.0/16
例2:
# create_chain.sh
# add_ipfilter.sh BLOCK2 ip.txt
ip.txtの中身
# aaa #以降はコメントで無視される。空白も無視される
192.168.0.1
192. 168.0.2 # aaa
192.168.0. 3 # bbb
192.168.0.4 # ccc
# 192.168.0.5
例3:
# create_chain.sh
# add_ip.sh BLOCK 192.168.0.0/24 172.16.0.0/16
# add_ipfilter.sh BLOCK2 ip.txt
確認は,以下のコマンドで確認できる。(名前解決があると,IPアドレスがわかりにくいので-nをつけている)
# iptables -n -L
韓国 IP アドレスからのパケットを遮断する のIPアドレス対策も,やり過ぎかと思ったけど,試しに,ブロックしてみると,スパムメールが少し減った。それだけでも効果があったといえる。
"/etc/init.d/iptabls save"を実行すれば,この設定も,"/etc/sysconfig/iptables"にセーブされ,起動時に読み込まれる。

コメントする