在平常運維中,不免碰到大流量,形成網站沒法訪問或者影響緩慢的狀況;
若是沒有購買高防產品,則能夠經過shell暫時緩解;nginx
#!/bin/bash ############################################## #Author: Liuzhengwei - ×××@qq.com #WeiXin:××× #Last modified: 2018-10-09 14:31 #Filename: blockip.sh #Description: 檢測每分鐘的訪問IP,每分鐘訪問超過100次則進行封禁 # 每30分鐘再檢測一次,若是被封禁的IP訪問量很小時,則解封 ############################################## source /etc/profile #定義時間,用於過濾出每分鐘的日誌 time=`date -d "-1 min" +%Y:%H:%M` log_dir=/usr/local/nginx/logs/access.log #定義阻塞IP的函數 block_ip(){ #拉取上一分鐘全部的日誌,放到指定文件中 egrep "$time:[0-5]+" $log_dir > /tmp/last_min.log #將訪問超過100的IP記錄下,加入iptables進行阻塞 awk '{print $1}' /tmp/last_min.log | sort -n | uniq -c| sort -n | awk '$1>100 {print $2}' > /tmp/bad_ip.list #計算IP的數量 number=`wc -l /tmp/bad_ip.list | awk '{print $1}'` #當ip數大於0時,使用iptables封禁 if [ $number -gt 0 ];then for ip in `cat /tmp/bad_ip.list`;do iptables -I INPUT -s $ip -j REJECT done #記錄被封禁的IP echo "`date +%F-%T` 封掉的IP有:" >> /tmp/block_ip.log cat /tmp/bad_ip.list >> /tmp/block_ip.log fi } #定義解封IP的函數 unblock_ip(){ #將包個數小於5的ip記錄到文件中,標記爲白名單 iptables -nvL INPUT | sed '1d' | awk '$1<5{print $8}' > /tmp/good_ip.list #統計白名單IP個數 number=`wc -l /tmp/good_ip.list | awk '{print $1}'` if [ $number -gt 0 ];then for ip in `cat /tmp/good_ip.list`;do iptables -D INPUT -s $ip -j REJECT done #記錄被解封的IP echo "`date +%F-%T` 解封的IP有:" >> /tmp/unblock_ip.log cat /tmp/good_ip.list >> /tmp/unblock_ip.log fi #清空計數器 iptables -Z } #取出當前時間 now=`date +%M` #每隔30分鐘解封符合解封條件的IP,其他時間封禁IP if [ $now == "00" ] || [ $now == "30" ];then unblock_ip block_ip else block_ip fi
加上任務計劃,每分鐘執行一次便可~shell
* * * * * /server/scripts/check_ip.sh