[DDoS deflate] 一个防御...
 
Notifications
Clear all

[DDoS deflate] 一个防御DDoS的纯Shell脚本

1 Posts
1 Users
0 Likes
4,017 Views
(@taichi)
Member
Joined: 4 years ago
Posts: 408
Topic starter  

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

 

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 ,由于我没用所以不知道日志长啥样,不过监控原理是一样的,如果你看得懂上面这句你就会写。

   
Quote
Topic Tags
Share: