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