蜘蛛池知识

蜘蛛池入口页被 WAF 拦了:从响应码到放行策略的排查顺序

蜘蛛池入口页日志里能看到蜘蛛,返回的却是 403、429 或验证页,问题往往出在 CDN、WAF、限速或安全组这几层。本文按从外到内的顺序梳理排查步骤,并给出按 IP 验证和路径放行的做法,避免误伤和放行过宽。

蜘蛛池知识

蜘蛛池入口页被 WAF 拦了:从响应码到放行策略的排查顺序

蜘蛛池入口页搭好之后,有时会遇到一个让人摸不着头脑的情况:日志里能看到蜘蛛的 UA,但返回的状态码是 403、429、503,或者被跳到一个验证页面。入口页本身没问题,内容也正常,问题往往出在入口页和蜘蛛之间的某一层把请求拦下了。这类问题不排查清楚,后面做再多内容调整都很难看到效果。

先确认是不是被拦:看响应码和响应体

不要只看到访问日志里有蜘蛛记录就认为抓取正常。真正要看的是响应状态码和响应体。用 curl 带蜘蛛 UA 请求入口页,再看返回内容:

  • 返回 403、406、429、503:大概率被规则拦下。
  • 返回 200,但内容是 JS 挑战页或验证页:被 WAF 的人机校验挡住。
  • 返回 301 或 302 到无关域名:可能被 CDN 或安全策略重定向。
  • 响应头里出现 cf-ray、x-waf 之类字段:说明请求经过了安全层。

只看访问日志里的 200 不够,有些安全层会先返回 200 再让页面 JS 跳转,日志里看不出异常。

拦截可能发生在哪几层

蜘蛛请求进到源站之前,通常要经过好几层,任何一层都可能拦:

  • CDN 与云 WAF:最常见的拦截点,规则包括 UA 黑名单、频率限制、人机校验。
  • 云厂商安全组或防火墙:只放行了常用端口,或者对境外 IP 做了限制。
  • Nginx 限速模块:limit_req、limit_conn 配置过严,蜘蛛短时间多次请求就被挡。
  • iptables 与 fail2ban:把高频访问的 IP 临时封禁,蜘蛛 IP 也可能中招。
  • 应用层逻辑:代码里对 UA、Referer、Cookie 做了判断,直接返回空页或 403。

排查顺序:从外到内逐层排除

  1. 用 curl 从本机请求入口页,记录状态码和响应体大小。
  2. 换一个干净的出口 IP 再请求一次,对比结果,判断是否 IP 被限。
  3. 检查 CDN 或 WAF 后台的拦截日志,看是否有对应时间点的拦截记录。
  4. 在源站直接绑定 hosts 请求,绕过 CDN,确认源站本身是否正常。
  5. 查看 Nginx 和应用日志,确认请求有没有到达源站。
  6. 如果源站正常、CDN 有拦截记录,问题就在安全层。

这个顺序的好处是从外到内,先排除最外层的可能,避免一上来就改源站配置。

放行策略:验证过的蜘蛛再放

确认是安全层拦截后,不要直接把所有带蜘蛛 UA 的请求全放行,UA 是可以伪造的。更稳妥的做法是:

  • 先做反向解析验证,确认 IP 确实属于对应搜索引擎,再把 IP 段加入白名单。
  • 按路径放行:入口页走相对宽松的策略,后台、登录、接口等路径保持严格。
  • 调整限速阈值:给蜘蛛单独设一个宽松的限速桶,不要和普通访客共用一个阈值。
  • 关闭针对入口页的人机校验,避免蜘蛛拿到挑战页而不是内容。
  • 如果 CDN 提供搜索引擎白名单功能,优先用官方名单,再叠加自己的验证。
放行的核心思路是:按已验证的 IP 和路径放,而不是按 UA 字符串放。UA 只是一层容易伪造的标识。

监控与止损

放行之后要留一个观察窗口。建议每天看一眼安全层的拦截统计,重点看入口页路径下 403、429 的比例有没有反弹。如果比例突然升高,先回到排查顺序的前几步,确认是规则误伤还是真的有人在刷。频繁改动规则容易把问题掩盖掉,记录每次调整的时间和结果,后续排查会轻松很多。

几个常见误区

  • 只看 UA 就放行:伪造 UA 的请求会一起进来,等于给安全层开了口子。
  • 把限速关掉:短期看蜘蛛能抓了,但入口页也更容易被刷,带宽和成本会上去。
  • 只查源站日志:被 CDN 拦下的请求根本到不了源站,日志里看不到。
  • 一次改太多配置:出了问题分不清是哪一层引起的,建议一次只动一个变量。

蜘蛛池的入口页能不能被正常抓取,很多时候不取决于内容本身,而取决于请求有没有顺利到达。把拦截层排查清楚,再谈内容和链接调整,顺序会更顺。