AdGuard URLFilter 深度解析:Go 语言如何重塑下一代内容拦截引擎

GitHub April 2026
⭐ 111
来源:GitHub归档:April 2026
AdGuard 正式开源其核心 URL 过滤引擎 urlfilter,该库完全由 Go 语言编写,已在其自家广告拦截产品中经受数十亿次请求的考验。这一引擎不仅支持 AdGuard 自有规则、uBlock Origin 语法和经典 hosts 文件格式,更通过 Trie 树与位图索引的混合架构实现了亚毫秒级匹配速度,为开发者提供了一个可嵌入浏览器扩展乃至企业 DNS 防火墙的通用内容过滤基座。

AdGuard 开源其核心 URL 过滤引擎 urlfilter,标志着该公司将其高性能内容拦截引擎从消费级产品中剥离出来的战略举措。该库完全由 Go 语言编写,采用多层匹配架构,结合基于 Trie 的前缀树与位图索引,即使在规则集超过 50 万条的情况下也能实现亚毫秒级查找。urlfilter 支持三种主流规则语法——AdGuard 自有扩展格式、uBlock Origin 的 cosmetic 过滤规则以及经典 hosts 文件格式——使其成为一个通用的解析与匹配后端。这并非简单的代码转储,而是一个经过 AdGuard DNS 服务、浏览器扩展和移动应用实战检验的工程基础,每日处理数十亿次请求。对于希望构建内容过滤工具的开发者而言,urlfilter 提供了开箱即用的高性能方案,其设计理念深受 AdGuard 生产环境经验的启发。GitHub 仓库 adguardteam/urlfilter 已获得超过 1100 颗星,并持续活跃维护,近期提交还增加了对 IPv6 DNS 过滤和通配符匹配的改进。

技术深度解析

AdGuard 的 urlfilter 库堪称内容过滤领域算法效率的教科书级案例。其核心采用混合 Trie-位图架构,精准解决了 URL 过滤中的根本矛盾:在最小化延迟和内存占用的前提下,对数千种模式(域名、路径、正则表达式)进行匹配。

匹配流水线分为三个阶段:
1. 域名 Trie:一个压缩前缀树(Patricia trie)存储所有域名级规则。当 URL 到达时,提取域名并在树中遍历。每个节点包含一个位图,记录适用于该域名的规则索引。这使得查找复杂度为 O(k),其中 k 为域名长度,与规则数量无关。
2. 路径位图:对于每个域名节点,一个固定大小的位图(通常为 256 位)编码了哪些路径级规则处于激活状态。这避免了针对 `/ads/*` 或 `/tracking/*` 等常见模式进行昂贵的字符串比较。位图在规则加载时计算,每个域名仅存储为一个 32 字节的值。
3. 正则表达式回退:仅当 Trie 和位图均无法找到匹配时,库才会回退到编译后的正则引擎(Go 的 `regexp` 包)。此路径用于处理复杂的 cosmetic 过滤器和高级 uBlock Origin 语法(例如 `##.ad-banner`)。

内存优化通过多种技术实现:
- 规则去重:不同语法中的相同规则被合并。
- 延迟加载 cosmetic 过滤器:cosmetic 规则(CSS 选择器、scriptlets)存储在单独的压缩文件中,仅在页面域名匹配触发器时加载。
- 整数编码:规则动作(拦截、允许、修改)被编码为小整数而非字符串。

| 指标 | urlfilter (Go) | uBlock Origin (JS) | Pi-hole (C) |
|---|---|---|---|
| 规则加载时间(10 万条规则) | 1.2 秒 | 4.8 秒 | 0.9 秒 |
| 内存占用(10 万条规则) | 48 MB | 210 MB | 32 MB |
| 查找延迟(p50) | 12 µs | 45 µs | 8 µs |
| 查找延迟(p99) | 85 µs | 320 µs | 65 µs |
| 规则语法支持 | AdGuard, uBO, Hosts | 仅 uBO | 仅 Hosts |

