1. 程式人生 > >Linux系統防CC攻擊自動拉黑IP增強版Shell腳本

Linux系統防CC攻擊自動拉黑IP增強版Shell腳本

png lac 分鐘 自動 style -h sys linux 間隔

一、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

二、執行腳本

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

nohup ./deny_blackip.sh 50 & 執行後會出現如下信息: [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: [root@Mars_Server iptables]# ll nohup.out -rw------- 1 root root 0 Nov 5 21:15 nohup.out 好了,現在你執行執行ps aux 應該可以找到如下進程: 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個並發,立即拉黑,並發一封郵件給你!

三、效果測試

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

①、模擬CC攻擊的服務器截圖:
技術分享圖片

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

技術分享圖片

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

技術分享圖片

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

四、附加說明

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

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

③、關於腳本的單IP並發限制,我實際測試同時打開博客多個頁面並持續刷新,頂多也就產生十來個並發,所以單IP超過50個並發就已經有很大的問題了!當然,文章的閾值設為50也只是建議值,你可以根據需求自行調整(如果網站靜態文件未托管到CDN,那麽一個頁面可能存在10多個並發);

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

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

源文章:https://zhangge.net/4649.html

Linux系統防CC攻擊自動拉黑IP增強版Shell腳本