使用 Anubis 抵挡疯狂的 LLM bot

前段时间,由于上学一直没看服务器负载,放假了回来一看,八核的 Git 服务器被各路 LLM bot 干的天天满载(甚至还有OpenAI bot),一天能跑 100G+ 的流量
当时没有什么解决方案,只能粗暴的在 WAF 上部署了拦截 UA 中所有包含 bot 字段请求的规则:
waf-1
waf-2

最近看到了FOSS infrastructure is under attack by AI companies 这篇文章,找到了解决方案

Anubis

Anubis 是一个采用工作量证明的反向代理,这个程序会在用户的浏览器上,执行一段 JS 程序,进行大量的数学计算。直到计算答案正确,才可以访问目标网站。
关于其算法的人话介绍可以看 科技爱好者周刊(第 343 期):如何阻止 AI 爬虫

使用 Docker compose 部署

使用以下docker-compose.yml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
services:
anubis-nginx:
image: ghcr.io/techarohq/anubis:latest
environment:
BIND: ":8080"
COOKIE_DOMAIN: "example.com"
DIFFICULTY: "5"
METRICS_BIND: ":9090"
SERVE_ROBOTS_TXT: "true"
TARGET: "http://localhost"
ports:
- 8080:8080
- 9090:9090
volumes:
- "./botPolicy.json:/data/cfg/botPolicy.json:ro"
nginx:
image: nginx
volumes:
- "./www:/usr/share/nginx/html"

常用环境变量说明:

环境变量 说明
BIND Anubis 监听的网络地址,也就是提供服务的端口,示例: “:8080”
COOKIE_DOMAIN Anubis 挑战通行证 cookie 应设置的域名。这应该设置为从您的注册商那里购买的域名(例如:如果您的 webapp 运行在 anubis.techaro.lol 上,则为 techaro.lol
DIFFICULTY 难度,结果最高位中连续的0的数量,越大需要计算的时间越长
METRICS_BIND Anubis 提供 Prometheus 指标的端口
SERVE_ROBOTS_TXT 如果设置 true ,Anubis 将提供默认的 robots.txt 文件,该文件通过名称禁止所有已知的 AI 爬虫,然后额外禁止每个爬虫。如果事实和情况使得难以更改底层服务以提供此类 robots.txt 文件,则此操作很有用
TARGET Anubis 应将有效请求转发到的服务 URL,也就是后端服务的地址,示例: “http://127.0.0.1:3000

有关更多的环境变量说明请阅读 Setting up Anubis | Anubis,上面罗列的只是必要的环境变量

Prometheus 指标

Anubis 提供了 Prometheus 指标来让我们查看系统的运行状态等信息,访问http://<你的服务器IP>:<你在环境变量中设置的METRICS_BIND值>/metrics即可获取 Prometheus 指标
其中:

指标 说明
anubis_challenges_issued Anubis 发出的质询数量
anubis_challenges_validated 通过质询的请求数量
anubis_failed_validations 未通过质询的请求数量

禁用 DNSBL 检查

Anubis 默认会在连接时对访问者 ip 进行 DNSBL 检查,但是很多 ipv6 地址不在 Anubis 使用的 DNSBL 的数据库中,不过在 #184 中已经有人提出了删除 DNSBL 检查功能的请求
禁用方法:
向安装目录下的 botPolicy.json 配置文件中写入(如果没有请创建这个文件):

1
2
3
4
5
[
{
"dnsbl": false
}
]

参考资料

Anubis
Anubis Update: February 2025


使用 Anubis 抵挡疯狂的 LLM bot
https://mmeiblog.cn/articles/2025/anubis.html
作者
mei
发布于
2025年4月6日
许可协议