写一个shell脚本,每10秒统计一次nginx日志里最近1分钟每个ip的访问次数,大于100的通过ipset进行封禁
#!/bin/bash
# 设置阈值
THRESHOLD=100
while true
do
# 获取当前时间
NOW=$(date +"%Y-%m-%d %H:%M:%S")
# 获取1分钟前的时间
TIME=$(date -d '1 minute ago' +"%d/%b/%Y:%H:%M")
# 统计访问次数大于阈值的IP
IPs=$(awk -v time="$TIME" '$4 > time {print $1}' /var/log/nginx/access.log | sort | uniq -c | awk -v threshold="$THRESHOLD" '$1 > threshold {print $2}')
# 将IP加入ipset进行封禁
for IP in $IPs
do
ipset add blacklist $IP
echo "$NOW - $IP is blocked"
done
# 等待10秒后重新统计
sleep 10
done
这个脚本会每10秒钟执行一次,获取当前时间和1分钟前的时间,然后从nginx日志里找出最近1分钟内访问次数大于设定阈值的IP,将它们加入ipset进行封禁,同时输出当前时间和被封禁的IP。
原文地址: https://www.cveoy.top/t/topic/sFK 著作权归作者所有。请勿转载和采集!