如何利用 OpenWrt 旁路由和 AdGuard Home 实现全屋去广告

2025年11月11日 | Ruichen Zhou
OpenWrtAdGuard Home去广告DNS旁路由网络

如何利用 OpenWrt 旁路由和 AdGuard Home 实现全屋去广告

这篇文章记录的是我在宿舍网络中,利用一台没有开启 DHCP 的 OpenWrt 设备(作为旁路由 / 交换机),在上面部署 AdGuard Home,并通过手动设置终端 DNS 来实现“全屋去广告”的过程。

这里的“全屋”并不通过强制接管路由或 DHCP 实现,而是依靠:

  • OpenWrt 设备提供一个 统一的 DNS 过滤入口
  • 各终端(电脑、手机)显式地把 DNS 指向这台 OpenWrt

这种方式比较温和,不会干扰原有主路由的行为,也适合合租、宿舍等场景。


一、网络环境与目标

一、网络环境与目标

1.1 设备与拓扑

设备清单(与系列其他文章保持一致):

  • 上游网络:Selfnet(德国学生宿舍网),负责分配 IP、做 NAT、提供上网出口
  • 主路由器:红米 AX6(刷了 AE86Wrt 固件),当前工作模式:
    • 不做 NAT,不做 DHCP
    • LAN 与上游处于同一网段,更像一台 交换机 + 无线 AP
  • MacBook Air:便携开发设备,在宿舍和工位之间通勤
  • Windows 电脑:长期位于德国学生宿舍
  • Linux 工作站:位于中国大陆,Linuxmint 系统(本文不涉及)
  • 其他终端:手机等移动设备,需要去广告

路由器在局域网中的地址是:

  • IPv4:192.168.7.2(我自己设定的管理/别名地址)
  • IPv6:有一个本地链路地址,比如 fe80::6664:4aff:fe99:f1e9(实际以系统显示为准)

1.2 目标

在不改变上游网络的前提下,实现:

  1. 所有 愿意去广告的设备,只需要:

    • 把 DNS 指向 192.168.7.2(IPv4)
    • 把 IPv6 DNS 指向路由器的 fe80::...(本地链路地址)
  2. OpenWrt 上运行的 AdGuard Home 负责:

    • 过滤广告域名;
    • 拦截恶意重定向、欺诈站点;
    • 把”干净的” DNS 结果再转发给上游或公共解析器。

这意味着:

  • 不需要在路由器上开启 DHCP;
  • 不需要把路由器做成默认网关;
  • 不会影响不想去广告的其它设备(它们可以继续用”自动获取 DNS”)。

二、整体思路:旁路由只做 DNS 过滤

很多”全屋去广告”的教程会让 OpenWrt 路由器变成:

  • 局域网的默认网关;
  • DHCP 服务器;
  • 同时还承担去广告、代理等角色。

在合租/宿舍场景,这种做法有两个问题:

  1. 需要改动原有网络拓扑(把自己设备变成”主路由”),对其它人有影响;
  2. 一旦自己的路由器出问题,整间宿舍的网都不稳定。

我这次采用的是另一种思路:

  • 路由器不改动路由结构,只负责 DNS 过滤
  • 哪些设备要去广告,就在这些设备上显式把 DNS 指向路由器;
  • 不需要动 DHCP,也不需要劫持 53 端口。

核心流程可以简化为:

终端 → 把 DNS 请求发给路由器(AdGuard Home) → AdGuard Home 过滤 → 转发给上游 DNS → 返回结果


三、步骤一:在 OpenWrt 上安装并配置 AdGuard Home

这一节只写关键点,不覆盖所有 OpenWrt 细节。你可以通过 opkg 或手动下载二进制方式安装 AdGuard Home,安装完成后,确保它能:

  • 监听 LAN 接口的 53 端口(UDP/TCP);
  • 提供一个 Web 管理页面(默认在 3000 或 80/3000 端口,视安装方式而定)。

如果系统中仍然运行着 dnsmasq,并且占用 53 端口,需要避免端口冲突。常见做法有:

  • 把 dnsmasq 的 DNS 功能关掉,只保留 DHCP(如果你在用);
  • 或把 dnsmasq 的监听端口改为 5353,再让 AdGuard Home 把 127.0.0.1:5353 作为上游。

3.1 选择上游 DNS

在 AdGuard Home 的“设置 → DNS 设置”中,指定你的上游 DNS。例如:

  • 直接用公共 DNS:

    • https://dns.google/dns-query
    • https://1.1.1.1/dns-query
  • 或者用运营商提供的 DNS 地址;

