技术交流

AdGuard Home 自建 DNS 去广告实测

🦋admin LV1 · 2 次浏览 · 0 条回复

家里宽带一到晚上,手机 App 的开屏广告、电视盒子里的贴片广告就全冒出来了。浏览器装插件能挡住网页广告,但 App 里的广告插件根本管不着——它们压根不走浏览器。

后来把全屋 DNS 换成了 AdGuard Home,一次性解决:手机、平板、电视、扫地机器人,只要能联网就自动过滤,不用一台台去装东西。

AdGuard Home 自建 DNS 去广告实测

它的思路很粗暴,但有效。DNS 只干一件事:把域名翻译成 IP。AdGuard Home 坐在你家网络出口,所有设备问它「xx.com 在哪」,它先翻一遍规则表,命中广告域名就直接回一个 0.0.0.0。

设备拿到 0.0.0.0,连接自然建不起来,广告请求死在第一步。所以它拦的是整个域名,不是页面里的某个元素——网页上会留一块空白,App 里可能是个加载失败的方框。

好处是覆盖面极广:任何走 DNS 的设备都管得住,包括那些你根本没法装插件的电视盒子。

装起来有多简单

官方给的是单个可执行文件,Windows 版解压 33.4MB,双击就跑,第一次启动自动进安装向导,浏览器打开 127.0.0.1:3000 跟着点就行。

我在这台 Windows 11 机器上掐了几个时间:

  • 首次启动(无配置)到网页能打开:617 毫秒
  • 已有配置的冷启动:346 毫秒
  • DNS 服务开始应答:678 毫秒
  • 压缩包 11.5MB,解开后单文件 33.4MB

对一台常年开机的设备来说,这点启动开销可以忽略。装完把路由器的 DHCP DNS 指向它,全屋设备就都走它了。

想确认某台设备到底有没有走过滤,不用翻统计页,命令行一句就够:

nslookup doubleclick.net 192.168.1.2

返回 0.0.0.0 说明规则在起作用;返回正常 IP,要么这台设备没走它,要么规则没加载。排查「为什么只有手机没广告、电脑还有」这类问题时,这个办法比看后台快得多。

内存和规则:我盯着任务管理器看了十分钟

这是我最想知道的:十几万条规则到底吃多少内存。

默认启用的 AdGuard DNS filter 下载下来 4,478,719 字节,解析出 185,771 条规则,下载加装载一共 9.1 秒。

内存曲线(工作集):

  • 刚启动、规则还没加载:27.9 MB
  • 规则加载完成那一瞬间:93.6 MB
  • 跑了几十次查询后回落稳定:66.3 MB

也就是说,18 万条规则的常驻成本大约 40MB,加上程序本体不到 70MB。一台 1GB 内存的软路由、甚至树莓派都放得下。这个量级比我想的小,不少同类方案要几百 MB 才够。

查询延迟(同一台机器,本机查询):

  • 未命中缓存、要回源:14~21 毫秒
  • 命中拦截规则:1 毫秒(本地直接返回,不出网)
  • 缓存命中:中位数 2 毫秒
  • 服务端自己统计的平均处理时间:2.3 毫秒

拦截效果当场验:

  • doubleclick.net → 0.0.0.0
  • google-analytics.com → 0.0.0.0
  • hm.baidu.com → 0.0.0.0
  • pos.baidu.com → 0.0.0.0
  • www.baidu.com / qq.com / github.com → 正常解析,没误杀

第一个坑:默认上游在国内基本不通

装完向导、什么都不改,你会发现整屋断网——所有域名都解析不出来,网页一直转圈。

原因在配置文件里:安装向导默认把上游 DNS 设成 https://dns10.quad9.net/dns-query,bootstrap 是 9.9.9.10。这几个地址国内直连基本不通,而你所有的设备现在都要经过它。

改法是把 AdGuardHome.yaml 里的上游换成国内可用的:

dns:
  upstream_dns:
    - 223.5.5.5
    - 119.29.29.29
  bootstrap_dns:
    - 223.5.5.5
    - 119.29.29.29

改完重启,第一个域名 678 毫秒就通了。没改之前,每次查询都要等满超时。

还有个连带问题:AdGuard Home 下载过滤规则列表时,用的是它自己的 DNS。上游不通,列表也下不下来,data/filters 目录是空的,界面上规则数是 0,看起来像「装了但没生效」。这两件事其实是同一个原因,别分开排查。

第二个坑:默认每秒 20 次查询的限制会误伤

配置里有个 ratelimit: 20,意思是单个客户端每秒最多查 20 次,超出的不响应。

家用够不够?我用 100 个并发查询压了一下:

  • 默认 ratelimit=20:只有 20 个拿到响应,其余 80 个在 5 秒后超时
  • 把 ratelimit 改成 0 再测:100 个全部返回,总耗时 118 毫秒
  • 再上 300 并发:908 毫秒跑完,这时瓶颈已经在上游 DNS 了

注意超时的表现不是「被拒绝」,客户端只能看到「解析超时」,然后卡住重试。浏览器一次开十几个页面、或者家里几台设备同时刷新,瞬时并发很容易破 20。

设备多的话,把 ratelimit 调到 0 或者至少 100。代价是抗攻击能力变弱,家用环境基本不用担心这个。

第三个坑:Windows 上 5353 端口被系统占着

我一开始想用 5353 测试,避开 53。结果启动直接报:

listen udp 127.0.0.1:5353: bind: An attempt was made to access
a socket in a way forbidden by its access permissions.

这不是权限问题,是 Windows 的「排除端口范围」——Hyper-V、WSL、Docker 会预留一大段端口,5353 正好落在里面。用 netsh int ipv4 show excludedportrange protocol=udp 能看到这张表。

解决办法:别用 5353,直接用 53(Windows 上绑 53 不需要管理员权限,这点和 Linux 不一样),或者换 15353 这类高位端口。

使用上的几句实话,和到底值不值得装

配置文件就在工作目录下的 AdGuardHome.yaml,数据在 data/ 里。换一个目录启动,等于一份全新配置,想迁移把整个文件夹拷走就行。

统计库很小,跑了几十次查询后 sessions.db 和 stats.db 都还是 32KB,4.4MB 的规则文件才是空间大头。

它挡不住 YouTube 那种把广告和视频放同一个域名的,也挡不住 App 用 IP 直连的内置广告。DNS 层拦截的边界就在这:域名分得清才拦得住。

所以值不值得装,得看你的痛点在哪。如果主要是网页广告,浏览器插件更省事,还能精确到页面元素。

但如果是「家里所有设备」——电视盒子、老人的手机、小孩的平板、各种 IoT——DNS 这层是唯一能一次性覆盖的地方,装一次管很久,规则列表自己会更新。

我这台的结论是:常驻 66MB、单次查询 2 毫秒、18 万条规则,成本远低于预期;真正麻烦的不是性能,是上面那三个默认配置。

你们那边是怎么弄的?路由器上直接开,还是单独弄了台小机器跑?

回复

还没有回复,抢个沙发

登录后即可参与讨论

去登录 注册账号

相关帖子