Linux下DDOS简单防御shell脚本

发布于 2015-08-01  236 次阅读


Linux下DDOS简单防御shell脚本

注意:网站如果使用CDN的话,不可用这个,不然当网站IP连接数过高,会把CDN的IP拉黑

连接数限制为200,需要添加crontab定时任务,脚本10S运行一次,iptables每小时flush一次,并且会发送到你的邮箱.

这个脚本检测的是80/443端口,如有其他需要,可以更改前两行grep -E "XXXX"规则

运行日志保存到run.log,黑名单保存在black.txt,已禁止列表保存在banned.log

以下为crontab配置,选择一种,第一种是每分钟,第二种是每多少秒,

vi /etc/crontab

#每分钟检测一次
*/1 * * * * root /www/web/ddos/ddos.sh 
#每小时的0分清除防火墙记录
0 * * * * root /sbin/iptables -F INPUT
#每三天清除运行日志
* * 3 * * root rm -rf /home/wwwroot/log/run.log
#每10秒检测一次 如需5秒 则改成 sleep 5 sleep 10 sleep 15 .....即可
*/1 * * * * root  sleep 10 && bash /home/wwwroot/code/ddos.sh
*/1 * * * * root  sleep 20 && bash /home/wwwroot/code/ddos.sh
*/1 * * * * root  sleep 30 && bash /home/wwwroot/code/ddos.sh
*/1 * * * * root sleep 40 && bash /home/wwwroot/code/ddos.sh
*/1 * * * * root sleep 50 && bash /home/wwwroot/code/ddos.sh
#每小时的0分清除防火墙记录
0 * * * * root /sbin/iptables --flush
#每三天清除运行日志
* * 3 * * root rm -rf /home/wwwroot/log/run.log

以下为shell脚本代码,目录、连接数(注意要批量替换,有多处)、邮箱自行修改.

#!/bin/bash
# Last Change:  2020-08-01 09:53:14
netstat -an | grep -E ':80|:443' | awk '{ print $5 }' | sort|awk -F: '{print $1}' | uniq -c | awk '$1 >200' | awk '$2 != ""' >/home/wwwroot/log/black.txt
netstat -an | grep -E ':80|:443' | awk '{ print $5 }' | sort|awk -F: '{print $4}' | uniq -c | awk '$1 >200' | awk '$2 != ""' >>/home/wwwroot/log/black.txt
cnt=0
for i in `awk '{print $2}' /home/wwwroot/log/black.txt`
do
   if [ ! -z "$i" ];
         then
            COUNT=`grep $i /home/wwwroot/log/black.txt | awk '{print \$1}'`
             DEFINE="200"
ZERO="0"
        if [ $COUNT -gt $DEFINE ];
            then
                    grep $i /home/wwwroot/log/white.txt > /dev/null
                    if [ $? -gt $ZERO ];
                    then
                IPEX=`/sbin/iptables -nL | grep "$i"`
                if [ -z "$IPEX" ];
                then
                            echo "$COUNT $i"
                            /sbin/iptables -I INPUT -s $i -j DROP
                    echo -e "[`date "+%Y-%m-%d %T"`] IP: $i\tCOUNT: $COUNT" >> /home/wwwroot/log/banned.log
                    echo "Your server is attacked, Count: $COUNT IP: $i" | mutt -s "Dear,Your server is attacked" admin@loneking.cn
                fi
                    fi
            fi
        ((cnt=cnt+1))
    fi
done
echo "[`date "+%Y-%m-%d %T"`] Script runned, found $cnt." >> /home/wwwroot/log/run.log

LoneKing