在 2025 年的互联网环境中,自托管 Forgejo 实例正面临前所未有的 AI 爬虫威胁。这些爬虫不仅无视robots.txt规则,还采用分布式策略,从数千个 IP 地址同时发起请求,导致服务器资源耗尽、性能急剧下降,甚至完全宕机。本文基于实际防护经验,探讨如何设计一个智能检测系统,通过请求模式识别、用户代理分析和行为指纹技术,实现对 AI 爬虫的精准拦截。
AI 爬虫的威胁模式与成本分析
资源耗尽攻击
AI 爬虫对 Forgejo 实例的攻击具有明显的特征模式。根据 VulpineCitrus 的监控数据,一个中等规模的 Linux 仓库(约 138 万次提交)理论上可以生成超过 3240 亿个可爬取页面。爬虫会系统地遍历这些页面,特别是源码归档文件(ZIP/TAR 格式),导致:
- 磁盘空间耗尽:Forgejo 在生成源码归档时会创建临时文件,大量并发下载请求会迅速填满磁盘
- 内存压力激增:处理大量并发请求导致内存使用率从正常的 1.5-2GiB 飙升至 2.5GiB 以上
- CPU 过载:4 核 CPU 使用率从 4% 飙升至 99% 以上
电力与带宽成本
实际测量显示,爬虫攻击期间服务器的功耗从 150W 增加至 170-200W,仅电力成本每年就增加约 60 欧元。同时,出口带宽持续维持在 4MBps(32Mbps),严重影响本地网络性能。
分布式攻击特征
AI 爬虫采用高度分布式的攻击策略:
- 单日独立 IP 数量可达 47,252 个
- 主要来源 ASN 包括:华为云(AS136907)、阿里云(AS45102)、VNPT Corp(AS45899)等
- 攻击呈现规律性波动,每 3 小时出现一次持续 1.5 小时的高峰期
传统防护措施的局限性
robots.txt 的无效性
经验证明,robots.txt对 AI 爬虫完全无效。Jade Ellis 的案例显示,爬虫的 "消失" 实际上是因为仓库被设置为私有,它们收到 404 错误而停止,并非遵守了robots.txt规则。
简单速率限制的副作用
基于 IP 的速率限制在分布式攻击面前效果有限,且容易误伤正常用户:
limit_req_zone wholeforge zone=wholeforge:10m rate=3r/s;
location ^~ (/alopexlemoni/GenderDysphoria.fyi|/oror/necro|/Lymkwi/linux) {
limit_req zone=wholeforge nodelay;
proxy_pass http://<upstream>/;
}
这种配置虽然能限制单个 IP 的请求频率,但会导致正常用户访问热门仓库时频繁遇到 429(Too Many Requests)错误,严重影响使用体验。
反向代理缓存的失败
针对动态内容的缓存策略在爬虫攻击下完全失效:
proxy_cache_path /var/cache/nginx/forge/ levels=1:2 keys_zone=forgecache:100m;
location / {
proxy_cache forgecache;
proxy_cache_valid any 1h;
expires 1h;
}
由于爬虫几乎从不重复请求相同资源,缓存命中率极低,同时还会破坏已认证会话的显示,导致正常用户无法使用。
智能检测系统设计
用户代理分析与模式识别
基于ai.robots.txt项目提供的爬虫标识列表,建立用户代理检测规则:
map $http_user_agent $bot_user_agent {
default 0;
~*anthropic-ai 1;
~*applebot 1;
~*bytespider 1;
~*chatgpt-user 1;
~*claude-web 1;
~*cohere-ai 1;
~*diffbot 1;
~*facebookbot 1;
~*google-extended 1;
~*gptbot 1;
~*perplexitybot 1;
~*petalbot 1;
~*scrapy 1;
~*youbot 1;
# 添加自定义模式
~*(?i)ai[-_]crawler 1;
~*(?i)llm[-_]scraper 1;
}
行为指纹技术
通过分析请求模式建立行为指纹:
- 请求间隔规律性:正常用户请求间隔不规则,爬虫往往保持固定频率
- 页面遍历模式:爬虫倾向于按特定顺序(如提交时间倒序)遍历页面
- 会话特征:爬虫通常无 Cookie、无 Referer 头,或使用伪造的浏览器指纹
- ASN 关联分析:同一 ASN 内多个 IP 的协同行为
请求深度与广度分析
监控单个 IP 或 ASN 在特定时间窗口内的请求特征:
- 页面深度:连续请求同一仓库的深层页面(如具体文件的 blame 视图)
- 请求广度:短时间内访问大量不同仓库
- 归档文件下载:集中下载源码归档文件,特别是大尺寸文件
Iocaine 3 + Nam-Shub-of-Enki 集成方案
系统架构设计
Iocaine 3 作为中间件部署在反向代理和后端服务之间,实现智能流量分类:
客户端 → Nginx → Iocaine 3 → 分类决策
↓
合法请求 → Forgejo后端
爬虫请求 → 垃圾内容生成器
Nam-Shub-of-Enki 分类器配置
分类器基于多个维度进行决策:
checks {
disable cgi-bin-trap
asn {
database-path "/data/ipinfo_lite.mmdb"
asns "45102" "136907" # 阿里云、华为云
}
ai-robots-txt {
path "/data/ai.robots.txt-robots.json"
}
generated-urls {
identifiers "deflagration"
}
big-tech {
enable #true
}
commercial_scrapers {
enable #true
}
fake-browsers {
enable #true # 检测伪造的浏览器指纹
}
}
Nginx 集成配置
智能路由配置,仅对 GET 和 HEAD 请求应用分类:
map $request_method $upstream_location {
GET <iocaine_upstream>;
HEAD <iocaine_upstream>;
default <forgejo_upstream>;
}
server {
location / {
proxy_intercept_errors on;
error_page 421 = @fallback;
proxy_pass http://$upstream_location;
}
location @fallback {
proxy_pass http://<forgejo_upstream>;
}
}
当 Iocaine 判定请求来自爬虫时,返回 200 OK 并生成垃圾内容;判定为合法请求时,返回 421 Misdirected Request,由 Nginx 转发至真实后端。
实施参数与监控要点
速率限制调优参数
基于实际流量模式的速率限制配置:
# 针对已识别爬虫的严格限制
limit_req_zone $binary_remote_addr zone=crawlers:30m rate=1r/10s;
# 针对可疑IP的中等限制
limit_req_zone $binary_remote_addr zone=suspicious:20m rate=5r/s;
# 正常用户的宽松限制
limit_req_zone $binary_remote_addr zone=normal:10m rate=30r/s;
location / {
if ($bot_class = "confirmed") {
limit_req zone=crawlers burst=5 nodelay;
}
if ($bot_class = "suspicious") {
limit_req zone=suspicious burst=20 delay=10;
}
limit_req zone=normal burst=50;
}
监控指标与告警阈值
建立全面的监控体系:
-
请求分类统计:
- 爬虫请求占比(目标:<5%)
- 分类准确率(目标:>95%)
- 误拦截率(目标:<0.1%)
-
资源使用监控:
- CPU 使用率阈值:80%(警告),95%(严重)
- 内存使用率阈值:85%(警告),95%(严重)
- 磁盘空间阈值:80%(警告),90%(严重)
-
网络流量分析:
- 出口带宽突增检测(>50% 增长持续 5 分钟)
- 非常规 ASN 流量占比监控
- 归档文件下载频率监控
Grafana 监控面板配置
关键监控面板应包括:
- 实时请求分类饼图
- 资源使用趋势图
- 爬虫来源 ASN 分布
- 误拦截事件时间线
- Iocaine 垃圾内容生成量统计
风险控制与回滚策略
误拦截处理机制
建立多层防护以避免误伤正常用户:
- 白名单机制:为已知自动化工具(如 CI/CD 系统、Git 客户端)建立 IP / 用户代理白名单
- 人工审核队列:将可疑但不确定的请求记录到审核队列,定期人工检查
- 渐进式限制:对可疑 IP 先应用宽松限制,确认爬虫行为后再加强限制
紧急回滚流程
当系统出现大规模误拦截时:
- 立即禁用分类器:通过配置热重载临时关闭 Iocaine 分类
- 恢复基础速率限制:启用保守的全局速率限制(如 10r/s)
- 日志分析:分析误拦截模式,调整分类规则
- 渐进式恢复:先恢复对已验证用户的正常访问,逐步重新启用智能分类
规则更新与维护
建立定期维护流程:
- 每周规则更新:基于
ai.robots.txt项目更新用户代理规则 - 月度行为分析:分析爬虫行为模式变化,调整检测算法
- 季度系统评估:全面评估系统效果,优化参数配置
实际效果与经验总结
防护效果数据
基于 VulpineCitrus 的实际部署数据:
- 请求拦截率:96.7% 的爬虫请求被成功拦截
- 资源使用改善:CPU 使用率从 99% 降至 4%,内存使用稳定在 1.5-2GiB
- 电力成本降低:服务器功耗从 200W 降至 160W
- 用户体验:页面加载时间从 15 秒以上恢复至正常水平
关键经验教训
- 不要依赖单一防护层:多层防护(分类 + 限制 + 重定向)比单一方案更有效
- 监控比防护更重要:没有监控的防护系统是盲目的
- 用户代理只是起点:现代爬虫会伪造用户代理,需要结合行为分析
- ASN 封锁需谨慎:避免封锁大型云服务商的整个 ASN,可能影响正常用户
未来改进方向
- 机器学习增强:基于历史数据训练爬虫检测模型
- 协同防护网络:多个 Forgejo 实例共享爬虫情报
- 动态规则生成:基于实时流量模式自动生成防护规则
- 区块链验证:为合法自动化工具提供可验证的身份凭证
结语
在 AI 爬虫日益猖獗的今天,保护自托管 Forgejo 实例需要从被动防御转向主动智能检测。通过结合用户代理分析、行为指纹技术和请求模式识别,配合 Iocaine 3 等专业工具,可以构建一个既有效又精准的防护系统。关键在于平衡防护效果与用户体验,建立完善的监控体系,并保持系统的可调整性以应对不断变化的爬虫策略。
防护 AI 爬虫不仅是一场技术对抗,更是对互联网开放性与可持续性的思考。在保护自身资源的同时,我们也应该思考如何维护一个更加健康、公平的网络环境。
资料来源:
- VulpineCitrus. "Guarding My Git Forge Against AI Scrapers" (2025-12-02)
- Jade Ellis. "Actually stopping AI scrapers from taking down my server" (2025-05-18)
ai.robots.txt项目提供的 AI 爬虫标识列表- Iocaine 3 官方文档与 Nam-Shub-of-Enki 分类器配置指南