全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 物联网 >

分享一个自动封IP的脚本

时间:2023-05-19 15:15

人气:

作者:admin

标签: Web服务器 

导读:最近几天有一个问题一直困扰着我,就是我维护的一个网站最近几天总是在整点附近出问题,那时候数据库服务器CPU使用率超高,持续时间1-5分钟。...

最近几天有一个问题一直困扰着我,就是我维护的一个网站最近几天总是在整点附近出问题,那时候数据库服务器CPU使用率超高,持续时间1-5分钟。

ece267a6-f614-11ed-90ce-dac502259ad0.png

然后,我就开始各种查、各种记,出问题的时间点,数据库查询量很大,我把这些查询记录了下来,并做分析,然而并没有什么特别有规律的现象,因为这些查询非常分散,跟正常的查询一般无二,唯一区别就是量大。

同时,也去分析了WEB端的访问日志,截取出问题那几分钟的日志进行分析,过去两天一直都没有找到规律,跟数据库一样,非常分散,跟正常的访问一样,只是量大了一些。

我甚至怀疑是不是这台数据库服务器的硬件出现了问题,毕竟我们用的是腾讯云的机器,云主机存在资源共享的问题。所以,我还提交了工单,让售后去帮忙查,但无果。

今天,我再次分析日志时,发现了一些规律,那就是有三个ip访问量非常大。

ecead4d6-f614-11ed-90ce-dac502259ad0.png

这是一分钟内的统计数据,左边为IP的请求次数,一分钟一个正常的IP的请求数怎么可能超过1000次呢?甚至连100次都不应该超过才对。所以,直接把IP封掉。

也许这几天的问题跟IP访问量大没有直接关系,但既然今天发现了此问题,那就先解决再说。

考虑到后面还会有类似的IP访问,那我干脆直接写一个自动封IP的脚本,IP封了肯定需要自动解封,所以,我的脚本主要逻辑是:

1)每分钟查一下过去1分钟的日志,对IP进行分析,将访问量大于400的给封掉;

2)每隔半小时针对过去半小时以来的被封的IP进行分析,如果不再有数据包过来,则解封。 下面是脚本内容:

#! /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.171)
awk'{print$1}'/tmp/tmp_last_min.log|grep-v'81.123.35.171'|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

然后写一个每分钟都执行的任务计划就可以啦。





审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信