蜘蛛池知识

蜘蛛池入口頁被 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 拦下的請求根本到不了源站,日誌里看不到。
  • 一次改太多配置:出了問题分不清是哪一层引起的,建议一次只動一個變量。

蜘蛛池的入口頁能不能被正常抓取,很多时候不取决于内容本身,而取决于請求有没有顺利到達。把拦截层排查清楚,再谈内容和連結調整,顺序會更顺。