这类问题我又碰上了一次。access_log 里同一秒出现一千二百条记录,时间戳精确到毫秒后几乎完全重合,UA 写着 Googlebot,但请求路径里混着 /admin 和 /api,站点当天被打到 502。

第一反应是「WAF 只按 UA 放行,伪造的请求直接穿透到应用层」,验证下来不成立。

排查方向其实有限,先把可能性排一排。这是压测工具伪造 UA,真实蜘蛛不会在同一毫秒并发上百个请求;反向代理把 X-Forwarded-For 覆盖了,日志里所有请求显示同一个 IP;日志时间字段用的是处理完成时间,不是请求到达时间,看起来更集中。

上来先统计同毫秒请求数与来源 IP

awk '{print $4, $1}' access.log | sort | uniq -c | sort -rn | head

随后对可疑 IP 做反向解析

nslookup 203.0.113.24

然后按 UA 与路径组合过滤

findstr /c:"Googlebot" access.log | findstr /c:"/admin" | measure -Line

末了在边缘层按 IP 加限速

limit_req_zone $binary_remote_addr zone=bot:10m rate=5r/s;

恢复的判定其实很直接。加限速并封掉伪造段后,同毫秒请求消失,502 不再出现,真实蜘蛛的抓取记录恢复到每分钟二十条左右。

这里还有个坑。UA 可以随便写,判断真假要看 rDNS 和请求行为,单看日志里的字符串没有意义。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189