本插件能实现在受到cc、压测工具等拒绝服务***时,进行比较有效的防御。实际上,它并不具备阻截能力,它是基于IPtables 防火墙,利用 netstat+过滤规则,与 IPtables防火墙实现联动。在发生恶意拒绝服务***时,本软件会实时分析连接来源的企图。当连接IP 有明显的非正常连接时,插件自动将其加入iptables 防火墙条目进行阻截。同时将***IP 记录到计划解封文件里,当达到预定时间后,插件自动从 IPtables 防火墙中解封对应IP。在基本测试过程中,应付单 IP 并发连接***、cc***等效果明显。但它并不适合于随机伪造 IP 的恶意***,但能对抗轻量 DDOS。
原DDos_firewall v1.0版 http://www.hit008.com/read.php?49 ,v2.0后改名为:DDoS-Defender
 

DDoS-Defender-v2.0.0版的改进以下:
===============================================
1. 重新改写v1.0的低级代码
2. 全新的运行架构,审计流程
3. 优化运行进程的优先级,增强CPU亲和性
4. 将临时数据加载到内存虚拟交换区里,降低磁盘IO
5. 新增APF防火墙支持(暂不支持自动解锁)
6. 新增邮件通知功能

下一版,将修复对APF防火墙的完美支持,部份不完美的BUG。
===============================================

程序安装:
# tar zxvf DDoS-Defender-v2.0.0.tar.gz
# cd  DDoS-Defender-v2.0.0
# ./autoinstall.sh
# /usr/local/DDos/sbin/ddosDer start     #启动程序

安装完成后,重新Login终端可直接使用 “ ddosDer start” 命令启动和关闭。

查看监控状态:
# ddosDer status

程序主要目录介绍:
/usr/local/DDos/sbin     #主要程序运行文件夹
/usr/local/DDos/logs    #事件记录
/usr/local/DDos/conf   #配置文件
/usr/local/DDos/lib     #功能模块库

www.ywjt.org 


《系统结构图》

SHELL源码开放:

