预计阅读本页时间:-
6.9.2 自动分析黑名单及白名单的iptables脚本
本iptables脚本是一个自动分析黑名单和白名单的安全脚本,脚本路径为/root/deny_100.sh。运行此脚本时要注意以下事项:
·此脚本能自动过滤掉企业中通过NAT(Network Address Translation,网络地址转换)出去的白名单IP,很多中小企业都是以iptables作为NAT软路由上网的,可以将一些与我们有业务往来的公司及本公司的安全IP添加进白名单,以防错误过滤。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
·这里定义的阈值DEFINE是100,其实这个值应该根据具体生产环境而定,50~100较好。
·此脚本的原理其实很简单,通过判断瞬间连接数是否大于100来抉择,如果是白名单里的IP则跳过;如果不是,则用iptables-I参数将此恶意IP禁掉。这里建议不要用-A,-A在iptables的规则里是最后添加的,往往达不到即时剔除的效果。iptables中针对链的操作编号其实是有规则的,-I是在规则的最前面插入的,而iptables是按照规则的顺序来生效的,所以可以采用-I实现立即禁止某IP的目的。
·此脚本是在线上的邮件服务器上进行调试的,系统为CentOS 5.1 x86_64。
可以用cat命令来查看脚本的内容,命令如下:
cat /root/deny_100.sh
/root/deny_100.sh脚本的内容如下:
#/bin/bash
netstat -an| grep :25 | grep -v 127.0.0.1 |awk '{ print $5 }' | sort|awk -F: '{print $1,$4}' | uniq -c | awk '$1 >50 {print $1,$2}' > /root/black.txt
for i in `awk '{print $2}' /root/black.txt`
do
COUNT=`grep $i /root/black.txt | awk '{print \$1}'`
DEFINE="1000"
ZERO="0"
if [ $COUNT -gt $DEFINE ];
then
grep $i /root/white.txt > /dev/null
if [ $? -gt $ZERO ];
then
echo "$COUNT $i"
iptables -I INPUT -p tcp -s $i -j DROP
fi
fi
done
2009年3月30日下午14:25分,用下列命令监控:
netstat -an| grep :25 | grep -v 127.0.0.1 |awk '{ print $5 }' | sort|awk -F: '{print $1}' | uniq -c | awk '$1 >100'
执行此命令后显示的内容如下:
1122 219.136.163.207
17 61.144.157.236
219.136.163.207这个IP的瞬间连接数为1122,这个值明显不正常,这极有可能是一个攻击IP,用http://www.ip138.com 一查,发现了如下结果:
ip138.com IP查询
(搜索
IP地址的地理位置
)您查询的
IP:219.136.163.207本站主数据:广东省广州市
电信
(荔湾区
)参考数据一:广东省广州市
电信
(荔湾区
)参考数据二:广东省广州市荔湾区
电信
ADSL
调用deny_100.sh将此IP禁止掉,再运行./root/count.sh后则再无显示,表明此脚本执行成功,可用iptables-nL验证,另外,要允许此脚本每10分钟执行一次,命令如下:
*/10 * * * * root /bin/sh /root/deny_100.sh
一般来说,10分钟或更长时间执行一次此脚本是没有问题的,因为此脚本只要发现有大量可疑的IP连接,在排除是白名单的情况下会立即禁止此IP访问。
注意
有的朋友喜欢用while循环的方法,这里也可以用此方法,但要注意防止出现死循环的问题,因此一定要记得带上sleep语句。
我们可以在局域网内模拟测试攻击来测试此脚本:在本机iptables的防火墙(Server机器IP为192.168.1.101)上,将此脚本的监听端口由25改成80,开启Apache Web服务。然后在另一台CentOS 6.4机器,比如192.168.1.102上安装Webbench软件,用它来模拟80端口的攻击,先进入/usr/local/src目录,然后下载并安装Webbench,命令如下:
wget http://blog.s135.com/soft/linux/webbench/webbench-1.5.tar.gz
然后解压缩此软件并编译安装,命令如下:
tar zxvf webbench-1.5.tar.gz
cd webbench
make && make install
如果make时有如下报错:
ctags *.c
/bin/sh: ctags: command not found
make: [tags] Error 127 (ignored)
提前安装下ctags命令即可,如下所示:
yum -y install ctags
然后用以下命令进行压力测试(模拟端口攻击):
webbench -t 1000 –
c 150 http://192.168.1.101
此命令行的意思是在1000s的单位时间内,模拟150个并发去访问http://192.168.1.101 的网站。
我们在服务器上可以执行以下命令,观测iptables的执行结果:
iptables -nv -L
Chain INPUT (policy ACCEPT 849K packets, 57M bytes)
pkts bytes target prot opt in out source destination
1161 85180 DROP tcp -- * * 192.168.1.102 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 849K packets, 92M bytes)
pkts bytes target prot opt in out source destination
然后试着在192.168.1.102的机器上用elinks访问192.168.1.101的Web服务,这时已经访问不了了,证明此脚本已成功运行,有兴趣的朋友也可以依照以上步骤进行实验。
将此脚本放在线上服务器上使用时,发现对于非Web的应用服务器,比如Mail、DNS等应用服务器确实很有效果,而对于Web应用服务器效果则不是特别明显。这是因为现在的很多Web服务器,特别是存储海量图片小文件的服务器,如果单击某一个链接,可能同时会产生多个对应页面的链接,而这个IP在netstat中对应的链接数就有100多个,故而脚本会认为此IP是一个危险的IP,应该过滤掉它,但我们通过Nginx的日志分析,发现这个客户端的IP是一个正常的客户IP,因此将此脚本应用于Web服务器不太合适。笔者目前也只将其用于邮件服务器和DNS服务器,请大家在实际工作中也要注意甄别使用,如果确实需要限制IP在单位时间内的连接次数,可以利用iptables的recent模块来进行,下一节将会跟大家详细说明。