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