[DDoS deflate] 一个防御DDoS的纯Shell脚本 修复BUG&汉化
当前页面是本站的「Baidu MIP」版。查看和发表评论请点击:完整版 »
最后更新 2017-10-11
DDoS deflate是一款免费的用来防御和减轻DDoS攻击的脚本。它通过netstat监测跟踪创建大量网络连接的IP地址,在检测到某个结点超过预设的值时,该脚本会通过APF或iptables禁止这些IP的访问。
据说官网为 http://deflate.medialayer.com/ ,但是已经无法访问。
Head Pic: 「ごはんなのです!」/「コ゛りぼて」
DDoS deflate
安装
直接执行
wget -N --no-check-certificate https://lolico.moe/files/scripts/ddos/install-ddos-deflate.sh && chmod +x install-ddos-deflate.sh && ./install-ddos-deflate.sh
即可自动安装。
安装完成后会进入一个给你看本脚本license的界面,按q
即可退出。
配置
配置文件在/usr/local/ddos/ddos.conf
,我已经将配置文件的英文说明汉化。
此处展示一下重要配置内容:
##### 运行此脚本的频率(分钟)
##### 注意:每当你修改了FREQ这个设置,你需要带 --cron 参数运行一次此脚本才能让这个设置生效
FREQ=1
##### 一个IP连接有这~么多连接数才需要拉黑
NO_OF_CONNECTIONS=150
##### 是否使用APF(一个防火墙程序)来ban掉IP
##### APF_BAN=1 (请确保你的APF版本至少为0.96)
##### APF_BAN=0 (用iptables,即系统自带防火墙来ban掉IP)
APF_BAN=0
##### KILL=0 (不会ban掉IP,对脚本交互有利)
##### KILL=1 (管他的直接ban,推荐使用这个设置)
KILL=1
##### 当一个IP被ban之后会发邮件到下面这个邮箱里
##### 留空则不会发送
EMAIL_TO="root"
##### 当这么多秒过去以后,被ban的IP将解ban
BAN_PERIOD=600
请根据你自己的需要修改配置,然后保存。
修改说明
这个脚本经过了我的修改以修复一个严重的 BUG
- 脚本中的第119行
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr > $BAD_IP_LIST
此行被我注释,修改成了第120行的
netstat -ntu | sed '1,2d' | awk '{print $5}' | cut -d: -f1 | sed '/^\s*$/d' | sort | uniq -c | sort -nr > $BAD_IP_LIST
此处新增的
sed '1,2d'
是为了过滤掉使用netstat -ntu
命令时返回的开头两句英文说明。
而sed '/^\s*$/d'
是为了删除前一步cut -d: -f1
中产生的未删除的空行,如果不删除空行,在后面的统计排序中将会出现将空行也统计进去的BUG。 - 脚本里的
head()
函数被我重命名为showhead()
,因为会与系统程序head
冲突。
嫌1分钟的运行间隔不够短?
由于 Crontab 定时任务的最短定时间隔为1分钟,然而如果真的被攻击,1分钟的时间都够服务器喝一大壶的了。
想让脚本运行时间间隔小于1分钟,思路也十分简单,用另一个脚本让 DDoS deflate 在一分钟内运行数次就可以了。
例如要让这个脚本每10秒运行一次:
- 在
/usr/local/ddos
内新增一个脚本runddos.sh
vi /usr/local/ddos/runddos.sh
并填入以下内容
#!/bin/sh i=0; while [ $i -le 5 ] do i=`expr $i + 1` /usr/local/ddos/ddos.sh >/dev/null 2>&1 sleep 10 done
然后保存,记得给脚本加执行权限
chmod +x /usr/local/ddos/runddos.sh
- 修改 crontab 中 ddos 脚本的配置
vi /etc/cron.d/ddos.cron
将文件中的
0-59/1 * * * * root /usr/local/ddos/ddos.sh >/dev/null 2>&1
改为
0-59/1 * * * * root /usr/local/ddos/runddos.sh >/dev/null 2>&1
实际上就是改成我们刚刚新建的那个
runddos.sh
脚本 - 重启 crontab
service crond restart
至此这个修改就完成了
如果想让脚本监控网站访问日志
如果想要监控网站访问记录,请将所有的网站访问日志放到一个文件夹里(下面以日志都在/www/wwwlogs
并且文件名统一为xxxx.com.log
为例),然后
- 如果是 Nginx 的话,将脚本中第120行注释掉(有
> $BAD_IP_LIST
而且没注释掉的那行)
然后紧接着加入以下三行内容:TMP_DATE=`date` TMP_DATE=`echo "${TMP_DATE}" | awk '{print $3}'`/`echo "${TMP_DATE}" | awk '{print $2}'`/`echo "${TMP_DATE}" | awk '{print $6}'`:`echo "${TMP_DATE}" | awk '{print $4}' | head -c -3` grep -h "$TMP_DATE" /www/wwwlogs/*.com.log | awk '{print $1}' | sort | uniq -c | sort -nr > $BAD_IP_LIST
第三行中的日志目录与通配符文件名匹配请根据你的实际情况修改。
只懂得shell的一点皮毛,写的很罗嗦还请见谅,如果你还有更好的写法请务必提出来让我学习一个 - 如果是 Apache ,由于我没用所以不知道日志长啥样,不过监控原理是一样的,如果你看得懂上面这句你就会写。