上次給大家分享過一個封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使用率終于降低到可接受范圍了。
審核編輯:劉清
-
cpu
+關注
關注
68文章
10854瀏覽量
211585 -
服務器
+關注
關注
12文章
9123瀏覽量
85328
原文標題:問題終于解決了--封ip腳本的進化
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論