最近幾天有一個問題一直困擾著我,就是我維護的一個網站最近幾天總是在整點附近出問題,那時候數據庫服務器CPU使用率超高,持續時間1-5分鐘。
然后,我就開始各種查、各種記,出問題的時間點,數據庫查詢量很大,我把這些查詢記錄了下來,并做分析,然而并沒有什么特別有規律的現象,因為這些查詢非常分散,跟正常的查詢一般無二,唯一區別就是量大。
同時,也去分析了WEB端的訪問日志,截取出問題那幾分鐘的日志進行分析,過去兩天一直都沒有找到規律,跟數據庫一樣,非常分散,跟正常的訪問一樣,只是量大了一些。
我甚至懷疑是不是這臺數據庫服務器的硬件出現了問題,畢竟我們用的是騰訊云的機器,云主機存在資源共享的問題。所以,我還提交了工單,讓售后去幫忙查,但無果。
今天,我再次分析日志時,發現了一些規律,那就是有三個ip訪問量非常大。
這是一分鐘內的統計數據,左邊為IP的請求次數,一分鐘一個正常的IP的請求數怎么可能超過1000次呢?甚至連100次都不應該超過才對。所以,直接把IP封掉。
也許這幾天的問題跟IP訪問量大沒有直接關系,但既然今天發現了此問題,那就先解決再說。
考慮到后面還會有類似的IP訪問,那我干脆直接寫一個自動封IP的腳本,IP封了肯定需要自動解封,所以,我的腳本主要邏輯是:
1)每分鐘查一下過去1分鐘的日志,對IP進行分析,將訪問量大于400的給封掉;
2)每隔半小時針對過去半小時以來的被封的IP進行分析,如果不再有數據包過來,則解封。 下面是腳本內容:
#! /bin/bash #定義1分鐘以前的時間,用于過濾1分鐘以前的日志 t1=`date -d "-1 min" +%Y:%H:%M` log=/var/log/nginx/access.log block_ip() { egrep "$t1:[0-5]+" $log > /tmp/tmp_last_min.log #把1分鐘內訪問量高于400的ip記錄到一個臨時文件中 #過濾掉白名單IP(81.123.35.171) awk'{print$1}'/tmp/tmp_last_min.log|grep-v'81.123.35.171'|sort-n|uniq-c|sort-n|awk'$1>400{print$2}'>/tmp/bad_ip.list #計算ip的數量 n=`wc -l /tmp/bad_ip.list|awk '{print $1}'` #當ip數大于0時,才會用iptables封掉它 if [ $n -ne 0 ] then for ip in `cat /tmp/bad_ip.list` do /usr/sbin/iptables -I INPUT -s $ip -j DROP done #將這些被封的IP記錄到日志里 echo "`date` 封掉的IP有:" >> /tmp/block_ip.log cat /tmp/bad_ip.list >> /tmp/block_ip.log fi } unblock_ip() { #首先將包個數小于5的ip記錄到一個臨時文件里,把它們標記為白名單IP /usr/sbin/iptables -nvL INPUT|sed '1d' |awk '$1<5 {print $8}' > /tmp/good_ip.list n=`wc -l /tmp/good_ip.list|awk '{print $1}'` if [ $n -ne 0 ] then for ip in `cat /tmp/good_ip.list` do /usr/sbin/iptables -D INPUT -s $ip -j DROP done echo "`date` 解封的IP有:" >> /tmp/unblock_ip.log cat /tmp/good_ip.list >> /tmp/unblock_ip.log fi #當解封完白名單IP后,將計數器清零,進入下一個計數周期 /usr/sbin/iptables -Z } #取當前時間的分鐘數 t=`date +%M` #當分鐘數為00或者30時(即每隔30分鐘),執行解封IP的函數,其他時間只執行封IP的函數 if [ $t == "00" ] || [ $t == "30" ] then unblock_ip block_ip else block_ip fi
然后寫一個每分鐘都執行的任務計劃就可以啦。
審核編輯:劉清
-
Web服務器
+關注
關注
0文章
138瀏覽量
24412
原文標題:分享一個自動封IP的腳本
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論