问题出现得很突然,日志倒是留得挺全。机房出口做了 NAT,访客和蜘蛛的请求都从同一批公网 IP 出来,防火墙按每分钟次数封 IP,结果一整片地区用户和蜘蛛同时被挡。
刚开始盯着「封禁是整段 IP,连带把同机房的蜘蛛段封了」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。限流按出口 IP 统计,NAT 后大量用户共享地址。还有一种是阈值按单机访问量设计,没有考虑共享出口。
还有一种情况,解封只有人工操作,误封会持续到第二天。
上来先统计单 IP 的请求量与 UA 分布
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head
接着看被封 IP 是否属于蜘蛛段
curl -s https://www.gstatic.com/ipranges/goog.json | grep -c 66.249
随后把限流改成按 UA 加路径组合
limit_req_zone $http_user_agent zone=ua:10m rate=5r/s;
误封后立即解封并加观察名单
fail2ban-client unban 203.0.113.10
改完先别撤,确认这几项。被封 IP 数量下降到个位数,蜘蛛与正常用户的请求不再触发封禁,抓取量恢复稳定。
补一句。共享出口环境下按 IP 限流等于按地区封人,规则维度要加上 UA 和路径。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
