上次给大家分享过一个封IP脚本,点这里看。我搞那个脚本的目的是为了把访问量太大的IP地址给封掉,然后每隔半小时解封。其实,它并没有解决问题。服务器CPU使用率还是跟之前一样,非常有规律。
经过几天的观察和日志分析,得出一个结论,大概率是最近服务器上来采集数据的量比之前大了,毕竟近期AI很热,好多组织在搞大模型,采集数据是根本。
这些人就有点不道德了,又不是不让你采集,你再把频率降低一些,分散一些,只要不影响到我们的业务,就没人管你,但你现在把我们的服务器给拖垮了,影响到客户访问和使用,这样谁都不好不是。
分析过程中,也找到了一些规律,有一些IP是一个IP段,很分散,所以单个IP访问量并不大,但是整个IP段就非常明显了。
所以,我想了想,决定把脚本改造一下,针对IP段来进行分析并封IP。思路是:分析过去1小时的访问日志,然后把访问日志中的IP截取出来,取IP的前三个数字,只要这三个数字一样的IP都算一个,这样再计算总次数。把总次数超过1600次的IP段给找出来。此时可不能直接封IP段,因为会误伤,所以还需要根据IP段,再去过滤出中招的IP地址,针对这些IP地址再去封掉。而解封则每隔2小时来一次。
脚本如下,关键步骤是有注释的。
#! /bin/bash ## 把访问量比较大的IP段封掉,如果2小时内被封的IP没有请求或者请求很少,需要解封 ## 作者:阿铭 ## 日期:2023-05-27 ## 版本:v1.1 #定义1小时以前的时间,用于过滤1小时以前的日志 t1=`date -d "-1 hour" +%Y:%H:` log=/data/logs/nginx/access.log block_ip() { ##白名单ip/ip段,自己的IP,正经蜘蛛的IP w_ip="^66.249.|^220.181.|^116.179." ##截取一小时以前的日志 egrep "$t1[0-5][0-9]:" $log > /tmp/tmp_last_hour.log ##将所有ip都过滤出来,存到临时文件 awk '{print $1}' /tmp/tmp_last_hour.log > /tmp/tmp_last_hour_ip.log ##处理IP,只留前面三位,排序、去重,获取多于1600次请求的ip段,这个数字可以根据实际情况来调整 awk -F '.' '{print $1"."$2"."$3"."}' /tmp/tmp_last_hour_ip.log|sort |uniq -c |sort -n |awk '$1 > 1600 {print $2}' > /tmp/bad_ip_hour.list #当ip数大于0时,才会用iptables封掉它 ip_n=`wc -l /tmp/bad_ip_hour.list|awk '{print $1}'` if [ ${ip_n} -ne 0 ] then for ip in `cat /tmp/bad_ip_hour.list` do #封ip,不能直接封ip段 for ip2 in `grep "^$ip" /tmp/tmp_last_hour_ip.log|sort -n|uniq` do /usr/sbin/iptables -I INPUT -s $ip2 -j REJECT done done #将这些被封的IP记录到日志里 echo "`date` 封掉的IP段有:" >> /tmp/block_ip2.log cat /tmp/bad_ip_hour.list >> /tmp/block_ip2.log fi } unblock_ip() { #首先将包个数小于5的ip段记录到一个临时文件里,把它们标记为白名单IP /usr/sbin/iptables -nvL INPUT|grep REJECT |awk '$1<5 {print $8}' > /tmp/good_ip2.list n=`wc -l /tmp/good_ip2.list|awk '{print $1}'` if [ $n -ne 0 ] then for ip in `cat /tmp/good_ip2.list` do /usr/sbin/iptables -D INPUT -s $ip -j REJECT done echo "`date` 解封的IP段有:" >> /tmp/unblock_ip2.log cat /tmp/good_ip2.list >> /tmp/unblock_ip2.log fi #当解封完白名单IP后,将计数器清零,进入下一个计数周期 /usr/sbin/iptables -Z } #取当前时间的小时 t=`date +%H` t2=$[$t%2] #每2小时执行解封IP的函数,其他时间只执行封IP的函数 if [ $t2 -eq 0 ] then unblock_ip block_ip else block_ip fi
上完脚本后,观察了一天,CPU使用率终于降低到可接受范围了。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !