引用 | 編輯
Qoo
2006-12-13 14:44 |
樓主
▼ |
||
x0
這個程式是利用perl + 一些系統指令完成的 主要的資料來源是利用netstat的連線紀錄來判斷的 複製程式 #!/usr/bin/perl # 防砍站小程式 # 肉腳梁楓製作 # v 0.0超級不穩版 # 製作日期:2003.1.31 # 版權 GPL # 資料設定 $Max_Connect_Number = 300; # 最多能有多少連結 $IPFW_Number = 950; # 防火牆規則設定在第幾條規則 沒必要可以不動 $PATH = '/tmp/' # 暫存檔路徑 $Netstat = 'temp1' #暫存檔1 沒必要就不用亂動了! $CN = 'temp2' #暫存檔2 沒必要就不用亂動了!C #系統設定 $USR_BIN_PATH = '/usr/bin/' $BIN_PATH = '/bin/' $SBIN_PATH = '/sbin/' #以下就可以不用動了 system("$USR_BIN_PATH"."netstat -na > $PATH$Netstat"); open(IPFW,$PATH.$Netstat); open(IPFW2,">$PATH$CN") ||die("can't open IPFW2 file\n"); while($line = <IPFW>){ $line =~ s/ +/,/g; print IPFW2 "$line" || die("can't input IPFW2"); } close IPFW; close IPFW2; system("$BIN_PATH"."rm -rf $PATH$Netstat"); system("$USR_BIN_PATH"."cut -f 1,5 -d , $PATH$CN > $PATH$Netstat"); open(IPFW,$PATH.$Netstat); open(IPFW2,">$PATH$CN"); while(<IPFW>){ ($line[0],$line[1],$line[2]) = split(/,/); chomp($_); chomp($line[0],$line[1]); if($line[0] eq "tcp4"){ ($IP[0],$IP[1],$IP[2],$IP[3]) = split(/\./,$line[1]); if($IP[0] > 1 and $IP[0] != 127){ if($IP[0] == 61 and $IP[1] == 63 and $IP[2] == 145 and $IP[3] >= 65 and $IP[3] <= 94){}else{ print IPFW2 "$IP[0].$IP[1].$IP[2].$IP[3]\n"; } } } } close IPFW; close IPFW2; system("$USR_BIN_PATH"."sort $PATH$CN | $USR_BIN_PATH"."uniq -c > $PATH$Netstat"); open(IPFW,$PATH.$Netstat); open(IPFW2,">$PATH$CN"); while($line = <IPFW>){ $line =~ s/ +/,/g; ($IP[0],$IP[1],$IP[2])=split(/\,/,$line); if($IP[1] >= $Max_Connect_Number){ chomp($IP[2]); system("$SBIN_PATH"."ipfw add $IPFW_Number deny all from $IP[2] to any"); system("$SBIN_PATH"."ipfw add $IPFW_Number deny all from any to $IP[2]"); print "$SBIN_PATH"."ipfw add $IPFW_Number deny all from $IP[2] to any\n"; } } close IPFW; close IPFW2; system("$BIN_PATH"."rm -rf $PATH$Netstat;rm -rf $PATH$CN"); 因為最近會網站一直被砍,所以上網找了一下,剛好梁楓大哥有這個程式 轉貼自 http://phorum.study-area.org/viewtopic.php?t=14953 x0
|
引用 | 編輯
andyz
2006-12-13 16:20 |
1樓
▲ ▼ |
感謝大大的分享
我來補充一下LINUX的簡單防砍站的方法 建立一個檔名為block_http 內容如下 複製程式 #!/bin/sh ## 以下請自行依照您的環境進行合宜的設定 # 設定網頁伺服器的通訊埠號, 一般通用的埠號為 80 HTTP_PORT="80" # 設定要忽略的 IP, 每個 IP 以 "|" 隔開, 這些 IP 將永遠不會被阻擋。 # 此變數數請務必至少設定一個 IP, 否則會造成 script 無法運作 SKIP_IPS="127.0.0.1|0.0.0.0" # 設定允許同時連線網頁伺服器的次數 MAX_TRY=10 # 設定一個鏈名, 所有阻擋特定 IP 的規則將統一放置於此鏈中 BLOCKCHAIN="blockhttp" ## 以下設定一般情形下保留預設值即可 # 記錄檔的路徑與檔案名稱 LOGFILE="/var/log/block_http.log" # 記錄檔內的日期格式, 關於格式的代號與意義, 請執行 man date 閱讀其說明文件 DATEFMT="%Y/%m/%d %R" # 設定系統執行檔的路徑 PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" # 設定阻擋特定 IP 的函式 blockip () { [ "`iptables -L -n | grep $BLOCKCHAIN | wc -l`" -lt 2 ] && { iptables -N $BLOCKCHAIN iptables -A INPUT -j $BLOCKCHAIN } iptables -L $BLOCKCHAIN -n | grep $1 >/dev/null 2>&1 || \ iptables -A $BLOCKCHAIN -s $1 -j DROP } # 列出目前所有連線, 並計算各 IP 的重複次數 netstat -tn | awk "/:$HTTP_PORT .*TIME_WAIT/ { match(\$5, /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip=substr(\$5, RSTART, RLENGTH) if ( ip ~ /$SKIP_IPS/ ) {} else print ip}" | \ sort | uniq -c | \ while read num ip; do # 如果 $num 內的數字大於 $MAX_TRY 所指定的次數, 則使用 blockip 函式 # 阻擋 $ip 的連線 if [ "$num" -ge "$MAX_TRY" ]; then blockip $ip echo "`date +"$DATEFMT"` blocking $ip... CONN=$num" >> $LOGFILE fi done 將此檔放入/usr/local/bin/的目錄下 然後執行 crontab -e 加入內容如下 複製程式 * /2 * * * * /usr/local/bin/block_http 以上設定每隔2分鐘檢查一次,檢查若發現某個IP連線次數超過MAX_TRY的值,就阻擋該IP ------------------------------------------------------------------------ 每隔一段時間,自動清除BLOCKCHAIN crontab -e 複製程式 00 01 * * * /sbin/iptables -F blockhttp x2 |
引用 | 編輯
mnbmnb5266
2010-08-20 23:44 |
2樓
▲ |
謝謝大大的教學,不過我的網站現在還為出現過這些問題。不過說不定以後出現了這篇教學可以派上用場也說不定,先收藏了
x0 |