程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Linux服務器自動封禁訪問異常的IP腳本(一)

Linux服務器自動封禁訪問異常的IP腳本(一)

編輯:關於PHP編程

Linux服務器自動封禁訪問異常的IP腳本(一)


問題:
最近發現很多大並發爬我們網站部分接口的爬蟲,導致經常性帶寬異常和服務異常,為了暫時性偷懶,寫腳本自動封禁這些IP。
思路和方法:
經過日志排查,發現這些爬蟲IP不多,但是並發很大,基本在10-20並發之間,正常的單IP請求幾乎很少有10並發以上的,所以處理的思路就是
使用iptables臨時封禁這些異常IP,封禁規則每5分鐘單IP請求量超過3000次,即5分鐘內單IP並發超過10,封禁此IP,另外為了防止封錯,腳本自動每 5分鐘解禁5分鐘前封禁的IP地址。
實現:
為了簡單管理,使用shell+crontab實現腳本處理。
腳本:
#!/bin/sh
##Author:bbzsxjj
##Email:[email protected]
##Usage:auto deny ip by iptables
##Ver:1.0
timenow=`date +'%H%M00'`
timelast=`date +'%H%M00' -d '-5min'`
lastnum=1000000 ##日志的行數,可以根據自己的業務頻率選取
limitnum=3000 ##並發限制,300*10
ipbin=/sbin/iptables
NeedDenyiplist=/opt/sbin/ipdeny.list
NeedPurgeiplist=/opt/sbin/ippurge.list
LogFile=/data/logs/haproxy.log
CreateList(){
if [ -f ${LogFile} ]
then
if [ -f ${NeedDenyiplist} ]
then
mv ${NeedDenyiplist} ${NeedPurgeiplist}
fi
tail -n${lastnum} ${LogFile}|awk '{gsub(/:/,"",$3);if($3>='${timelast}' && $3<='${timenow}'){a[$6]++}}END{for(i in a){if(a[i]>'${limitnum}'){print $6}}}' >>${NeedDenyiplist} ##這裡需要根據日志的格式進行處理,具體的需要根據實際情況修改處理方法
if [ `wc -l ${NeedDenyiplist}|awk '{print $1}'` -eq 0 ]
then
rm -rf ${NeedDenyiplist}
fi
fi

}


DenyIP(){
for Dip in `cat ${NeedDenyiplist}|grep -E -v '^$|#'`
do
${ipbin} -I INPUT -s ${Dip} -p tcp --dport 80 -j DROP
done
}
PurgeIP(){
for Dip in `cat ${NeedPurgeiplist}|grep -E -v '^$|#'`
do
${ipbin} -D INPUT -s ${Dip} -p tcp --dport 80 -j DROP
done
}


main(){
CreateList
if [ -f ${NeedPurgeiplist} ]
then
PurgeIP
fi
if [ -f ${NeedDenyiplist} ]
then
DenyIP
fi
}
main


之後添加crontab:
###denyip
*/5 * * * * /bin/sh /opt/sbin/denyip.sh >/dev/null 2>&1;


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved