感謝大大的分享
我來補充一下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/lin...30cron.php以上設定每隔2分鐘檢查一次,檢查若發現某個IP連線次數超過MAX_TRY的值,就阻擋該IP
------------------------------------------------------------------------
每隔一段時間,自動清除BLOCKCHAIN
crontab -e
複製程式
00 01 * * * /sbin/iptables -F blockhttp