根据需求选择是否启用 DoH(DNS-over-HTTPS)。如果只是宿舍普通使用,普通 UDP/TCP DNS 也足够。

3.2 配置过滤规则(黑名单)

广告拦截的效果,主要取决于使用的规则列表。我最终启用的几类规则是:

  • AdGuard Simplified Domain Names AdGuard 官方的核心规则,覆盖常见国际广告域名。
  • AdAway 经典的移动端广告拦截规则,对手机端效果比较明显。
  • MalwareDomainList.com Hosts 安全向规则,用于拦截已知恶意软件域名、钓鱼站点。
  • anti-AD / Adblock / neoHosts / YouTube 等中文聚合列表 这一类列表对中文网站上的弹窗、恶意跳转广告效果较好,重点处理“莫名其妙被重定向到直播间”这类问题。

在 AdGuard Home 的“过滤器 → DNS 黑名单”页面中,可以把这些规则列表的 URL 加进去。配置完成大致效果如下:

AdGuard Home 的 DNS 黑名单配置示意


四、步骤二:手动设置终端 DNS(关键)

在这个方案里,最关键的不是路由器配置,而是终端是否真的在使用这台 DNS 服务器。如果终端继续用”自动获取”,请求会直接发给上游(Selfnet),AdGuard Home 完全不会被经过。

4.1 Windows 11:手动设置 IPv4 / IPv6 DNS

路径(Windows 11):

  1. 设置 → “网络和 Internet”;
  2. 选择当前使用的网络(例如”以太网”或 Wi-Fi);
  3. 点击”硬件属性”或”DNS 服务器分配”;
  4. 将”DNS 服务器分配”从”自动 (DHCP)“改为”手动”。

在”手动”模式下,启用 IPv4 和 IPv6,并填入:

  • IPv4 DNS 服务器192.168.7.2 对应 OpenWrt 路由器的 IPv4 地址。
  • IPv6 DNS 服务器fe80::6664:4aff:fe99:f1e9 示例为路由器的 IPv6 本地链路地址(实际值请以你自己的网卡信息为准)。

为什么要填 IPv6 DNS? 如果你的网络环境有原生 IPv6,系统很可能会优先使用 IPv6 DNS。 只设置 IPv4 DNS 的话,部分请求可能直接走上游的 IPv6 DNS,从而绕开 AdGuard Home。

设置完成后,界面类似这样:

Windows 11 手动设置 DNS 示例

配置完成后,可以在 PowerShell 中检查一下:

Get-DnsClientServerAddress -InterfaceAlias "以太网"

确认 IPv4/IPv6 的 DNS 地址都指向了设备 B。

4.2 手机:手动设置 DNS

不同系统略有差异,这里只说通用思路。

大致步骤:

  1. 连接到宿舍的 Wi-Fi;

  2. 打开该 Wi-Fi 的“详细信息”或“高级设置”;

  3. 找到 IP 设置 / DNS 设置

  4. 把“自动”改成“静态 / 手动”;

  5. 在 DNS 1(及 DNS 2)中填入:

    • 192.168.7.2(IPv4);
    • 有的系统支持单独填 IPv6 DNS,可以填设备 B 的 fe80::...

如果你不确定手机是否在用这台 DNS,可以在 AdGuard Home 的“查询日志”里观察:当你在手机上打开网页时,日志中应出现该手机 IP 发出的请求。


五、步骤三:验证效果与日常使用

5.1 在 AdGuard Home 后台查看查询日志

