当前位置: > shell编程 >

带黑名单和白名单的DDOS防御Shell脚本

时间:2014-11-26 01:41来源:www.it.net.cn 作者:IT网

由于有的时候服务器会被DDOS攻击,经过几次实际的处理后,我制作了一套防御DDOS的脚本。比起一般的DDOS防御脚本来说,我可以设置白名单,来让自己的IP不受干扰。

此外,这个防御DDOS的脚本还会记录下每个被封的IP的连接数信息,方便后期的分析。被封杀的IP也会有日志记录可查。

这套脚本需要cron的支持,1分钟执行一次,检查当前的连接情况并对超过设置的连接进行屏蔽处理。而屏蔽方面则依赖于iptables。如果Linux Server上安装有这两个支持,那么就可以使用我的这个脚本来进行DDOS防御了。

默认情况下,脚本的防御为连接数超过40个的IP。如果您需要请调整注释处的数字符合您的需求。此外,这套脚本默认放在/usr/local/ddos下,脚本名称为ddos.sh。如果需要更改目录,请对脚本中的路径进行对应的修改即可。

脚本如下:

#!/bin/bash
netstat -an| grep :80 |awk '{ print $5 }' | sort|awk -F: '{print $1}' | uniq -c | awk '$1 >40' | awk '$2 != ""' > /usr/local/ddos/black.txt
netstat -an| grep :80 |awk '{ print $5 }' | sort|awk -F: '{print $4}' | uniq -c | awk '$1 >40' | awk '$2 != ""' >> /usr/local/ddos/black.txt
cnt=0
for i in `awk '{print $2}' /usr/local/ddos/black.txt`
do
	if [ ! -z "$i" ];
	then
        	COUNT=`grep $i /usr/local/ddos/black.txt | awk '{print \$1}'`
        	DEFINE="40"
        	ZERO="0"
		if [ $COUNT -gt $DEFINE ];
        	then
                	grep $i /usr/local/ddos/white.txt > /dev/null
                	if [ $? -gt $ZERO ];
                	then
				IPEX=`iptables -nL | grep "$i"`
				if [ -z "$IPEX" ];
				then
                			echo "$COUNT $i"
                			iptables -I INPUT -s $i -j DROP
					echo -e "[`date "+%Y-%m-%d %T"`] IP: $i\tCOUNT: $COUNT" >> /usr/local/ddos/banned.log
				fi
                	fi
        	fi
		((cnt=cnt+1))
	fi
done
echo "[`date "+%Y-%m-%d %T"`] Script runned, found $cnt." >> /usr/local/ddos/run.log

脚本的设置如下,编辑cron的配置文件/etc/crontab,添加下列信息进去:

*/1 *   * * *   root    /usr/local/ddos/ddos.sh
0 *    * * *   root    iptables --flush

第一条是1分钟执行一次防御脚本,第二条是每小时清理一次IP禁止列表。第二条是可选的,主要是为了将已经封杀的IP解禁,避免过多的封杀或者误杀。一个小时的禁止时间也已经足够了。

(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容