0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分享一个自动封IP的脚本

阿铭linux 来源:阿铭linux 2023-05-19 15:15 次阅读

最近几天有一个问题一直困扰着我,就是我维护的一个网站最近几天总是在整点附近出问题,那时候数据库服务器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

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





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Web服务器
    +关注

    关注

    0

    文章

    138

    浏览量

    24402

原文标题:分享一个自动封IP的脚本

文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    介绍10Python自动脚本

    在这个自动化时代,我们有很多重复无聊的工作要做。想想这些你不再需要一次又一次地做的无聊的事情,让它自动化,让你的生活更轻松。那么在本文中,我将向您介绍 10 Python
    发表于 10-17 09:27 942次阅读

    10杀手级的Python自动脚本

    今天浩道跟大家分享10日常工作中用到的python自动脚本。让你感受番python简单强大之处!
    发表于 11-28 11:07 684次阅读

    python脚本如何根据公网IP自动获取地址和天气信息?

    python脚本如何根据公网IP自动获取地址和天气信息?
    发表于 12-28 07:14

    自动化重启服务脚本

    脚本可以每分钟执行次,脚本执行时截取上分钟的日志,可以计算总日志行数,和出现502的行数,计算比例,这里我给大家定
    的头像 发表于 11-22 10:12 1265次阅读

    10杀手级的Python自动脚本分享

    重复性任务总是耗时且无聊,想想你想要张地裁剪 100 张照片或 Fetch API、纠正拼写和语法等工作,所有这些任务都很耗时,为什么不自动化它们呢?在今天的文章中,我将与你分
    的头像 发表于 01-06 15:34 756次阅读

    分享10实用的Python自动脚本

    重复性任务总是耗时且无聊,想想你想要张地裁剪 100 张照片或 Fetch API、纠正拼写和语法等工作,所有这些任务都很耗时,为什么不自动化它们呢?在今天的文章中,我将与你分
    的头像 发表于 01-21 15:58 1337次阅读

    网站总被攻击?写个自动封禁IP脚本给你

    个人网站总被攻击?写个自动封禁IP脚本给你!
    的头像 发表于 01-29 11:44 1118次阅读

    通过脚本搞懂fork、source和exec

    Source模式下,子shell执行时获取的环境变量会会影响到父shell。与fork的区别在于,不会额外打开sub-shell来执行被调用的脚本,而是在同一个shell中执行。所
    的头像 发表于 02-03 16:05 1736次阅读

    ip脚本进化的解决办法

    上次给大家分享过IP脚本。我搞那个脚本的目的是为了把访问量太大的IP地址给封掉,然后每隔半
    的头像 发表于 06-11 17:03 686次阅读
    封<b class='flag-5'>ip</b><b class='flag-5'>脚本</b>进化的解决办法

    keil自动化编译脚本

    这是 keil 的自动化编译脚本,可被其他脚本或程序调用,接收参数并按参数编译 keil 工程,而不必打开 keil 软件,实现程序上的
    的头像 发表于 10-16 17:04 1902次阅读
    keil<b class='flag-5'>自动</b>化编译<b class='flag-5'>脚本</b>

    如何使用脚本完成CRC和填充值的自动完成

    恩智浦的MPC架构的微控制器使用的开发环境IDE是S32DS ,该IDE使用的GNU GCC工具链没有提供对编译结果的CRC校验和自动生成工具,所以需要我们制作脚本
    的头像 发表于 10-21 09:50 1034次阅读
    如何使用<b class='flag-5'>脚本</b>完成CRC和填充值的<b class='flag-5'>自动</b>完成

    怎么用Python构建自动发送邮件的脚本

    ? 类似的应用场景还有很多,不仅仅是在股票策略提醒上,比如定时向某些人发送邮件;网站宕机了,实时发送邮件提醒;网站负载过高,发送邮件提醒......等等。 下面就来讲讲怎么用Python构建自动发送邮件的
    的头像 发表于 10-21 14:47 764次阅读
    怎么用Python构建<b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>自动</b>发送邮件的<b class='flag-5'>脚本</b>

    怎么用Python构建自动发送邮件的脚本

    呢? 类似的应用场景还有很多,不仅仅是在股票策略提醒上,比如定时向某些人发送邮件;网站宕机了,实时发送邮件提醒;网站负载过高,发送邮件提醒......等等。 下面就来讲讲怎么用Python构建自动发送邮件的
    的头像 发表于 10-31 16:36 553次阅读
    怎么用Python构建<b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>自动</b>发送邮件的<b class='flag-5'>脚本</b>

    编写点名器脚本

    目的:编写脚本,可以将准别好的名字合集的.txt传入脚本,然后每次随机显示一个人的姓名
    的头像 发表于 11-06 12:41 594次阅读
    编写<b class='flag-5'>一</b><b class='flag-5'>个</b>点名器<b class='flag-5'>脚本</b>

    简单的Shiro RCE检测和利用脚本

    简单的Shiro RCE检测和利用脚本
    的头像 发表于 01-09 09:46 646次阅读