过滤原理 · 规则语法

AdGuard Home
过滤规则与拦截原理

它不是"看网页拦广告",而是在 DNS 查询这一关就把广告/追踪域名挡在门外。理解规则语法,才能精确控制拦什么、放什么。

||x.com^拦截域名及子域名
@@白名单例外前缀
订阅过滤列表自动更新
日志每条查询可追溯
TL;DR · 核心结论

AdGuard Home 的拦截发生在 DNS 解析阶段:客户端查询一个域名,它先拿这个域名去匹配所有已启用的过滤规则——命中拦截规则就按拦截模式返回 NXDOMAIN 或 0.0.0.0,设备拿不到广告服务器 IP;命中白名单例外(@@ 开头)则放行。规则语法以 AdGuard 风格 ||域名^ 为主,也兼容 hosts 写法与通配符。过滤列表通过订阅 URL 添加(如 StevenBlack、Hagezi),并在"查询日志/统计"里查看实际拦截效果。官方规则说明见 AdGuard Home Wiki · Filters。

Block Flow

DNS 拦截是怎么工作的

一次查询从发出到被拦,中间发生了什么

  1. 设备要加载网页,先向 AdGuard Home 查询 page.example.com 和 tracker.ads-network.com 两个域名。
  2. AdGuard Home 拿到 tracker.ads-network.com 后,用它去匹配所有已启用的过滤列表与自定义规则。
  3. 某条规则命中,于是按拦截模式返回 NXDOMAIN(域名不存在)或 0.0.0.0(黑洞地址)——两种都让广告请求连不出去。
  4. 而 page.example.com 没有命中任何拦截规则,正常转发上游解析、缓存后返回给设备,网页照常打开。
  5. 每一条查询(无论拦截与否)都会写入查询日志,并计入"统计"页的拦截占比。
Rule Syntax

规则语法速查

DNS 级规则只匹配域名,不需要浏览器那种 CSS 元素选择器

写法含义示例
||域名^AdGuard 语法:拦截该域名及其所有子域名||doubleclick.net^
@@||域名^白名单例外:即使被列表拦截也放行@@||needed.example.com^
! 注释注释行,不参与匹配! 这是自定义规则分组
0.0.0.0 域名hosts 风格:把该域名指向黑洞 IP0.0.0.0 ads.example.com
*.域名通配符:匹配该域名的任意层级子域名*.tracker.example.org
DNS 重写把域名指向自定义内网 IP(解析劫持到本地服务)nas.lan → 192.168.1.20

完整语法细节(分隔符 ^、例外优先级、正则规则等)以官方 Filters Wiki 为准。

Filter Lists

过滤列表:订阅即用、自动更新

不用自己逐条写规则——订阅社区维护好的列表即可,AdGuard Home 会定期自动拉取更新

AdGuard DNS filter

AdGuard 官方维护的 DNS 过滤列表,针对广告与追踪域名做了清洗,误杀率低,是默认推荐列表之一。

StevenBlack hosts

github.com/StevenBlack/hosts:合并多个知名 hosts 列表的聚合项目,覆盖广告/追踪/恶意软件域名,社区活跃、更新频繁。

Hagezi DNS blocklists

github.com/hagezi/dns-blocklists:按激进程度分档(light / multi / pro / pro++),适合按设备粒度选择拦截强度。

自定义/企业列表

任意 hosts 格式或 AdGuard 格式的 raw 文本 URL 都能添加。在"过滤 → DNS 过滤列表 → 添加过滤列表"粘贴订阅地址即可。

官方对 hosts 类列表的接入方式见 Hosts-Blocklists Wiki。

Whitelist & Logs

黑白名单与拦截日志

误拦了怎么救、效果怎么看,都在这两个入口

白名单(允许域名)

在查询日志里点某条记录的"白名单"按钮,或在自定义规则写 @@||域名^。白名单优先级高于一切拦截规则,专门用来救误杀。

黑名单(自定义拦截)

针对列表没覆盖到的特定广告/统计域名,直接在自定义过滤规则里加 ||域名^,立即生效。

查询日志

逐条展示经过 AdGuard Home 的 DNS 查询:时间、客户端 IP、被查询域名、是否被拦截、命中的是哪条规则。排障和追查误拦全靠它。

统计面板

聚合展示拦截占比、Top 被拦域名、Top 请求客户端、每日趋势,直观看到"这台 DNS 到底挡掉了多少广告流量"。

FAQ

常见问题

AdGuard Home 里一条过滤规则长什么样?+
最常见的是 AdGuard 语法:||example.com^ 表示拦截 example.com 及其所有子域名;前面加 @@(如 @@||example.com^)就是白名单例外。hosts 风格的 0.0.0.0 ads.com 也可以直接当规则用。
怎么给 AdGuard Home 添加一个过滤列表?+
在 Web 界面的"过滤 → DNS 过滤列表 → 添加过滤列表"里粘贴列表的 raw 订阅 URL,例如 StevenBlack hosts 的 raw 地址、Hagezi 的分档地址。AdGuard Home 会定期自动更新该列表。
某个正常网站被误拦截了怎么办?+
打开查询日志找到该域名的查询记录,点"白名单"按钮把它加入允许列表;或在自定义过滤规则里写一条 @@||被误拦域名^ 的例外规则,优先级高于拦截规则。
在哪里看 AdGuard Home 到底拦了多少域名?+
Web 界面的"查询日志"展示每一条经过的 DNS 查询与是否被拦截;"统计"页给出拦截占比、Top 被拦域名、Top 请求客户端等聚合图表。
References

参考来源