在浏览器访问 AdGuard Home 的管理地址(例如 http://192.168.7.2:3000/,以实际配置为准),打开“查询日志”页面。

如果配置成功,你应该能看到:

  • 来自电脑/手机 IP(如 192.168.7.x)的 DNS 查询;
  • 部分请求被标记为“已拦截”;
  • 拦截的域名包括一些典型广告域名(如 googleads.g.doubleclick.net)、统计域名,以及你规则列表中已有的恶意域名。

此时,再打开之前广告比较多的网站,对比一下体验差异,一般会比较明显。

5.2 故障时的回退方式

这种方案的一个优点是“回退成本低”:

  • 如果 AdGuard Home / OpenWrt 出问题,只要在终端把 DNS 恢复为“自动获取”即可;
  • 不会影响整个宿舍/家里的其它人,不需要重启主路由。

六、常见错误、现象与排查思路

这里列几个我踩过或者容易踩的坑。

6.1 DNS 没走到 AdGuard Home

现象:

  • AdGuard Home 查询日志几乎没有记录;
  • 去广告效果和改 DNS 之前没区别。

排查:

  1. 在终端上执行:

    nslookup example.com

    看看显示的“服务器”地址是不是 192.168.7.2(或对应 IPv6);

  2. 在 AdGuard Home 日志中,搜索某个你刚查过的域名;

  3. 如果终端显示 DNS 服务器不是 B,说明终端设置没生效; 如果终端显示的是 B,但日志没有记录,说明 B 上的防火墙/监听地址可能有问题。

6.2 53 端口冲突(dnsmasq 和 AdGuard Home 都想占用)

现象:

  • AdGuard Home 后台显示 DNS 监听失败;
  • netstat -lnp | grep :53 显示端口已被 dnsmasq 占用。

解决:

  • 如果你不再用路由器发布 DHCP/DNS,可以在 /etc/config/dhcp 中关闭 dnsmasq 的 DNS 功能,或者直接停掉服务:

    /etc/init.d/dnsmasq stop
    /etc/init.d/dnsmasq disable
  • 如果仍需保留 DHCP,可以让 dnsmasq 只监听 127.0.0.1:5353,然后在 AdGuard Home 中把 127.0.0.1:5353 作为上游 DNS。

6.3 只配置 IPv4 DNS,IPv6 直接绕过

现象:

  • 部分网站广告明显减少,但又有一些“怎么也拦不住”;
  • 在 IPv6 测试网站上可以看到自己有完整 IPv6 连接。

原因:

  • 系统在访问支持 IPv6 的站点时,优先用 IPv6 DNS 解析;
  • IPv6 DNS 仍然是自动从上游拿到的,绕过了 AdGuard Home。

排查与修正:

  • 在终端网络设置中同时填入 IPv6 DNS(设备 B 的 fe80::...);
  • 或者在系统层面关闭 IPv6(不推荐,除非你明确不需要 IPv6)。

6.4 使用 VPN / 安全软件篡改 DNS

现象:

  • 明明之前去广告正常,打开某个 VPN 或安全软件后又恢复成“广告满天飞”;
  • AdGuard Home 查询日志中几乎没有新请求。

原因:

  • 某些 VPN / 安全软件会把 DNS 强制改为自己的服务器;
  • 或者直接把 DNS 查询封装进 VPN 通道。

排查与应对:

  • 关闭 VPN / 安全软件后再测试;
  • 查看该软件的 DNS 设置,有些支持自定义 DNS 或“遵循系统设置”。

七、总结与反思:为什么最后选择“旁路由 + 手动 DNS”

相比“把 OpenWrt 变成主路由 + 跑一堆服务”的方案,这次的做法刻意保持了简单:

  1. 不触碰上游网络的“核心职责”

    • 上游(运营商/校园网)负责 IP 分配、NAT、IPv6;
    • 我自己的设备只做一件事:过滤 DNS

    这减少了很多不必要的复杂度,也避免对其它宿舍成员造成影响。

  2. 把“控制权”交给终端,而不是强行改全局

    • 谁愿意去广告,就在自己的电脑/手机上改 DNS;
    • 谁不愿意,就继续用自动获取,不会被强制过滤。

    这比在路由器上全局劫持 DNS 要更温和,也更容易沟通。

  3. 用可控的复杂度换取足够的效果

    对于我的使用场景来说,这套方案已经:

    • 明显减少了网页和 App 中的广告;
    • 拦掉了一部分恶意重定向;
    • 保持了 IPv6 不受影响。

    再往上堆功能(例如全局代理、复杂分流),收益就不再那么明显,出问题时排查成本会显著增加。

  4. 故障回退很简单

    • 任何时候,只要把终端 DNS 改回“自动”,就能绕过这整套配置;
    • 路由器挂掉或 AdGuard Home 崩溃,不会把整个网络“拉闸”。
  5. 先把这一条链路打磨顺,再考虑后续优化

    这篇文章只解决了“旁路由 + AdGuard Home + 手动 DNS”的基本链路。 后面如果要进一步优化(比如在 AdGuard Home 上做 per-client 统计、为不同设备启用不同过滤规则),可以在这个基础上迭代,而不需要再去动网络拓扑。

对我来说,这是一个在“折腾”和“可维护性”之间做出的折中:不是最“极客”的方案,但足够清晰、足够稳定,也更符合自己长期维护的能力。