1. 程式人生 > >用shell暫時緩解ddos和cc大流量訪問的情況

用shell暫時緩解ddos和cc大流量訪問的情況

modified sed -c 任務 dos 條件 tab gin ble

在日常運維中,難免碰到大流量,造成網站無法訪問或者影響緩慢的情況;
如果沒有購買高防產品,則可以通過shell暫時緩解;

#!/bin/bash
##############################################
#Author: Liuzhengwei - [email protected]
#WeiXin:1135960569
#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暫時緩解ddos和cc大流量訪問的情況