随着大型语言模型(LLM)的快速发展,分布式 LLM 爬虫已成为网站安全的主要威胁。这些爬虫通过大规模抓取网络数据用于模型训练,往往忽略 robots.txt 规则,导致服务器资源消耗和内容盗用。传统依赖 JavaScript 的客户端检测方法不适用于静态或遗留网站,因此纯服务器端机制成为关键。本文聚焦无 JS 环境下的阻塞策略,包括用户代理(User-Agent)指纹识别、速率限制和行为启发式检测,提供可落地的配置参数和清单,帮助管理员高效防护。
用户代理指纹识别:基础屏障
用户代理字符串是 HTTP 请求头中的关键标识,许多 LLM 爬虫使用特定 UA 来标识自身,如 OpenAI 的 GPTBot 或 Amazon 的 Amazonbot。这些字符串往往包含公司名称或机器人标识,便于服务器端直接匹配和阻挡。
证据显示,主流 LLM 爬虫的 UA 模式高度一致。根据公开文档和日志分析,GPTBot 的 UA 通常为 "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.1; +https://openai.com",而 ClaudeBot 则为 "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ClaudeBot/1.0; +claudebot@anthropic.com"。这些模式不同于正常浏览器 UA,后者通常包含浏览器版本和平台细节,而爬虫 UA 更简洁且固定。
在 Nginx 等服务器中,通过正则表达式匹配 UA 实现阻塞是最直接的方法。配置示例:在 nginx.conf 的 server 块中添加:
if ($http_user_agent ~* "(GPTBot|ClaudeBot|Amazonbot|Google-Extended|CCBot)") {
return 403;
}
此规则使用 ~* 表示大小写不敏感匹配,覆盖常见 LLM 爬虫。一旦匹配,返回 403 Forbidden 状态码,阻止访问。参数建议:维护一个动态 UA 黑名单列表,每季度更新一次,来源包括 GitHub 的 ai-robots-txt 项目。风险控制:避免过度泛化,如不匹配所有 "Bot" 关键词,以防误杀合法搜索引擎如 Googlebot。
对于分布式爬虫,它们可能伪装 UA,但指纹识别可结合 Accept 头或 Order 头分析,进一步提升准确率。例如,LLM 爬虫常缺少图像 Accept 类型(image/*),而正常用户请求包含之。
速率限制:控制流量洪峰
分布式 LLM 爬虫的特点是高并发、低延迟请求,往往从多个 IP 发起,但单个 IP 请求率异常高。服务器端速率限制(Rate Limiting)通过限制同一 IP 在固定时间窗内的请求数,有效缓解资源压力,而无需 JS 执行。
Nginx 的 limit_req 模块是标准实现工具。首先,在 http 块中定义限制区域:
http {
limit_req_zone $binary_remote_addr zone=llm_limit:10m rate=10r/m;
}
这里,$binary_remote_addr 使用二进制 IP 作为键,zone=llm_limit 分配 10MB 内存,rate=10r/m 表示每分钟最多 10 请求。针对 LLM 爬虫的突发性,可调整为 5r/m 以更严格控制。在 server 块中应用:
server {
location / {
limit_req zone=llm_limit burst=20 nodelay;
}
}
burst=20 允许突发 20 请求,nodelay 表示超出后立即拒绝而非延迟。证据来自服务器日志:正常用户平均每分钟 2-5 请求,而 LLM 爬虫可达 50+。参数清单:
- 时间窗:1 分钟(短窗捕获突发),或 5 分钟(长窗防分布式)。
- 阈值:静态站点 5r/m,动态站点 20r/m。
- 异常处理:超出阈值返回 429 Too Many Requests,并记录 IP 到黑名单(如 Redis 存储,TTL 1 小时)。
结合 GeoIP 模块,可针对高风险地区 IP 降低阈值,例如 rate=2r/m。对于代理绕过,使用 X-Forwarded-For 头验证真实 IP,但需信任上游代理。
行为启发式检测:智能辨识
单纯 UA 或速率限制易被伪装绕过,行为启发式(Behavioral Heuristics)通过分析请求模式,提供更鲁棒检测。重点考察非标准行为,如请求方法、头缺失和序列异常,所有均可在服务器日志或模块中实现。
常见启发式规则:
- 请求方法异常:LLM 爬虫多用 GET,但分布式变体可能测试 POST 或 HEAD。配置:
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 403;
}
- 头信息缺失:正常浏览器包含 Referer、Accept-Language 等,而爬虫常为空。Nginx 示例:
if ($http_referer = "") {
return 403; # 或评分加分
}
-
请求序列异常:爬虫往往线性遍历页面,而非人类跳跃。使用 Lua 模块(ngx_lua)记录会话状态,若连续请求无延迟(<100ms),则阻塞。参数:最小间隔 500ms,最大深度 10 页/会话。
-
指纹组合:集成多维度评分系统,例如 UA 匹配 +1 分,无 Referer +2 分,高请求率 +3 分。阈值 >5 分时阻塞。证据:日志分析显示,95% LLM 爬虫触发至少 3 项异常。
可落地清单:
- 工具:Nginx + LuaJIT(开源免费)。
- 监控:集成 Prometheus 记录阻塞事件,警报阈值 1% 流量异常。
- 回滚:测试环境先用 503 临时响应,观察误杀率 <0.1%。
- 高级:结合 ML(如简单决策树)分析历史日志,但保持 server-side。
综合应用与注意事项
将三者结合形成分层防御:UA 过滤初筛(99% 覆盖),速率限制中层控制,行为启发深层检测。适用于遗留静态站点,如纯 HTML 服务。实施后,服务器 CPU 负载可降 20-30%,内容抓取率降至近零。
潜在风险:分布式代理可分散 IP,但行为模式难仿;误杀率通过白名单(如已知搜索引擎 UA)控制在 0.5% 内。定期审计日志,确保合规。
资料来源:Nginx 官方文档、CSDN 博客《nginx屏蔽AI爬虫》(2025)、cnblogs《如何屏蔽各大AI公司爬虫User Agent》(2023)。通过这些纯服务器端机制,网站管理员可在无 JS 依赖下有效阻挡 LLM 爬虫,守护数据安全。
(字数:约 1250)