zoukankan      html  css  js  c++  java
  • shell脚本把一些请求量非常高的ip给拒绝掉

    需求: 根据web服务器上的访问日志,把一些请求量非常高的ip给拒绝掉!并且每隔半小时把不再发起请求或者请求量很小的ip给解封。
     
    假设: 
     
    1. 一分钟内请求量高于100次的IP视为不正常请求。
     
    2. 访问日志路径为/data/logs/access_log。
     
    用第2例中的1.log作为演示日志
     
    #### 核心要点
    * 统计ip访问次数,排序
    * 如何标记每隔半小时
    * iptables计数器是一个重要的判断指标
    * 函数(封IP、解封IP)
     
    #### 参考答案
    ```
    #!/bin/bash
    block_ip()
    {
    t1=`date -d "-1 min" +%Y:%H:%M`
    log=/data/logs/access_log
     
    egrep "$t1:[0-9]+" $log > /tmp/tmp_last_min.log
    awk '{print $1}' /tmp/tmp_last_min.log |sort -n |uniq -c|sort -n |awk '$1>100 {print $2}' > /tmp/bad_ip.list
    n=`wc -l /tmp/bad_ip.list|awk '{print $1}'`
    if [ $n -ne 0 ]
    then
        for ip in `cat /tmp/bad_ip.list`
        do
        iptables -I INPUT -s $ip -j REJECT
        done
    fi
    }
     
    unblock_ip()
    {
        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
        iptables -D INPUT -s $ip -j REJECT
        done
        fi
        iptables -Z
    }
     
    t=`date +%M`
    if [ $t == "00" ] || [ $t == "30" ]
    then
       unblock_ip
       block_ip
    else
       block_ip
    fi
    

      

  • 相关阅读:
    第05组 Alpha冲刺 (6/6)
    第05组 Alpha冲刺 (5/6)
    第五次作业
    第05组 Alpha冲刺 (4/6)
    第05组 Alpha冲刺 (3/6)
    第05组 Alpha冲刺 (2/6)
    第05组 Alpha冲刺 (1/6)
    第四次作业
    差分约束
    置换群的性质与burnside引理
  • 原文地址:https://www.cnblogs.com/weifeng1463/p/10296497.html
Copyright © 2011-2022 走看看