關於防砍站

Home Home
引用 | 編輯 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
如果不懂用法,請參考這裡http://linux.vbird.org/linux_basic/0430cron.php

以上設定每隔2分鐘檢查一次,檢查若發現某個IP連線次數超過MAX_TRY的值,就阻擋該IP

------------------------------------------------------------------------

每隔一段時間,自動清除BLOCKCHAIN
crontab -e
複製程式
00 01 * * * /sbin/iptables -F blockhttp


獻花 x2
引用 | 編輯 mnbmnb5266
2010-08-20 23:44
2樓
  
謝謝大大的教學,不過我的網站現在還為出現過這些問題。不過說不定以後出現了這篇教學可以派上用場也說不定,先收藏了

獻花 x0