网站LOGO
静若安然
页面加载中
11月21日
网站LOGO 静若安然
记录个人学习生活和成长历程
菜单
  • 热评
    用户的头像
    首次访问
    上次留言
    累计留言
    我的等级
    我的角色
    打赏二维码
    打赏博主
    服务器自动封ip脚本
    点击复制本页信息
    微信扫一扫
    文章二维码
    文章图片 文章标题
    创建时间
  • 一 言
    确认删除此评论么? 确认
  • 本弹窗介绍内容来自,本网站不对其中内容负责。

    服务器自动封ip脚本

    Akria · 原创 ·
    Web 安全 · Web安全
    共 1615 字 · 约 1 分钟 · 3701
    本文最后更新于2024年02月15日,已经过了279天没有更新,若内容或图片失效,请留言反馈
    • 每分钟查一下过去1分钟的日志,对IP进行分析,将访问量大于400的给封掉
    • 每隔半小时针对过去半小时以来的被封的IP进行分析,如果不再有数据包过来,则解封
    • 将该脚本添加到计划任务即可,设置每分钟执行一次
    bash 代码:
    #! /bin/bash
    #定义1分钟以前的时间,用于过滤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分钟内访问量高于400的ip记录到一个临时文件中
        # 过滤掉白名单IP(81.123.35.11)
        awk '{print $1}' /tmp/tmp_last_min.log|grep -v '81.123.35.11' |sort -n |uniq -c|sort -n |awk '$1>400 {print $2}' > /tmp/bad_ip.list
    
        #计算ip的数量
        n=`wc -l /tmp/bad_ip.list|awk '{print $1}'`
    
        #当ip数大于0时,才会用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()
    {
        #首先将包个数小于5的ip记录到一个临时文件里,把它们标记为白名单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
        #当解封完白名单IP后,将计数器清零,进入下一个计数周期
        /usr/sbin/iptables -Z
    }
    
    #取当前时间的分钟数
    t=`date +%M`
    
    #当分钟数为00或者30时(即每隔30分钟),执行解封IP的函数,其他时间只执行封IP的函数
    if [ $t == "00" ] || [ $t == "30" ]
    then
       unblock_ip
       block_ip
    else
       block_ip
    fi
    声明:本文由 Akria(博主)原创,依据 CC-BY-NC-SA 4.0 许可协议 授权,转载请注明出处。

    还没有人喜爱这篇文章呢

    现在已有

    1

    条评论
    我要发表评论
    1. 头像
      ztrztr
      • 等级:Lv.4
      • 角色:访客
      • 在线:本周

      已使用!

      · · · 北京-北京
    博客logo 静若安然 记录个人学习生活和成长历程 51统计 百度统计
    ICP 蜀ICP备2023037012号-1

    💻️ Akria 一小时前 在线

    🕛

    本站已运行 7 年 87 天 23 小时 9 分
    静若安然. © 2017 ~ 2024.
    网站logo

    静若安然 记录个人学习生活和成长历程