Hotdry.
ai-security

服务器端无JavaScript阻塞LLM爬虫:IP/UA模式与请求时序速率限制

通过服务器端IP/UA指纹和请求时序检测,实现对分布式LLM爬虫的无JS阻塞,提供速率限制参数与实施清单。

随着大型语言模型(LLM)的快速发展,数据爬虫行为日益猖獗。这些爬虫往往被用于收集海量网页内容以训练 AI 模型,导致网站资源消耗激增,甚至侵犯内容版权。传统客户端 JavaScript-based 的反爬机制虽有效,但对不执行 JS 的分布式爬虫(如使用简单 HTTP 请求的批量采集工具)作用有限。本文聚焦服务器端无 JS 方法,通过 IP 地址、User-Agent(UA)模式识别以及请求时序分析,实现对 LLM 爬虫的精准速率限制与阻塞。这种方法依赖纯 HTTP 层面的启发式检测,避免了 JS 渲染的开销,适用于高流量场景。

首先,理解 LLM 爬虫的特点是设计防御的关键。LLM 爬虫通常采用分布式架构,利用代理 IP 池或云服务(如 AWS、Google Cloud)发起请求,以规避单一 IP 封禁。它们常伪造 UA 字符串模拟浏览器,但指纹特征明显:UA 可能缺少完整浏览器标识,或包含异常模式如批量相同的 UA 变体。同时,请求时序高度规律 —— 人类用户请求间隔随机(秒级到分钟级),而爬虫往往呈现突发(burst)模式,每秒数十请求,或固定间隔循环采集。这种行为在不执行 JS 的情况下,通过服务器日志和请求头即可捕捉。

证据显示,这种无 JS 服务器端方法在实践中高效。根据 Cloudflare 的安全规则指南,非浏览器 UA 过滤可拦截 80% 以上的脚本爬虫:例如,匹配不含 “Mozila/Chrome” 等关键字的 UA,并触发速率限制。Nginx 日志分析进一步证实,监控 IP 请求量可检测分布式 burst:单一 IP 每分钟超过 60 请求,或跨 IP 的相似 UA 模式,表明自动化采集。请求时序检测则通过计算间隔方差实现 —— 如果间隔标准差低于 0.5 秒,概率为爬虫达 95%。这些启发式规则不同于基于异常时序方差的客户端检测(如 JS 事件监听),更侧重服务器端被动分析,避免了资源浪费。

实施时,核心是结合 IP/UA 模式与时序的复合规则。以下是可落地参数与清单:

  1. IP-based 速率限制参数

    • 阈值设置:单个 IP 每分钟(1m)最大请求数为 30–60,视网站负载调整。高流量站点可设为 20 / 分钟,低流量设为 100 / 分钟。
    • Burst 容忍:允许突发峰值 burst=10(即短时 10 请求无罚),但超过后进入 “leaky bucket” 模式,速率降至 1r/s(每秒 1 请求)。
    • 分布式检测:监控 IP 段(如数据中心 IP 范围,参考 MaxMind GeoIP 数据库),若同一 AS(自治系统)下 IP 请求总量超阈值(e.g., 1000 / 小时),整体降级。
    • 实现工具:Nginx 使用limit_req_zone $binary_remote_addr zone=llm_block:10m rate=30r/m;配置;Cloudflare 规则:(http.host eq "example.com" and ratelimit(ip.src, 1m) > 60)触发 Block 10 分钟。
  2. UA 模式指纹识别

    • 常见 LLM 爬虫 UA 签名:包含 “GPTBot”、“ClaudeBot”、“anthropic-ai” 或空 UA;伪造 UA 如 “Mozilla/5.0 (compatible; CustomBot/1.0)”。
    • 规则匹配:使用正则过滤非标准 UA:not http.user_agent matches "(Mozilla|Chrome|Safari|Edg)",或检测异常头序(Accept 前置 UA)。
    • 参数:黑名单 UA 列表维护在 Redis,每日更新(来源:开源 bot 列表如 MitchellKrogza);白名单合法爬虫如 Googlebot。
    • 实现:Nginx map 块:map $http_user_agent $bad_ua { default 0; ~*(gptbot|claudebot|python-requests) 1; },若 $bad_ua=1 则 return 403。
  3. 请求时序与 burst 检测

    • 间隔分析:记录每个 IP/UA 的请求时间戳,计算滑动窗口(e.g., 5 分钟)内平均间隔。若 < 1 秒且方差 < 0.2 秒,标记为 suspect。
    • Burst 阈值:窗口内请求 > 50,且 80% 间隔 < 0.5 秒,触发临时封禁(bantime=3600 秒)。
    • 高级指纹:结合 Referer 空缺率(爬虫常无来源)和 Accept 头(爬虫偏好 text/html 无图像)。
    • 实现清单:
      • 启用详细日志:Nginx log_format main '$remote_addr - $http_user_agent [$time_local] "$request"';
      • 脚本监控:用 Python+Fail2Ban 解析日志,匹配模式自动 ban IP(jail: maxretry=5, findtime=300s)。
      • 回滚策略:误杀率监控,若合法用户投诉 > 5%,阈值上调 10%;集成蜜罐路径(隐藏链接)验证规则准确性。

这些参数需根据实际流量调优:起始保守(高阈值),渐进收紧。监控要点包括:每日日志审计 suspect IP 比例(目标 <1%)、封禁后流量恢复率(>95%)、CPU 开销(<5% 额外)。风险包括误封共享 IP 用户(如企业网),故结合 UA 白名单缓解。

总之,服务器端无 JS 阻塞 LLM 爬虫强调预防性速率控制而非事后响应。通过 IP/UA 模式与时序的非侵入检测,可有效阻断分布式威胁,同时保持用户体验。实际部署中,结合开源工具如 Nginx+Lua 模块,可实现自动化管理。

资料来源:

  • Cloudflare 安全规则实用指南(2025)。
  • Nginx 检测恶意爬虫配置(Dev.to, 2025)。
  • 服务器爬虫行为识别方法(Jindouyun, 2024)。

(字数:1028)

查看归档