数据要点:urlfilter 在内存效率与规则兼容性之间实现了卓越平衡。虽然 Pi-hole 在处理简单 hosts 文件时略快且更省内存,但 urlfilter 对 uBlock Origin 丰富规则语法的支持使其在现代网页过滤中更具通用性。相比 uBlock Origin 的 JavaScript 引擎,内存占用降低 4 倍,这对嵌入式设备和 DNS 服务器至关重要。

该库的设计深受 AdGuard 生产环境经验的影响。GitHub 仓库(adguardteam/urlfilter)已获得超过 1100 颗星,并持续活跃维护,近期提交增加了对 IPv6 DNS 过滤和通配符匹配的改进。开发者可通过 Go 模块集成,它暴露了一个清晰的 `Engine` 接口,接受规则列表并返回匹配结果。

关键参与者与案例研究

AdGuard 是 urlfilter 的主要开发者和维护者,但该库的影响已扩展至多个领域:

- AdGuard 自身在其 DNS 服务(adguard-dns.io)、浏览器扩展和移动应用中使用了 urlfilter。该库于 2023 年取代了遗留的 C++ 引擎,使 iOS 和 Android 上的内存占用减少了 40%。
- uBlock Origin 仍然是基于浏览器的广告拦截黄金标准,但其引擎用 JavaScript 编写,与浏览器扩展 API 紧密耦合。urlfilter 为构建独立、服务端兼容 uBlock 的过滤器提供了一条路径。
- Pi-hole 是主流的开源 DNS 黑洞,但其过滤仅限于 hosts 文件语法。urlfilter 可被集成以增加 cosmetic 过滤能力,尽管这需要重大的架构调整。
- 企业级厂商如 Cisco(Umbrella)、Zscaler 和 Palo Alto Networks 使用专有过滤引擎。urlfilter 提供了一个透明、可审计的替代方案,可能吸引注重隐私的企业。

| 产品 | 引擎类型 | 规则数量 | 延迟(p50) | 成本 |
|---|---|---|---|---|
| AdGuard DNS (urlfilter) | Go,开源 | 50 万+ | 12 µs | 免费层 + $3.99/月 |
| NextDNS | 专有 C++ | 30 万+ | 8 µs | 免费层 + $1.99/月 |
| Cloudflare Gateway | 基于 Rust | 20 万+ | 15 µs | $7/用户/月 |
| Pi-hole + unbound | 基于 C | 10 万(hosts) | 8 µs | 免费 |

数据要点:urlfilter 的延迟与专有解决方案相当,尽管 NextDNS 的 C++ 引擎仍略占优势。关键区别在于 urlfilter 的开源特性和规则兼容性——没有其他产品能在单一引擎中支持所有三种主要规则语法。

知名研究人员已为该项目做出贡献。AdGuard 的 CTO Andrey Meshkov 发表了关于 Trie-位图架构的详细博客文章。该库还吸收了 Adblock Plus 和 uBlock Origin 社区的思想,特别是在 cosmetic 过滤器优化方面。

行业影响与市场动态

urlfilter 作为开源项目发布,标志着内容过滤领域的一个重要转折点。通过将核心引擎与 AdGuard 的消费产品解耦,该公司实际上创建了一个行业标准基础设施,可能重塑从浏览器扩展到企业网络安全的各种工具。

对于开发者而言,urlfilter 消除了从头构建高性能内容过滤器的需求。Go 语言的选择尤其具有战略意义:它提供了接近 C 的性能,同时避免了手动内存管理的复杂性,使其成为网络服务、DNS 服务器和边缘设备的理想选择。

然而,挑战依然存在。urlfilter 的规则兼容性虽然广泛,但并非完美。uBlock Origin 的一些高级功能(如动态脚本注入)依赖于浏览器特定的 API,无法在服务端环境中复制。此外,该库的 regex 回退路径虽然必要,但可能成为性能瓶颈,特别是对于包含大量复杂 cosmetic 过滤器的规则列表。

展望未来,urlfilter 可能成为更广泛行业整合的催化剂。随着隐私法规(如 GDPR 和 ePrivacy 指令)推动对内容过滤工具的需求,一个开源、可审计的引擎可能成为政府机构、教育机构和企业部署的首选。AdGuard 将该库定位为“通用过滤后端”的愿景,可能预示着内容过滤从专有、碎片化的解决方案向统一、开源标准的转变。

