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模块来进行,下一节将会跟大家详细说明。