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