主进程“ddos_daemon”(守护):

 
  
  1. #!/bin/sh  
  2. ##############################################################################  
  3. # DDoS-Defender version 2.0.0 Author: Sunshine <lanxera@yeah.net>            #  
  4. ##############################################################################  
  5. # This program is distributed under the "Artistic License" Agreement         #  
  6. # The LICENSE file is located in the same directory as this program. Please  #  
  7. # read the LICENSE file before you make copies or distribute this program    #  
  8. ##############################################################################  
  9. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/usr/local/DDos/sbin  
  10. export PATH  
  11. CONF_FILE="/usr/local/DDos/conf/ddos.conf" 
  12.    
  13. # Print Header infomation.  
  14. header()  
  15. {  
  16.     echo "DDoS-Defender version 2.0.0" 
  17.     echo "Copyright (C) 2011,Sunshine <lanxera@yeah.net>" 
  18.     echo  
  19. }  
  20.    
  21. # Check if user is root.  
  22. if [ $(id -u) != "0" ]; then  
  23.     header  
  24.     echo "Error: You must be root to run!" 
  25.     exit 1 
  26. fi  
  27.    
  28. # Clean tmp.  
  29. clean_tmp() {  
  30. if [ -d $TMP_DIR ];then  
  31.    rm -f $TMP_DIR/*  
  32. else 
  33.    mkdir $TMP_DIR  
  34. fi  
  35.    
  36. }  
  37.    
  38. load_conf()  
  39. {  
  40.     if [ -f "$CONF_FILE" ] && [ ! "$CONF_FILE" == "" ]; then  
  41.         source $CONF_FILE  
  42.         clean_tmp  
  43.     else 
  44.         header >> $LOGS_FILE  
  45.         echo "\$CONF_FILE not found." |tee -a $LOGS_FILE  
  46.         exit 1 
  47.     fi  
  48. }  
  49.    
  50. # send email for admins.  
  51. send_mail() {  
  52.     if [ $1 -eq 1 ]; then  
  53.         dt=`date +"%y-%m-%d %H:%M:%S"`  
  54.         if [ `expr length "$EMAIL_TO"` -ne 0 ]; then  
  55.            for Addrs in $EMAIL_TO  
  56.            do  
  57.             cat $BANNED_IP_MAIL | mail -s "IP addresses banned on $dt" $Addrs  
  58.             if [ $? -eq 0 ];then  
  59.                echo "IP addresses banned on $dt,MailTo $Addrs Success." 
  60.             else 
  61.                echo "Sendmail error..." 
  62.             fi  
  63.            done  
  64.             rm -f $TMP_DIR$BANNED_IP_MAIL  
  65.         fi  
  66.     fi  
  67. }  
  68.    
  69. ################################################################################################  
  70. active_exec() {  
  71. load_conf  
  72. header >> $LOGS_FILE  
  73. echo "ddos_daemon Running OK. $(date +"%y-%m-%d %H:%M:%S")" >> $LOGS_FILE  
  74. DDOS_PID="$PROC_DIR"logs/ddos_daemon.SOCK  
  75. echo "$$" > $DDOS_PID  
  76. BLACK_LIST=`mktemp $TMP_DIR/ddos_backlist.XXXXXXXX`  
  77. BANNED_IP_MAIL=`mktemp $TMP_DIR/ddos_PREFIX.XXXXXXXX`  
  78. echo "Banned the following ip addresses on `date`" > $BANNED_IP_MAIL  
  79. echo >> $BANNED_IP_MAIL  
  80. >> $CROND_LIST  
  81.    
  82. while true  
  83. do  
  84.    #根据连接数反应恶意连接,格式化数据,去掉重IP  
  85.     netstat -ntu |grep -E $MONT_PORT|awk '{print $5}'|cut -f 1 -d :|sort|uniq -c|sort -rn|grep -v -E $IGNORE_IP > $BLACK_LIST  
  86.    
  87. if [ $KILL -eq 1 ]; then  
  88.     while read line; do  
  89.         CURR_LINE_CONN=$(echo $line | cut -d" " -f1)  #连接数  
  90.         CURR_LINE_IP=$(echo $line | cut -d" " -f2)    #连接IP  
  91.    
  92.         #判断IP是否已超过连接警戒数  
  93.       if [ $CURR_LINE_CONN -lt $NO_OF_CONNECTIONS ]; then  
  94.             break 
  95.       else 
  96.    
  97.         if [ $APF_BAN -eq 1 ]; then  
  98.             $APF -d $CURR_LINE_IP  
  99.         else 
  100.             #iptables没有重复条目  
  101.            if [ `iptables --list|grep $CURR_LINE_IP|wc -l` -eq 0 ];then  
  102.               $IPT -I INPUT -s $CURR_LINE_IP -j DROP  
  103.               echo "$CURR_LINE_IP with $CURR_LINE_CONN connections,Lock Now!" >> $BANNED_IP_MAIL  
  104.             #crond_file里没有重复条目  
  105.             if [ `grep '$CURR_LINE_IP' $CROND_LIST|wc -l` -eq 0 ];then  
  106.                echo "$CURR_LINE_IP with $CURR_LINE_CONN connections,Lock Now!,$(date +"%y-%m-%d %H:%M:%S")" >> $LOGS_FILE  
  107.                echo "$CURR_LINE_IP `date +%Y/%m/%d` `date +%H:%M:%S` `date +%s` LOCK" >> $CROND_LIST  
  108.             fi  
  109.             # 发送邮件通知  
  110.             if [ $SENDMAIL_ON -eq 1 ];then  
  111.                $SENDMAIL_EXE $CURR_LINE_IP"_banned_On_" $BANNED_IP_MAIL >> $LOGS_FILE  
  112.                rm -f "$TMP_DIR"/"$BANNED_IP_MAIL" 
  113.             fi  
  114.            else 
  115.               continue 
  116.            fi  
  117.         fi  
  118.       fi  
  119.     done < $BLACK_LIST  
  120. fi  
  121. sleep $REXEC_TIME  
  122. done  
  123. }  
  124.    
  125. active_exec | tee -a $LOGS_FILE  

计划任务进程“ddos_flush”(守护):

 
  
  1. #!/bin/sh  
  2. ##############################################################################  
  3. # DDoS-Defender version 2.0.0 Author: Sunshine <lanxera@yeah.net>            #  
  4. ##############################################################################  
  5. # This program is distributed under the "Artistic License" Agreement         #  
  6. # The LICENSE file is located in the same directory as this program. Please  #  
  7. # read the LICENSE file before you make copies or distribute this program    #  
  8. ##############################################################################  
  9. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/usr/local/DDos/sbin  
  10. export PATH  
  11. CONF_FILE="/usr/local/DDos/conf/ddos.conf" 
  12.    
  13. # Print Header infomation.  
  14. header()  
  15. {  
  16.     echo "DDoS-Defender version 2.0.0" 
  17.     echo "Copyright (C) 2011,Sunshine <lanxera@yeah.net>" 
  18.     echo  
  19. }  
  20.    
  21. # Check if user is root.  
  22. if [ $(id -u) != "0" ]; then  
  23.     header  
  24.     echo "Error: You must be root to run!" 
  25.     exit 1 
  26. fi  
  27.    
  28. load_conf()  
  29. {  
  30.     if [ -f "$CONF_FILE" ] && [ ! "$CONF_FILE" == "" ]; then  
  31.         source $CONF_FILE  
  32.     else 
  33.         header >> $LOGS_FILE  
  34.         echo "\$CONF_FILE not found." |tee -a $LOGS_FILE  
  35.         exit 1 
  36.     fi  
  37. }  
  38.    
  39. ################################################################################################  
  40. flush_exec() {  
  41. load_conf  
  42. echo "flush_daemon Running OK. $(date +"%y-%m-%d %H:%M:%S")" >> $LOGS_FILE  
  43. FLUSH_PID="$PROC_DIR"logs/ddos_flush.SOCK  
  44. TEMP_FILE=`mktemp $TMP_DIR/CROND_IP.XXXXXXXX`  
  45. echo "$$" > $FLUSH_PID  
  46.    
  47. while true  
  48. do  
  49. #取得当前时间  
  50. DT=`date +%s`  
  51. #文件是否存在  
  52.   if [ -e $CROND_LIST ];then  
  53.     #遍历所有条目  
  54.     for i in `awk '{print $1}' $CROND_LIST`  
  55.     do  
  56.       #内容不为空  
  57.       if [ `cat $CROND_LIST|wc -l` -ne 0 ];then  
  58.       #单次最多取出一条,排除重复条目  
  59.       GET_KTIME=`grep $i $CROND_LIST|awk '{print $4}'|head -1`  
  60.       let "EXPR_KOUT=$DT - $GET_KTIME" 
  61.         #判断是否超规定时间  
  62.         if [[ $EXPR_KOUT -gt $BAN_PERIOD ]];then  
  63.          #iptables里存在条目  
  64.          if [ `iptables --list|grep $i|wc -l` -ne 0 ];then  
  65.             /sbin/iptables -D INPUT -s $i -j DROP  
  66.             echo "Clean $i OK. $(date +"%y-%m-%d %H:%M:%S")" >> $LOGS_FILE  
  67.          fi  
  68.           #清除crond_list的当前条目  
  69.           cp $CROND_LIST $TEMP_FILE  
  70.           sed -e "/$i/d" $TEMP_FILE > $CROND_LIST  
  71.           rm -f $TEMP_FILE  
  72.         fi  
  73.       fi  
  74.     done  
  75.   fi  
  76.   sleep $REXEC_TIME  
  77. done  
  78. }  
  79. flush_exec | tee -a $LOGS_FILE  

主控制进程“ddosDer”:

 
  
  1. #!/bin/sh  
  2. ##############################################################################  
  3. # DDoS-Defender version 2.0.0 Author: Sunshine <lanxera@yeah.net>            #  
  4. ##############################################################################  
  5. # This program is distributed under the "Artistic License" Agreement         #  
  6. # The LICENSE file is located in the same directory as this program. Please  #  
  7. # read the LICENSE file before you make copies or distribute this program    #  
  8. ##############################################################################  
  9. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/usr/local/DDos  
  10. export PATH  
  11. CONF_FILE="/usr/local/DDos/conf/ddos.conf" 
  12.    
  13. if [ -f "$CONF_FILE" ] && [ ! "$CONF_FILE" == "" ]; then  
  14.     source $CONF_FILE  
  15. else 
  16.     header >> $LOGS_FILE  
  17.     echo "\$CONF_FILE not found." |tee -a $LOGS_FILE  
  18.     exit 1 
  19. fi  
  20.    
  21. DDOS_DAEMON="/usr/local/DDos/sbin/ddos_daemon" 
  22. FLUSH_DAEMON="/usr/local/DDos/sbin/ddos_flush" 
  23. DDOS_PID="$PROC_DIR"logs/ddos_daemon.SOCK  
  24. FLUSH_PID="$PROC_DIR"logs/ddos_flush.SOCK     
  25.    
  26. header()  
  27. {  
  28.     echo "DDoS-Defender version 2.0.0" 
  29.     echo "Copyright (C) 2011,Sunshine <lanxera@yeah.net>" 
  30. }  
  31.    
  32. do_start() {  
  33.         $CHECKIPTABLES 1>/dev/null  
  34.         if [ `pgrep -f 'ddos_daemon'|wc -l` -eq 0 ];then  
  35.            nice -n -4 $DDOS_DAEMON &  
  36.            nice -n -4 $FLUSH_DAEMON &  
  37.         else 
  38.            echo -e "ddos_daemon already running!" 
  39.            exit 1 
  40.         fi  
  41. }  
  42.    
  43. do_stop() {  
  44.         if [ `pgrep -f 'ddos_daemon'|wc -l` -eq 0 ];then  
  45.             echo -e "ddos_daemon not running!" 
  46.     else 
  47.                     #kill -9 `cat $DDOS_PID`  
  48.                     killall ddos_daemon  
  49.         fi   
  50.    
  51.         if [ `pgrep -f 'ddos_flush'|wc -l` -eq 0 ];then  
  52.                     echo -e "ddos_flush not running!" 
  53.         else 
  54.                     #kill -9 `cat $FLUSH_PID`  
  55.                     killall ddos_flush  
  56.         fi  
  57.    
  58.         if [ `pgrep -f 'ddos_flush'|wc -l` -ne 0 ]&&[ `pgrep -f 'ddos_daemon'|wc -l` -ne 0 ];then  
  59.             #kill -9 `cat $DDOS_PID`  
  60.             #kill -9 `cat $FLUSH_PID`  
  61.             killall ddos_daemon  
  62.             killall ddos_flush  
  63.             rm -rf $DDOS_PID $FLUSH_PID  
  64.     fi  
  65. }  
  66.    
  67. do_restart() {  
  68.         do_stop  
  69.         do_start  
  70. }  
  71.    
  72. do_status() {  
  73.         header  
  74.         echo "------------------------------DROP LIST---------------------------------" 
  75.         echo "IP           Y/m/d      H:M:S   Unix/time   Active" 
  76.         if [ -e $CROND_LIST ];then  
  77.            column -t $CROND_LIST  
  78.         fi  
  79.         echo "------------------------------IPTABLES LIST-----------------------------" 
  80.         echo "target    prot opt source              destination" 
  81.         iptables --list|grep 'DROP'|awk {'printf "%-10s%-5s%-4s%-20s%-11s\n",$1,$2,$3,$4,$5'}  
  82.         echo "------------------------------NETSTAT TOP20----------------------------" 
  83.                 echo "Num   Proto Recv-Q Send-Q Local Address       Foreign Address     State" 
  84.                  netstat -ntu |grep -E $MONT_PORT|grep -v -E $IGNORE_IP|sed 's/:/ /g'|awk '{print $1,$2,$3,$4,$6,$8}'|sort|uniq -c|sort -rn|awk '{printf "%-6s%-06s%-07s%-07s%-20s%-20s%-10s\n",$1,$2,$3,$4,$5,$6,$7}'|head -20 
  85.                 #netstat -ntu |grep -E $MONT_PORT|awk '{print $5}'|cut -f 1 -d  sort|uniq -c|sort -rn|grep -v -E $IGNORE_IP  
  86.                 echo "------------------------------------------------------------------------" 
  87.                 if [ `pgrep -f 'ddos_daemon'|wc -l` -ne 0 ];then  
  88.                    echo -n ">>> ddos_daemon already running! " 
  89.                 else 
  90.                    echo -n ">>> ddos_daemon not running! " 
  91.                 fi  
  92.                 if [ `pgrep -f 'ddos_flush'|wc -l` -ne 0 ];then  
  93.                    echo  " ddos_flush already running! <<<" 
  94.                 else 
  95.                    echo " ddos_flush not running! <<<" 
  96.                 fi  
  97.    
  98. }  
  99.    
  100. case "$1" in 
  101.   start)  
  102.         echo -e "Starting ddos_daemon ..." 
  103.         do_start  
  104.         echo "Done." 
  105.         ;;  
  106.   stop)  
  107.         echo -e "Stopping ddos_daemon ..." 
  108.         do_stop  
  109.         echo "Done." 
  110.         ;;  
  111.   restart)  
  112.         echo -e "Restarting ddos_daemon ..." 
  113.         do_restart  
  114.         echo "Done." 
  115.         ;;  
  116.   status)  
  117.         while true  
  118.         do  
  119.         clear  
  120.         do_status  
  121.         sleep 5 
  122.         done  
  123.         ;;  
  124.   *)  
  125.         echo $"Usage: $prog {start|stop|restart|status}" 
  126.         exit 1 
  127. esac  

配置文件实例:

 
  
  1. ##### Paths of the script and other files  
  2. PROC_DIR="/usr/local/DDos/" 
  3. LOGS_FILE="/usr/local/DDos/logs/running.log" 
  4. TMP_DIR="/dev/shm/tmp" 
  5. APF="/etc/apf/apf" 
  6. IPT="/sbin/iptables" 
  7.    
  8. ### Module Library  
  9. ### 加载lib模块  
  10. SENDMAIL_EXE="/usr/local/DDos/lib/sendmail.so" 
  11. CHECKIPTABLES="/usr/local/DDos/lib/check_iptables.so" 
  12.    
  13. ### Plans to remove(blacklist)  
  14. ### 计划清理队列  
  15. CROND_LIST="/usr/local/DDos/logs/crond_list.dat" 
  16.    
  17. ### White list  
  18. ### 白名单  
  19. IGNORE_IP="127.0.0.1|0.0.0.0" 
  20.    
  21. ### Monitor port  
  22. ### 监控端口  
  23. MONT_PORT="80|8080|443" 
  24.    
  25. ##### KILL=0 (Bad IPs are'nt banned, good for interactive execution of script)  
  26. ##### KILL=1 (Recommended setting)  
  27. ### 调和模式,0表示只监测,1表示主动防御并锁定IP  
  28. KILL=1 
  29.    
  30. ##### APF_BAN=1 (Make sure your APF version is atleast 0.96)  
  31. ##### APF_BAN=0 (Uses iptables for banning ips instead of APF)  
  32. ### 是否启用APF防火墙,如使用iptables请设为0  
  33. APF_BAN=0 
  34.    
  35. ### Executive frequency(s)  
  36. ### 监控密度,单位为秒  
  37. REXEC_TIME=10 
  38.    
  39. ##### How many connections define a bad IP? Indicate that below.  
  40. ### 锁定连接数,该项能确定监控的敏感度,非常重要  
  41. NO_OF_CONNECTIONS=100 
  42.    
  43. ##### An email is sent to the following address when an IP is banned.  
  44. ##### Blank would suppress sending of mails,Sendmail Off/On,"1" is ON  
  45. ### 管理员邮箱,空格隔开,EMAIL_ATTACH是否启用附件,0为Off  
  46. SENDMAIL_ON=1 
  47. EMAIL_ATTACH=0 
  48. EMAIL_SIGE="4399运维团队" 
  49. EMAIL_TO="xxxxxxxxx@qq.com" 
  50.    
  51. ### Lock time,used to lock blacklist in grep_list,  
  52. ### Over this time, iptables will automatically delete.(s)  
  53. ### 封锁时间  
  54. BAN_PERIOD=600 

相关截图:

www.ywjt.org 

www.ywjt.org 

DDoS-Defender-v2.0.0下载:http://www.ywjt.org/index/archives/338.html