这类问题我又碰上了一次。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 和请求行为,单看日志里的字符串没有意义。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
