[DDoSdeflate]一个防御DDoS的纯Shell脚本修复BUG&汉化

2022-5-16 18:45| 发布者: Hocassian| 查看: 57| 评论: 0|原作者: 神代綺凜

摘要:
C:\Users\Administrator\Downloads\神代綺凜\2019-10-15-14-34-56-19827356275700-文章归档 - 神代綺凜の萌化小基地-采集的数据-后羿采集器.html

标题

[DDoS deflate] 一个防御DDoS的纯Shell脚本 修复BUG&汉化

标题链接

https://moe.best/technology/ddos-deflate.html

正文

最后更新 2017-10-11

DDoS deflate是一款免费的用来防御和减轻DDoS攻击的脚本。它通过netstat监测跟踪创建大量网络连接的IP地址,在检测到某个结点超过预设的值时,该脚本会通过APF或iptables禁止这些IP的访问。
据说官网为 http://deflate.medialayer.com/ ,但是已经无法访问。

Head Pic: 「ごはんなのです!」/「コ゛りぼて」

DDoS deflate

安装

直接执行

1
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,我已经将配置文件的英文说明汉化。
此处展示一下重要配置内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
##### 运行此脚本的频率(分钟) ##### 注意:每当你修改了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

  1. 脚本中的第119行
    1
    netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr > $BAD_IP_LIST

    此行被我注释,修改成了第120行的

    1
    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。

  2. 脚本里的head()函数被我重命名为showhead(),因为会与系统程序head冲突。

嫌1分钟的运行间隔不够短?

由于 Crontab 定时任务的最短定时间隔为1分钟,然而如果真的被攻击,1分钟的时间都够服务器喝一大壶的了。

想让脚本运行时间间隔小于1分钟,思路也十分简单,用另一个脚本让 DDoS deflate 在一分钟内运行数次就可以了。

例如要让这个脚本每10秒运行一次:

  1. /usr/local/ddos内新增一个脚本runddos.sh
    1
    vi /usr/local/ddos/runddos.sh

    并填入以下内容

    1
    2
    3
    4
    5
    6
    7
    8
    #!/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

    然后保存,记得给脚本加执行权限

    1
    chmod +x /usr/local/ddos/runddos.sh
  2. 修改 crontab 中 ddos 脚本的配置
    1
    vi /etc/cron.d/ddos.cron

    将文件中的

    1
    0-59/1 * * * * root /usr/local/ddos/ddos.sh >/dev/null 2>&1

    改为

    1
    0-59/1 * * * * root /usr/local/ddos/runddos.sh >/dev/null 2>&1

    实际上就是改成我们刚刚新建的那个runddos.sh脚本

  3. 重启 crontab
    1
    service crond restart

至此这个修改就完成了

如果想让脚本监控网站访问日志

如果想要监控网站访问记录,请将所有的网站访问日志放到一个文件夹里(下面以日志都在/www/wwwlogs并且文件名统一为xxxx.com.log为例),然后

  • 如果是 Nginx 的话,将脚本中第120行注释掉(有> $BAD_IP_LIST而且没注释掉的那行)
    然后紧接着加入以下三行内容:
    1
    2
    3
    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 ,由于我没用所以不知道日志长啥样,不过监控原理是一样的,如果你看得懂上面这句你就会写。
搬瓦工VPS优惠套餐,建站稳如狗,支持支付宝,循环出账94折优惠码BWH26FXH3HIQ
年付$28CN2线路,1核/512M内存/10G硬盘/500GB@1Gbps【点击购买】(经常售罄,请抓紧机会)
年付$47CN2线路,1核/1G内存/20G硬盘/1T@1Gbps【点击购买
最后修改:2018 年 02 月 17 日 11 : 58 PM
如果觉得我的文章对你有用,请随意赞赏

文章信息

中二病患者: 神代綺凜  发布时间:2017 年 10 月 07 日  3160 次浏览   2 条评论  3067 字数 分类: 技术?不存在的


路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部