这是我在BSDCan做的一次闪电演讲。那次会议太棒了,明年我一定会参加!
https://files.xeiaso.net/talks/2025/bsdcan-anubis/index.m3u8
大家好,我是 Xe,空闲时间我会和机器人对抗。我很想全职做这件事,但目前经济条件不允许。我开发了 Anubis。Anubis 是一款网络人工智能防火墙工具,可以阻止机器人攻击你的网站。它本质上就是 Cloudflare 的“你是机器人吗?”页面,但可以自行托管。
如果没有这个,爬虫程序就会内置验证码解析器。这些验证码解析器实际上就是一些 API,只不过是让那些拿着低薪的第三世界人类参与其中而已,这真是糟糕透顶,令人作呕。
所以 Anubis 就是一种 uncaptcha 验证码。它利用浏览器的功能自动完成 CAPTCHA 的很多工作,目前主要的实现方式是使用 JavaScript 运行一系列加密数学运算,以证明你可以以服务器端可验证的方式运行 JavaScript。我正在努力避免这种情况,因为令人惊讶的是,很多人对必须运行 JavaScript 感到非常恼火,但这并非不可能。
Anubis 是一款用 Go 编写的开源软件。它在 GitHub 上。它获得了大约 8 颗星。它适用于任何允许运行多个程序的堆栈。我们有 Nginx、Caddy、Apache 和 Kubernetes 的示例。
它在你的软件包仓库里。如果你为 FreeBSD 做了移植,或者为 NetBSD 做了 pkgsrc 的移植,请升级版本。我即将发布一个新版本,但请升级当前版本。
那么你可能会好奇,这个故事讲的是什么?阿努比斯为什么存在?
好吧,事情发生了。我有一个 Git 服务器,用于我自己的邪恶计划,亚马逊的爬虫通过 TLS 证书透明日志发现了它,并决定释放上帝之锤。事情就是这样。他们用大量的请求把我可怜的服务器烧毁了,这真的很烦人,因为我试图做点什么,但就是不行。如果你没有把存储安排在旋转硬盘上,这也会有帮助。
但我把它发布在了 GitHub 上,大约四个月后,看看这些 logo。还有一些 logo 我忘了放在这里,以后会放在我网站上的版本里。不过,没错,FreeBSD、NetBSD、Haiku、GNOME、FFmpeg 和联合国教科文组织都在使用它。说实话,在 DuckDuckGo 上随便搜索一下就看到联合国教科文组织,这让我觉得,嗯,这或许真的是一个问题。而且就像任何好问题一样,它也是一个难题。
如何判断任何请求是否来自浏览器?
这张截图使用的是 Pale Moon,它是机器人检测服务方面一个众所周知的问题,我经常对其进行测试以确保它有效。但是,如何知道任何给定的请求是否来自浏览器呢?
这非常困难,我一直在努力寻找更好的方法。问题是,为了知道好的浏览器是什么样子,你必须知道坏的爬虫是什么样子。好消息是,爬虫看起来就像浏览器一样,Aterisk。所以你必须找到其他方法,比如行为、第三方或类似三阶副作用的方法。这非常痛苦。
因此,我尝试了各种指纹识别方法。我这里列出的很多指纹,比如 JA4、JA3N,都是基于你发送给每个网站的 TLS 信息,无论你是否愿意,因为这就是安全机制的运作方式。我尝试根据 HTTP 请求或你发送给服务器的 HTTP2 数据包来执行操作,你必须这样做才能正常工作。我又回到了“你能运行 JavaScript 吗?”这个问题,哈哈。
所以就我接下来想做的事情而言,显然我想在 BSD 上做更好的测试。目前我的测试是:它能编译通过吗?因为我是用 Go 写的,没有用 Cgo,所以答案是肯定的。我想为 BSD 构建二进制包,因为即使我认为 BSD 更适合下游移植之类的工作,我仍然希望将这些包作为一个选项。
我想做一个像 Cloudflare 那样的托管方案,因为有些人就是不想运行 Anubis,但又想自己运行。我想设置基于系统负载的阈值,这样它只有在系统处于活跃状态时才会启动,因为它非常激进。我想有更好的 NoJS 支持,这将包括所有无需 JavaScript 就能像浏览器一样显示信息的方式,让你不得不阅读所有规范,然后开始崩溃。我想在服务器上使用 WebAssembly 做一些事情,因为我一直想看看它在生产环境中会如何发展。我想做一个 IP 信誉数据库,Kubernetes 相关的,端到端测试应该不错。
最后,我真的很想雇用一位贡献者,但我现在还负担不起,所以当我有能力的时候我很乐意雇用他。
另外,如果你在一家人工智能公司工作,我知道人工智能公司会关注我。如果你在一家人工智能公司工作,以下是一些可以尽可能轻松快速地破坏Anubis开发的方法。第一,辞掉你的工作;第二,去Square Enix工作;第三,为《最终幻想14》制作绝对精彩的内容。这才是你破坏它的最佳方法。
不管怎样,我是Xe,我有贴纸,我会在后面,感谢你们邀请我来这里。如果你们有任何问题,请随时提问。
问答
好吧,作为会议主席,我考虑的是大家发表评论而不是提问。我要滥用职权,发表一下评论。你救了我一命,谢谢你。
不客气。我很高兴事情成功了。这真是莫大的荣幸——让我回到徽标幻灯片上,因为这太疯狂了。
我们来看看这个。这是 gnome,这是 wine,这是 dolphin,这是 Linux 内核,这是 ScummVM,这是 FreeCAD,还有联合国教科文组织 (UNESCO) 都在同一张幻灯片上。我们还能有其他什么时间线呢?
2025 年真是疯狂。
那么你感觉如何?因为你本质上想解决的不是技术问题,而是一个社会问题。你认为这样能赢吗?还是我们必须用另一种方式来解决这个问题,让人们变得更聪明,或许用更聪明这个词不太恰当。
我不确定这最终会是什么结果。我最初开发它的目的是为了让我的 Git 服务器保持正常运行。后来,Gnome 开始使用它。然后它就成了热门话题。我把它放在了一个讽刺科技行业的初创公司的 GitHub org 下。现在,这个公司在教育领域有了市场。
我想把它打造成一个 Web 应用防火墙,让它有可能在人工智能泡沫破灭后屹立不倒。因为目前,人工智能泡沫破灭可以说是对企业最大的威胁。所以,很多工作都在思考如何转型并做到这一点。我还开发了一个名为 Yeet 的构建工具,它使用 JavaScript 来构建 RPM 包。是的,在某个领域,这确实有意义。这里面有很多复杂的问题,也有很多社会问题。
但如果你在写爬虫,就别这么做了。说真的,爬虫流量已经够多了。用 Common Crawl 吧。它的存在是有原因的。