路由器安装AdGuardHome实现去广告

1. AdGuard

AdGuard Home 是一个能在路由器上运行的 DNS 服务器。 DNS 是干嘛的?它负责 “ 把网站名解析成 IP 地址 “。

举个例子:当你访问某个 App 中的广告: ad.example.com → 设备会问 DNS:“这个域名怎么对应 IP?” → AdGuard Home 查到该域名是广告域名 → 答复一个假的地址(0.0.0.0) → 请求直接失败,广告无法加载

AdGuard Home 是靠 “ 广告域名名单 “ 来判断哪些请求需要拦截,它主要针对 DNS 层广告域名。它并不修改网页内容、也不解密 App,通过 “ 不让广告域名解析 “ 来达到 “ 广告无法下载 “ 的目的。

1.1 能去掉的广告类型

AdGuard Home 擅长的,是那些通过独立广告服务器加载的内容。

场景示例原因
各种网页广告新闻门户、贴吧、论坛、购物网站广告资源都来自独立广告域名
免费手游、App 内横幅很多 SDK 广告(例如某某游戏启动时的开屏)广告 SDK 会访问广告服务器获取图片/视频
智能电视、电视盒子的广告系统更新推送、开机广告等同样走广告域名
网站统计、追踪与隐私跟踪Google Analytics、友盟、TalkingData 等域名明确可封锁

在上面这些情况下,AdGuard Home 能直接 “ 掐断广告来源 “,因此非常有效。

1.2 去不掉的广告类型

场景原因
YouTube App 的视频前贴广告视频数据与广告混在同一加密流里,DNS 看不出区别
小红书、抖音、微博 App 推荐流广告广告数据来自同一个业务域名,DNS 层无法精确过滤
App 内部写死的素材一些广告图片或文本打包在 App 资源包里,根本没有网络请求

所以 DNS 层过滤只能 “ 拦截独立广告域名 “,无法深入到网络内容内部。

YouTube App 的广告是目前最难通过 DNS 方式屏蔽的之一。原因是,Google 非常 “ 聪明 “,他们把广告和视频内容放在了同一个或非常相似的域名(比如 *.googlevideo.com)下。如果我们把这个域名屏蔽了,那广告确实没了,但视频也可能一起看不了了。

所以通过路由器的设置,可以屏蔽掉 YouTube App 的大部分图片/横幅广告和一部分视频广告,但可能无法 100% 屏蔽掉所有的前贴片、中插视频广告。 不过,它对其他 App 和网页广告的效果依然非常出色!

2. 配置

2.1 DNS 流程

1
2
3
4
5
6
7
8
9
手机 / 电脑 / 电视 等设备
↓ 都连到
[ OpenWrt 路由器 ]

(dnsmasq 接收 DNS 请求 53 端口)

→ 转发到 AdGuard Home 127.0.0.1#5353

上游 DNS(如 8.8.8.8)
  • 设置 DNS 端口:这是最关键的一步!为了避免和 dnsmasq(默认使用 53 端口)冲突,请不要使用 53。推荐设置为 5353
    • 网页管理界面端口:3000 (或任意您喜欢的,方便记忆)
    • DNS 端口:5353
1
  • 设置您的管理员用户名和密码,然后完成向导。
  • 现在,您应该可以通过 http://你的路由器IP:设定的管理端口(例如 http://192.168.1.1:3000)或插件提供的 http://你的路由器IP/adguard 路径访问 AdGuard Home 的仪表盘了。
2

2.2 让流量走进 AdGuard Home

你的 OpenWrt 上,一般有两个 DNS 服务:

  • dnsmasq(默认处理 53 端口)
  • AdGuardHome(改成监听 127.0.0.1:5353)

此时要保证: dnsmasq 接收到来自局域网客户端的请求后,正确地转发给 AGH 的 127.0.0.1#5353。否则,就算 AdGuard Home 启动成功,也会空跑。

1
2
3
4
5
root@ImmortalWrt:~# cat /etc/config/dhcp | grep server
list server '127.0.0.1#7874'
option dhcpv4 'server'
option ra 'server'
option dhcpv6 'server'
1
2
3
4
5
6
7
8
9
10
# ✳️ 1. 删除 LuCI 目前保存的(防止重复或覆盖)
uci delete dhcp.@dnsmasq[0].server

# ✳️ 2. 手动添加需要的两个转发目标
uci add_list dhcp.@dnsmasq[0].server='127.0.0.1#7874'
uci add_list dhcp.@dnsmasq[0].server='127.0.0.1#5353'

# ✳️ 3. 提交并重启 dnsmasq,让配置立即生效
uci commit dhcp
/etc/init.d/dnsmasq restart
1
2
3
4
5
6
root@ImmortalWrt:~# cat /etc/config/dhcp | grep server
list server '127.0.0.1#7874'
list server '127.0.0.1#5353'
option dhcpv4 'server'
option ra 'server'
option dhcpv6 'server'

修改后发现配置,一会就会被覆盖重写,参考下面的 openclash 配合问题。

2.3 拦截测试

  1. 访问一些广告较多的新闻网站,看看广告是否消失了。
  2. 可以访问专门的测试网站,如 https://adblock-tester.com
3

3. Openclash 配合问题

127.0.0.1#7874 是 openclash 的 dns 解析,127.0.0.1#5353 是 adguard home 的 dns 解析。在功能上存在冲突,如果你像现在这样把它们俩并列设置为 dnsmasq 的上游,就会产生问题。

dnsmasq 如果配置了多个上游服务器,它会并发地向所有服务器发送查询,并采用最快返回结果的那个。这就导致:

  • 一个 DNS 查询可能被发给了 AdGuard Home,广告被成功拦截。
  • 下一个 DNS 查询可能被发给了 OpenClash,它根据规则进行了代理,但因为没经过 AdGuard Home,所以广告没被拦截。

这样的结果就是 DNS 解析行为变得不可预测,你会发现时而能去广告,时而不能;时而能科学上网,时而不能。这显然不是我们想要的效果。

3.1 构建 DNS 处理链

解决这个冲突的正确思路不是让它们 “ 并列竞争 “,而是让它们 “ 串联协作 “,形成一个清晰的 DNS 处理链条。

推荐的流程是: 设备 -> AdGuard Home (去广告) -> OpenClash (分流) -> 最终上游 DNS

  • 取消 openclash 接管
  • dns2
  • dns3
  • 修改 AdGuard Home 上游 dns
dns1
  • 设置 DNS 转发 127.0.0.1#5353
  • dns4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
root@ImmortalWrt:~# cat /etc/config/dhcp

config dnsmasq
option domainneeded '1'
option localise_queries '1'
option rebind_protection '1'
option rebind_localhost '1'
option local '/lan/'
option domain 'lan'
option expandhosts '1'
option min_cache_ttl '3600'
option use_stale_cache '3600'
option cachesize '0'
option nonegcache '1'
option authoritative '1'
option readethers '1'
option leasefile '/tmp/dhcp.leases'
option localservice '1'
option dns_redirect '1'
option ednspacket_max '1232'
option localuse '1'
option port '53'
option resolvfile '/tmp/resolv.conf.d/resolv.conf.auto'
list server '127.0.0.1#5353'


/etc/init.d/dnsmasq restart

4. 参考资料