家里宽带一到晚上,手机 App 的开屏广告、电视盒子里的贴片广告就全冒出来了。浏览器装插件能挡住网页广告,但 App 里的广告插件根本管不着——它们压根不走浏览器。
后来把全屋 DNS 换成了 AdGuard Home,一次性解决:手机、平板、电视、扫地机器人,只要能联网就自动过滤,不用一台台去装东西。
它的思路很粗暴,但有效。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 万条规则,成本远低于预期;真正麻烦的不是性能,是上面那三个默认配置。
你们那边是怎么弄的?路由器上直接开,还是单独弄了台小机器跑?