> For AI agents: the site index is available at https://www.juniortree.com/llms.txt; this page is available as Markdown at https://www.juniortree.com/blog/anubis-setup.md.
> Anubis通过JS挑战保护网站免受AI爬虫侵扰，适合小型站点部署

## Page metadata

- **Published:** 2025-04-28
- **Updated:** 2025-04-28
- **Tags:** 计算机
- **Source URL:** https://www.juniortree.com/blog/anubis-setup

# Anubis 帮助你免受AI爬虫攻击

近些来，一些 AI 公司为了获取大量的数据用于大模型的训练，疯狂地利用各种爬虫，不顾 robots.txt 或者其他爬虫协议，对站点发起大量请求，对于个人站点来说，这种请求量可能使得网站崩溃

而且这些公司大量使用各种住宅 IP，修改 user-agent，导致我们根本没有办法从 ASN 和请求头下手对请求进行拦截

Cloudflare 其实提供了一些解决方案，比如说 AI 迷宫：[Bot Management · Cloudflare bot solutions docs](https://developers.cloudflare.com/bots/get-started/bot-management/#block-ai-bots)，但是对于一些没办法使用 Cloudflare 或者不愿意使用 Cloudflare 的场景，我们又该怎么办呢？

Anubis 为你提供了这样的一种解决方案：[Docs | Anubis](https://anubis.techaro.lol/docs/)，帮助保护小型互联网免受人工智能公司无休止的请求风暴的影响

## 设计原理

Anubis 通过设置和 Cloudflare 一样的 JavaScript 挑战，来校验访问的客户端是否为浏览器，但客户端请求满足这些条件时，Anubis 将自动发起质询：

- 用户代理包含 `"Mozilla"`
- 请求路径不在 `/.well-known` 、 `/robots.txt` 或 `/favicon.ico` 中
- 请求路径显然不是 RSS 订阅（以 `.rss` 、`.xml` 或 `.atom` 结尾）

这样的设计能够保证诸如 git 或者 RSS 定义客户端不受到影响，而对于一些浏览器或者 AI 爬虫这些高风险客户端则能进行质询

![](https://pic.juniortree.com/app/hide.php?key=RXU4S2V0aWFpNVo0OXhKWGZWbFh5bXRIR3B4a0ZJUjdHUT09)

通过挑战后，会签发一个 `"within.website-x-cmd-anubis-auth"` 的 HTTP Cookie，这样的话就算通过了挑战

## 如何设置

Anubis 的运行方式其实是在反向代理和后端服务之间创建一个中间代理，后端服务的流量在经由 Nginx 或者 Caddy 处理之后，到达 Anubis，最后经由 Anubis 再到达后端服务：[Setting up Anubis｜Anubis](https://anubis.techaro.lol/docs/admin/installation)

![](https://pic.juniortree.com/app/hide.php?key=a0NmczJvSWdyUGF6Wndyd0FyRXVVSWE4VVJWTWZYLzNmUT09)

![](https://pic.juniortree.com/app/hide.php?key=OEM4TGlIc2ZtQ1Y4MFBYSW1ZYzhKYy9tck1OMXJQTkg4QT09)

Anubis 提供了多种部署方式，在这里我就直接使用包管理器的方法进行安装：[Installing Anubis with a native package｜Anubis](https://anubis.techaro.lol/docs/admin/native-install)

首先从 GitHub 上下载对应的安装包：[Releases · TecharoHQ/anubis](https://github.com/TecharoHQ/anubis/releases)

```bash
wget https://github.com/TecharoHQ/anubis/releases/download/v1.17.0/anubis_1.17.0_amd64.deb
```

之后安装

```bash
sudo apt install ./anubis_1.17.0_amd64.deb
```

这里比如说我们想保护一个 Gitea 应用，我们 Gitea 后端的端口为 3000，先来配置 Anubis 的配置文件：

```bash
sudo cp /etc/anubis/default.env /etc/anubis/gitea.env
```

之后开始编辑：

```bash
nano /etc/anubis/gitea.env
```

默认的内容如下：

```
BIND=:8923
DIFFICULTY=4
METRICS_BIND=:9090
SERVE_ROBOTS_TXT=0
TARGET=http://localhost:3000
```

具体的各种参数可以查看：[Environment variables｜Anubis](https://anubis.techaro.lol/docs/admin/installation/#environment-variables)

我们这里只填几个必须的，可以参考我的：

```
BIND=:8923
DIFFICULTY=4
METRICS_BIND=:9090
SERVE_ROBOTS_TXT=0
POLICY_FNAME=/etc/anubis/gitea.botPolicies.json
TARGET=http://127.0.0.1:3011
WEBMASTER_EMAIL=admin@example.com
REDIRECT_DOMAINS=git.juniortree.com
USE_REMOTE_ADDRESS=true
ED25519_PRIVATE_KEY_HEX=cdfd076f987d91d165821cac23efcd4a2ab9e09e9642a8ec474ea02b9ef4e8ae
```

- `BIND`：Anubis 代理后端转发的端口，对于 Caddy 和 Nginx，这里就是代理的端口
- `DIFFICULTY`：挑战的难度，或成功回答中必须包含的前导零的个数
- `METRICS_BIND`：给普罗米修斯探针做监控的
- `SERVE_ROBOTS_TXT`：Anubis 会默认提供一个 `robots.txt`，来控制爬虫
- `POLICY_FNAME`：设置 Anubis 规则文件的位置
- `TARGET`：设置要保护的后端服务
- `WEBMASTER_EMAIL`：在质询页面会留下一个管理员邮件，如果质询出现问题，访客可以通过这个联系到你
- `REDIRECT_DOMAINS`：这里需要添加为你要保护的域名，比如说我后端原来服务的域名为 `git.juniortree.com`，那这里就填这个
- `USE_REMOTE_ADDRESS`：传递真实 IP 的头部
- `ED25519_PRIVATE_KEY_HEX`：用于签署 Anubis 响应的十六进制编码 ed25519 私钥，如果未设置，Anubis 将自动生成一个，长度应正好为 64 个字符，可以使用 `openssl rand -hex 32` 自己生成一个（不要直接使用我上面的）

之后把对应的规则复制到相应的目录里面：

```bash
sudo cp /usr/share/doc/anubis/botPolicies.json /etc/anubis/gitea.botPolicies.json
```

启动服务：

```bash
sudo systemctl enable --now anubis@gitea.service
```

然后设置反向代理（Nginx、Caddy 等），指向 Anubis 端口。然后，Anubis 会将所有符合 `/etc/anubis/gitea.BotPolicies.json` 中策略的请求反向代理到目标服务

我这里使用的是 Caddy，我的配置文件就为：

```
git.juniortree.com {
    reverse_proxy 127.0.0.1:8923 {
        header_up X-Real-Ip {remote_host}
    }
}
```

Nginx 我自己没有实践过，可以参考官方的：

```
location /myapp/ {
    proxy_pass http://anubis:8923/myapp;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}
```

这个是质询中的页面

![](https://pic.juniortree.com/app/hide.php?key=L2k1OE5TdEc3VEhQS0xkS0JSR2JNZisvQWVWb0JBc1ZWZz09)

这个是质询失败的页面：

![](https://pic.juniortree.com/app/hide.php?key=SUFlRnRsQ2NJYzNybUhpMXRzY2c1ZisvQWVWb0JBc1ZWZz09)

质询通过后自动跳转到对应的业务
## 一些讨论

### Anubis 能不能用来当防火墙用？

这个显然是不可以的，因为前面说了，只会对包含 `"Mozilla"` 的进行质询，而假如攻击者使用修改的谷歌爬虫请求头，那就可以直接绕过了，这时就应该搭配谷歌的 ASN 进行认证

如果一定要作为防火墙使用，使用 Cloudflare 的 WAF 或许是更好的选择

### 会不会影响 SEO

尚不清楚，我自己只对不希望被爬取的 Git 仓库进行了配置，官方给出的建议也并不明确，我没有对其进行测试，对此保持旁观态度
