(轉自張戈博客)Linux系統防CC攻擊自動拉黑IP加強版Shell腳本

 (轉自張戈博客) html

前天沒事寫了一個防CC攻擊的Shell腳本,沒想到這麼快就要用上了,緣由是由於360網站衛士的緩存黑名單忽然沒法過濾後臺,致使WordPress沒法登陸!雖然,能夠經過修改本地hosts文件來解決這個問題,可是仍是想暫時取消CDN加速和防禦來測試下服務器的性能優化及安全防禦。 web

前天寫的Shell腳本是加入到crontab計劃任務執行的,每5分鐘執行一次,今天實際測試了下,可仍是能夠用的,可是感受5分鐘時間有點過長,沒法作到嚴密防禦。因而稍微改進了下代碼,如今簡單的分享下! 緩存

 

1、Shell代碼

 

#!/bin/bash
#Author:ZhangGe
#Desc:Auto Deny Black_IP Script.
#Date:2014-11-05
#取得參數$1爲併發閾值,若留空則默認容許單IP最大50併發(實際測試發現,2M帶寬,十來個併發服務器就已經沒法訪問了!)
if [[ -z $1 ]];then
        num=50
else 
        num=$1
fi

#巧妙的進入到腳本工做目錄
cd $(cd $(dirname $BASH_SOURCE) && pwd)

#請求檢查、判斷及拉黑主功能函數
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段的判斷功能,可根據須要自行修改如下代碼(請參考前天寫的腳本)
                        #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
                #存在併發超過閾值的單IP就發送郵件
                if [[ `cat ./sendmail` == 1 ]];then sendmsg;fi
        fi
}

#發郵件函數
function sendmsg(){
        netstat -nutlp | grep "sendmail" >/dev/null 2>&1 || /etc/init.d/sendmail start >/dev/null 2>&1
        echo -e "From: 發郵件地址@qq.com\nTo:收郵件地址@qq.com\nSubject:Someone Attacking your system!!\nIts Ip is" >./message
        cat ./black_ip.txt >>./message
        /usr/sbin/sendmail -f 發郵件地址@qq.com -t 收郵件地址@qq.com -i <./message
        >./sendmail
}

#間隔10s無限循環檢查函數
while true
do 
        check
        #每隔10s檢查一次,時間可根據須要自定義
        sleep 10
done

2、執行腳本

 

將以上代碼保存爲deny_blackip.sh以後,進入到腳本文件所在目錄,而後使用以下命令後臺執行腳本(後面的50表示併發數,可自行調整): 安全

1
nohup . / deny_blackip .sh 50 &

執行後會出現以下信息: 性能優化

1
2
3
[ root @ Mars_Server iptables ] # nohup ./deny_blackip.sh 50 &
[ 1 ] 23630
[ root @ Mars_Server iptables ] # nohup: ignoring input and appending output to `nohup.out'

表示若是腳本產生輸出信息,將會寫入到nohup.out文件,能夠看到當前目錄已經生成了一個空的nohup.out: bash

1
2
[ root @ Mars_Server iptables ] # ll nohup.out
- rw -- -- -- - 1 root root 0 Nov    5 21 : 15 nohup .out

好了,如今你執行執行ps aux 應該能夠找到以下進程: 服務器

1
2
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將檢查一次服務器請求,若是某個IP超過50個併發,當即拉黑,併發一封郵件給你! 併發

3、效果測試

測試很簡單,先使用nohup啓動腳本,而後在另外一臺Linux或Windows安裝webbench,而後模擬50+併發去抓取該服務器的某個頁面,20s以內可見到效果,下面是個人測試截圖: app

①、模擬CC攻擊的服務器截圖: tcp

②、被CC攻擊的服務器截圖:

③、攻擊IP被拉黑後的報警郵件:

 

測試時,模擬55個併發攻擊了20s,立馬就被拉黑了,效果很明顯!

 

4、附加說明

①、腳本發郵件須要安裝sendmail,若未安裝請執行yum -y install sendmail安裝並啓動便可;

②、若要中止後臺運行的腳本,只要使用ps aux命令找到該腳本的pid線程號,而後執行kill -9 pid號便可結束;

③、關於腳本的單IP併發限制,我實際測試同時打開博客多個頁面並持續刷新,頂多也就產生十來個併發,因此單IP超過50個併發就已經有很大的問題了!固然,文章的閾值設爲50也只是建議值,你能夠根據需求自行調整;

④、寫這個腳本,主要是爲了彌補用crontab執行時間間隔最低只能是1分鐘的不足,可讓CC防禦更嚴密,甚至每隔1S執行一次!雖然說腳本不怎麼佔用資源,不過仍是建議10s執行一次爲佳,不用太過極端是吧?

⑤、對於白名單過濾,只要將白名單IP保存到腳本同一目錄下的white_ip.txt文件中便可,若發現攻擊IP在白名單中,腳本不會直接拉黑,而是發一封郵件給你,讓你本身判斷這個白名單攻擊你是爲毛?若是白名單須要支持IP段,請參考我前天寫的腳本便可。

就囉嗦這麼多,主要仍是本身用,而後分享出來給有須要的人一些參考,我的vps服務器雖然說不多有人攻擊,可是基本的安裝防禦仍是必需要作的!但願本文對你有所幫助!

相關文章
相關標籤/搜索