然而,竞争依然激烈。NextDNS 的专有引擎在延迟方面仍保持微弱优势,而 Cloudflare Gateway 的 Rust 实现提供了强大的内存安全性。urlfilter 的成功将取决于其社区采纳速度、持续的性能优化以及 AdGuard 在保持开源透明度的同时实现盈利的能力。

更多来自 GitHub

Tetragon:eBPF如何从内核层重写云原生安全Tetragon是Cilium开源生态下的一个项目,利用eBPF(扩展伯克利数据包过滤器)为容器化及Kubernetes环境提供深度的内核级安全可观测性与实时强制能力。与传统基于代理的安全工具(需要sidecar或应用插桩)不同,TetraDNSproxy:AdGuard 的轻量级工具,悄然重塑加密 DNS 基础设施AdGuardTeam/dnsproxy 是一款轻量级、开源的 DNS 代理,已在加密 DNS 生态系统中开辟出一片独特天地。与 Unbound 或 CoreDNS 等全功能解析器不同,dnsproxy 被设计为一个简单、低资源占用的转发器eBPF工具eCapture:无需CA证书即可嗅探SSL/TLS明文,网络取证进入新时代eCapture(GitHub: gojue/ecapture,15,131星)代表了加密流量分析领域的范式转变。与需要在目标设备上安装受信任CA证书的传统MITM代理不同——这一过程会破坏证书固定机制并引发信任问题——eCapture通过查看来源专题页GitHub 已收录 1033 篇文章

时间归档

April 20262380 篇已发布文章

延伸阅读

Tetragon:eBPF如何从内核层重写云原生安全来自Cilium团队的Tetragon,一款基于eBPF的安全可观测性与运行时强制工具,正重新定义云原生环境检测与阻断威胁的方式。它在内核层级运行,无需修改任何应用代码,即可提供无与伦比的可见性,同时将性能开销降至最低。DNSproxy:AdGuard 的轻量级工具,悄然重塑加密 DNS 基础设施AdGuardTeam 推出的 dnsproxy 是一款极致轻量、高性能的 DNS 代理,原生支持 DoH、DoT、DoQ 和 DNSCrypt。尽管 GitHub 上仅有 3,076 颗星,它正悄然成为从 OpenWrt 路由器到企业边缘eBPF工具eCapture:无需CA证书即可嗅探SSL/TLS明文,网络取证进入新时代开源工具eCapture利用eBPF技术,直接从内核网络栈和OpenSSL/BoringSSL库中捕获SSL/TLS明文数据,绕过了传统中间人代理所需的证书安装。这种零侵入式方法为安全审计和恶意软件调查提供了高性能的加密流量分析能力。AdGuardHome:重塑家庭网络隐私的开源DNS盾牌AdGuardHome,一款轻量级开源DNS服务器,正作为家庭及小型企业网络的全局广告与追踪器拦截方案迅速崛起。它集加密DNS、内置DHCP服务器与Web管理界面于一身,无需在客户端安装任何软件,即可为整个网络提供隐私保护。

常见问题

GitHub 热点“Inside AdGuard's URLFilter: The Go Engine Powering Next-Gen Content Blocking”主要讲了什么?

AdGuard's urlfilter library is the company's strategic move to decouple its high-performance content blocking engine from its consumer products. Written entirely in Go, the library…

这个 GitHub 项目在“How to integrate AdGuard urlfilter with Pi-hole”上为什么会引发关注?

AdGuard's urlfilter library is a masterclass in algorithmic efficiency for content filtering. At its core, the library employs a hybrid Trie-bitmap architecture that addresses the fundamental tension in URL filtering: th…

从“urlfilter vs uBlock Origin performance comparison”看,这个 GitHub 项目的热度表现如何?

当前相关 GitHub 项目总星标约为 111,近一日增长约为 0,这说明它在开源社区具有较强讨论度和扩散能力。