由于有的时候服务器会被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解禁,避免过多的封杀或者误杀。一个小时的禁止时间也已经足够了。
Apache有一个模块mod_evasive,也可以实现这功能,不过我觉得这东西的机制还是太机械化了,难免会误杀。。
在抵御攻击的时候,为了安全误杀也是没有办法的事情。
另外就是这个值可以调整到平时正常访问的同一个IP产生的连接数*1.5~2这样的数字,就基本不会有误杀的情况发生了。
强烈支持博主,linux新手路过
多谢支持。