[升級版]自行編寫的基於iptable防禦DDos***的插件

本插件能實現在受到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 <[email protected]>            #  
  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 <[email protected]>" 
  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 <[email protected]>            #  
  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 <[email protected]>" 
  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 <[email protected]>            #  
  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 <[email protected]>" 
  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="[email protected]" 
  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

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章