DDOS-deflate工具:ddos.sh脚本解读(预防DDOS攻击脚本)
DDOS-deflate工具:ddos.sh腳本解讀(預防DDOS攻擊腳本)
[root@server ddos]# cat ddos.sh #!/bin/sh ############################################################################## # DDoS-Deflate version 0.6 Author: Zaf <zaf@vsnl.com> # ############################################################################## # This program is distributed under the "Artistic License" Agreement # # # # The LICENSE file is located in the same directory as this program. Please # # read the LICENSE file before you make copies or distribute this program # ############################################################################## load_conf() # 定義一個加載DDOS配置文件的函數,DDOS配置文件存在則加載,否則輸出head()并退出。 {CONF="/usr/local/ddos/ddos.conf"if [ -f "$CONF" ] && [ ! "$CONF" == "" ]; thensource $CONFelseheadecho "\$CONF not found."exit 1fi }head() # 定義固定文本的函數 {echo "DDoS-Deflate version 0.6"echo "Copyright (C) 2005, Zaf <zaf@vsnl.com>"echo }showhelp() # 定義顯示幫助信息的函數 {headecho 'Usage: ddos.sh [OPTIONS] [N]'echo 'N : number of tcp/udp connections (default 150)'echo 'OPTIONS:'echo '-h | --help: Show this help screen'echo '-c | --cron: Create cron job to run this script regularly (default 1 mins)'echo '-k | --kill: Block the offending ip making more than N connections' }unbanip() # 等待指定時間后,刪除無效的規則鏈,解除拒絕的IP {UNBAN_SCRIPT=`mktemp /tmp/unban.XXXXXXXX` # mktemp創建臨時文件,文件名參數為:文件名.XXXX。使用iptables操作拒絕IP訪問服務器的腳本文件。TMP_FILE=`mktemp /tmp/unban.XXXXXXXX`UNBAN_IP_LIST=`mktemp /tmp/unban.XXXXXXXX` # 已拒絕的IP都放到這個文件中echo '#!/bin/sh' > $UNBAN_SCRIPTecho "sleep $BAN_PERIOD" >> $UNBAN_SCRIPT # 等待600sif [ $APF_BAN -eq 1 ]; then # APF_BAN值為1while read line; doecho "$APF -u $line" >> $UNBAN_SCRIPTecho $line >> $UNBAN_IP_LISTdone < $BANNED_IP_LIST else # APF_BAN值為0while read line; do # echo "$IPT -D INPUT -s $line -j DROP" >> $UNBAN_SCRIPT # 把上一次被拒絕的IP地址重新設置為允許,即刪除對應的DROP規則鏈echo $line >> $UNBAN_IP_LIST # 重新設置允許的IP都寫入該文件done < $BANNED_IP_LIST # 輸入的文件,歷史訪問次數統計信息fiecho "grep -v --file=$UNBAN_IP_LIST $IGNORE_IP_LIST > $TMP_FILE" >> $UNBAN_SCRIPT # IGNORE_IP_LIST文件根據UNBAN_IP_LIST文件中的匹配規則,篩選出匹配不上的IP地址,并寫入到臨時文件中。echo "mv $TMP_FILE $IGNORE_IP_LIST" >> $UNBAN_SCRIPT # 將TMP_FILE文件重命名為IGNORE_IP_LIST,即不刪除DROP規則鏈的IP地址。仍然設置為拒絕訪問服務器。# 刪除以下三個臨時文件echo "rm -f $UNBAN_SCRIPT" >> $UNBAN_SCRIPTecho "rm -f $UNBAN_IP_LIST" >> $UNBAN_SCRIPTecho "rm -f $TMP_FILE" >> $UNBAN_SCRIPT. $UNBAN_SCRIPT & # 后臺執行腳本UNBAN_SCRIPT }add_to_cron() # 定義更新定時任務的函數 {rm -f $CRON # 若ddos.cron定時任務存在,刪除定時任務sleep 1service crond restart # 重啟crond服務sleep 1echo "SHELL=/bin/sh" > $CRONif [ $FREQ -le 2 ]; then # 檢查間隔小于等于2分鐘,檢查時間間隔的取值范圍一般為0-59,單位分鐘。echo "0-59/$FREQ * * * * root /usr/local/ddos/ddos.sh >/dev/null 2>&1" >> $CRONelse # 檢查間隔大于2分鐘let "START_MINUTE = $RANDOM % ($FREQ - 1)" # 若FREQ是5,START_MINUTE為0 1 2 3let "START_MINUTE = $START_MINUTE + 1" # START_MINUTE為1 2 3 4let "END_MINUTE = 60 - $FREQ + $START_MINUTE" # END_MINUTE = 60 - 5 + [1 2 3 4] = [56 57 58 59]echo "$START_MINUTE-$END_MINUTE/$FREQ * * * * root /usr/local/ddos/ddos.sh >/dev/null 2>&1" >> $CRON # 0-59之間的第一個檢查時間START_MINUTE,最后一個檢查時間END_MINUTEfiservice crond restart # 重啟crond服務 }load_conf # 加載ddos.conf配置文件 while [ $1 ]; docase $1 in'-h' | '--help' | '?' )showhelp # 顯示幫助信息的函數exit;;'--cron' | '-c' ) # 添加定時任務add_to_cronexit;;'--kill' | '-k' ) # 啟用拒絕IP的功能KILL=1;;*[0-9]* )NO_OF_CONNECTIONS=$1 # 指定閾值,用于手動執行ddos.sh腳本時使用,默認的閾值為ddos.conf文件中的NO_OF_CONNECTIONS;;* )showhelpcatcat exit;;esacshift doneTMP_PREFIX='/tmp/ddos' # 臨時文件前綴 TMP_FILE="mktemp $TMP_PREFIX.XXXXXXXX" # 創建一個臨時文件的命令 BANNED_IP_MAIL=`$TMP_FILE` # 執行創建一個臨時文件 BANNED_IP_LIST=`$TMP_FILE` # 執行創建一個臨時文件 echo "Banned the following ip addresses on `date`" > $BANNED_IP_MAIL # 在當前時間下禁止以下IP地址 echo >> $BANNED_IP_MAIL # 空一行 BAD_IP_LIST=`$TMP_FILE` netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr > $BAD_IP_LIST # 統計訪問服務器的IP地址機器訪問次數,并把結果寫入文件BAD_IP_LIST cat $BAD_IP_LIST # 顯示BAD_IP_LIST文件中的統計信息 if [ $KILL -eq 1 ]; then # KILL的值等于1IP_BAN_NOW=0while read line; doCURR_LINE_CONN=$(echo $line | cut -d" " -f1) # 次數CURR_LINE_IP=$(echo $line | cut -d" " -f2) # IP地址if [ $CURR_LINE_CONN -lt $NO_OF_CONNECTIONS ]; then # 次數小于閾值,跳出當前整個循環。breakfiIGNORE_BAN=`grep -c $CURR_LINE_IP $IGNORE_IP_LIST` # 計算統計信息中的IP地址在IGNORE_IP_LIST文件中的IP個數,即白名單IPif [ $IGNORE_BAN -ge 1 ]; then # 若在文件IGNORE_IP_LIST文件中的IP個數大于等于1continue # 繼續循環fiIP_BAN_NOW=1echo "$CURR_LINE_IP with $CURR_LINE_CONN connections" >> $BANNED_IP_MAIL # 說明某個IP訪問多少次echo $CURR_LINE_IP >> $BANNED_IP_LIST # 把IP寫入到BANNED_IP_LIST文件中echo $CURR_LINE_IP >> $IGNORE_IP_LIST # 把IP寫入到IGNORE_IP_LIST文件中if [ $APF_BAN -eq 1 ]; then$APF -d $CURR_LINE_IP # 當APF_BAN的值為1時,使用APF的方式拒絕IPelse$IPT -I INPUT -s $CURR_LINE_IP -j DROP # 當APF_BAN不等于1時,使用iptables的方式添加規則拒絕指定IP訪問服務器fidone < $BAD_IP_LIST # 訪問服務器的統計信息作為輸入if [ $IP_BAN_NOW -eq 1 ]; then # IP_BAN_NOW的值為1dt=`date`if [ $EMAIL_TO != "" ]; then cat $BANNED_IP_MAIL | mail -s "IP addresses banned on $dt" $EMAIL_TO # 把被拒絕的IP地址,發送到郵箱EMAIL_TOfiunbanip # 取消拒絕IP地址fi fi rm -f $TMP_PREFIX.* # 刪除創建的臨時文件ddos.sh 腳本總結:
腳本結構說明:
聲明了5個函數,分別為load_conf、head、showhelp、unbanip、add_to_cron。各函數作用如下:
load_conf:加載ddox.conf文件的內容
head:輸出的固定表頭
showhelp:顯示幫助信息
unbanip:等待指定時間后,刪除全部無效的規則鏈,解除拒絕的IP。
add_to_cron:添加定時任務
主體說明【除函數聲明外的部分】:
①創建臨時文件BAD_IP_LIST,并把訪問服務器的統計信息寫入其中。
②KILL參數決定是否屏蔽IP,當KILL的值為1時,訪問次數超過閾值的才會被屏蔽,并指定了屏蔽方式時APF還是iptables,建議使用iptables。
③當IP_BAN_NOW的值為1時,發送拒絕IP的消息給指定郵箱EMAIL_TO,然后執行unbanip函數,即等待BAN_PERIOD時間后,將已拒絕的IP地址對應的iptables規則鏈刪除,允許其訪問服務器。
④最后刪除所有的臨時文件。
整體流程說明:
首先通過netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -nr 獲取到訪問服務器的IP地址和次數的統計信息,然后對訪問次數超過閾值的IP地址進行拒絕訪問操作,即添加DROP的規則鏈,最后等待BAN_PERIOD時間后,刪除之前添加的DROP規則鏈。以上流程設置定時任務,默認是每分鐘都進行一次。
總結
以上是生活随笔為你收集整理的DDOS-deflate工具:ddos.sh脚本解读(预防DDOS攻击脚本)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DZ论坛常见基本设置问题
- 下一篇: 鸿蒙心理测评中心,最近很火的心理测试:你