要统计Nginx网站每个IP的流量合计,并将每个IP和所消耗的总流量信息按照流量排序的方式写入到指定文本文件中,并永久拉黑超过1G的IP

  1. 编辑Nginx日志格式,添加$bytes_sent变量,记录每个请求的字节数。例如,在Nginx配置文件中添加以下行:
log_format custom_log '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $bytes_sent';
  1. 重启Nginx以应用新的日志格式。
systemctl reload nginx.service
  1. 创建一个名为block_ip.sh的shell脚本,并添加以下内容:
#!/bin/bash
# 要统计Nginx网站每个IP的流量合计,并将每个IP和所消耗的总流量信息按照流量排序的方式写入到指定文本文件中,并永久拉黑超过1G的IP
# 统计日志中每个IP和所消耗的总流量
log_file="/data/wwwlogs/access_nginx.log" # Nginx访问日志路径
awk '{a[$1]+=$10}END{for(i in a){print i,a[i]}}' $log_file | sort -k2 -n > /data/wwwlogs/ip_traffic.txt

# 防火墙拉黑超过1G的IP
while read line
do
    ip=`echo $line | awk '{print $1}'`
    traffic=`echo $line | awk '{print $2}'`
    if [ $traffic -gt 1000000000 ]; then
        # firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=$ip reject"
        firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=$ip port protocol=tcp port=80 reject"
        # firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=$ip port protocol=tcp port=443 reject"
        firewall-cmd --reload

        echo "$ip has been blocked"
    fi
# 重载firewall

done < /data/wwwlogs/ip_traffic.txt

# 移除拉黑的IP:firewall-cmd --permanent --remove-rich-rule="rule family=ipv4 source address=$ip reject"
# firewall-cmd --permanent --remove-rich-rule="rule family=ipv4 source address=$ip port protocol=tcp port=80 reject"

一键脚本
mkdir -p /data/wwwlogs

wget -O /data/wwwlogs/block_ip.sh https://img.cloudduo.cn/web/block/block_ip.sh && chmod +x /data/wwwlogs/block_ip.sh && /data/wwwlogs/block_ip.sh
  1. 定时脚本:
    打开crontab编辑器:crontab -e
*/1 * * * * /data/wwwlogs/block_ip.sh

可以使用以下 cron 表达式实现每 30 秒执行一次,
注意,这种方法可能会有一些副作用,例如如果脚本运行时间超过 30 秒,可能会出现重叠运行的情况。因此,建议考虑重新设计脚本,以避免这种问题。

* * * * * sleep 30; /data/wwwlogs/block_ip.sh

这将在每个IP的流量超过1G时,使用firewall-cmd命令永久拉黑该IP。

请注意,这个脚本假设您的Nginx日志文件在/data/wwwlogs/access_nginx.log,并且您的防火墙规则支持使用firewall-cmd命令。如果您的日志文件路径不同,或者您的服务器上不支持firewall-cmd命令,请相应地更改脚本。