一、Shell 代碼
#!/bin/bash
#Author:ZhangGe
#Desc:Auto Deny Black_IP Script.#Date:2014-11-05#取得參數(shù)$1為并發(fā)閾值,若留空則默認(rèn)允許單IP最大50并發(fā)(實(shí)際測試發(fā)現(xiàn),2M帶寬,十來個并發(fā)服務(wù)器就已經(jīng)無法訪問了!)if [[ -z $1 ]];then
num=50else
num=$1fi
#巧妙的進(jìn)入到腳本工作目錄
cd $(cd $(dirname $BASH_SOURCE) && pwd)
#請求檢查、判斷及拉黑主功能函數(shù)function check(){
iplist=`netstat -an |grep ^tcp.*:80|egrep -v 'LISTEN|127.0.0.1'|awk -F"[ ]+|[:]" '{print $6}'|sort|uniq -c|sort -rn|awk -v str=$num '{if ($1>str){print $2}}'`
if [[ ! -z $iplist ]];
then >./black_ip.txt for black_ip in $iplist do
#白名單過濾中已取消IP段的判斷功能,可根據(jù)需要自行修改以下代碼(請參考前天寫的腳本)
#exclude_ip=`echo $black_ip | awk -F"." '{print $1"."$2"."$3}'`
#grep -q $exclude_ip ./white_ip.txt
grep -q $black_ip ./white_ip.txt if [[ $? -eq 0 ]];then
echo "$black_ip (white_ip)" >>./black_ip.txt else
echo $black_ip >>./black_ip.txt
iptables -nL | grep $black_ip ||(iptables -I INPUT -s $black_ip -j DROP & echo "$black_ip `date +%Y-%m-%H:%M:%S`">>./deny.log & echo 1 >./sendmail)
fi
done
#存在并發(fā)超過閾值的單IP就發(fā)送郵件 if [[ `cat ./sendmail` == 1 ]];then sendmsg;fi
fi}
#發(fā)郵件函數(shù)function sendmsg(){
netstat -nutlp | grep "sendmail" >/dev/null 2>&1 || /etc/init.d/sendmail start >/dev/null 2>&1
echo -e "From: 發(fā)郵件地址@qq.com
To:收郵件地址@qq.com
Subject:Someone Attacking your system!!
Its Ip is" >./message
cat ./black_ip.txt >>./message /usr/sbin/sendmail -f 發(fā)郵件地址@qq.com -t 收郵件地址@qq.com -i <. message="">./sendmail}
#間隔10s無限循環(huán)檢查函數(shù)while truedo
check
#每隔10s檢查一次,時間可根據(jù)需要自定義
sleep 10done
二、執(zhí)行腳本
將以上代碼保存為 deny_blackip.sh 之后,進(jìn)入到腳本文件所在目錄,然后使用如下命令后臺執(zhí)行腳本(后面的 50 表示并發(fā)數(shù),可自行調(diào)整):
nohup ./deny_blackip.sh 50 &
執(zhí)行后會出現(xiàn)如下信息:
[root@Mars_Server iptables]# nohup ./deny_blackip.sh 50 & [1] 23630[root@Mars_Server iptables]# nohup: ignoring input and appending output to `nohup.out'
表示如果腳本產(chǎn)生輸出信息,將會寫入到 nohup.out 文件,可以看到當(dāng)前目錄已經(jīng)生成了一個空的 nohup.out:
[root@Mars_Server iptables]# ll nohup.out-rw------- 1 root root 0 Nov 5 21:15 nohup.out
好了,現(xiàn)在你執(zhí)行執(zhí)行 ps aux 應(yīng)該可以找到如下進(jìn)程:
root 23630 0.0 0.2 5060 1224 pts/0 S 21:15 0:00 /bin/bash ./deny_blackip.sh
root 23964 0.0 0.0 4064 508 pts/0 S 21:19 0:00 sleep 10
一切順利!每 10s 將檢查一次服務(wù)器請求,如果某個 IP 超過 50 個并發(fā),立即拉黑,并發(fā)一封郵件給你!
三、效果測試
測試很簡單,先使用 nohup 啟動腳本,然后在另一臺 Linux 或 Windows 安裝 webbench,然后模擬 50+并發(fā)去抓取該服務(wù)器的某個頁面,20s 之內(nèi)可見到效果,下面是我的測試截圖:
①、模擬 CC 攻擊的服務(wù)器截圖:
②、被 CC 攻擊的服務(wù)器截圖:
③、攻擊 IP 被拉黑后的報警郵件:
測試時,模擬 55 個并發(fā)攻擊了 20s,立馬就被拉黑了,效果很明顯!
四、附加說明
①、腳本發(fā)郵件需要安裝 sendmail,若未安裝請執(zhí)行 yum -y install sendmail 安裝并啟動即可;
②、若要停止后臺運(yùn)行的腳本,只要使用 ps aux 命令找到該腳本的 pid 線程號,然后執(zhí)行 kill -9 pid 號即可結(jié)束;
③、關(guān)于腳本的單 IP 并發(fā)限制,我實(shí)際測試同時打開博客多個頁面并持續(xù)刷新,頂多也就產(chǎn)生十來個并發(fā),所以單 IP 超過 50 個并發(fā)就已經(jīng)有很大的問題了!當(dāng)然,文章的閾值設(shè)為 50 也只是建議值,你可以根據(jù)需求自行調(diào)整(如果網(wǎng)站靜態(tài)文件未托管到 CDN,那么一個頁面可能存在 10 多個并發(fā));
④、寫這個腳本,主要是為了彌補(bǔ)用 crontab 執(zhí)行時間間隔最低只能是 1 分鐘的不足,可以讓 CC 防護(hù)更嚴(yán)密,甚至每隔 1S 執(zhí)行一次!雖說腳本不怎么占用資源,不過還是建議 10s 執(zhí)行一次為佳,不用太過極端是吧?
⑤、對于白名單過濾,只要將白名單 IP 保存到腳本同一目錄下的 white_ip.txt 文件中即可,若發(fā)現(xiàn)攻擊 IP 在白名單中,腳本不會直接拉黑,而是發(fā)一封郵件給你,讓你自己判斷這個白名單攻擊你是為毛?如果白名單需要支持 IP 段,請參考我前天寫的腳本即可。
五.可視化解決處理方案
很多用戶可能不用Linux系統(tǒng)的操作為了方便用戶自身能處理和操作相對頻率比較高的訪問ip,我們?yōu)橛脩糁贫丝梢暬缑娌僮鞯膚af安全系統(tǒng)。
轉(zhuǎn)發(fā)自:http://news.deshengidc.cn/post-56.html