AdGuard Home 家庭 DNS 广告拦截实战:Pi-hole 选型、加密上游 DNS、黑名单取舍与防止全家断网全流程

家里的电脑、手机、电视盒子上,弹窗广告和开屏广告越来越猖狂,装浏览器插件只能管住浏览器,App 里的广告一个都拦不住。真正一劳永逸的办法是在网络出口做 DNS 层过滤——所有设备连上你家 Wi-Fi,广告域名在解析阶段就被拦掉,安卓电视、智能音箱、手机 App 统统生效,而且不用在每台设备上装任何东西。这篇文章讲清楚 Pi-hole 和 AdGuard Home 的选型、部署、上游加密 DNS 配置、防「单点故障把全家网断掉」的关键设置,以及六个必踩的坑。

一、DNS 拦截的原理:为什么能拦住 App 广告

设备要访问任何网络服务,第一步都是把一个域名解析成 IP 地址,这一步就是 DNS 查询。广告拦截器做的事很朴素:维护一份「广告、追踪、统计域名」的黑名单,当设备来查询黑名单里的域名时,不返回真实 IP,而是返回一个空地址或本机地址,广告自然加载不出来。

这套方案的三个优势非常实在:

  • 全设备生效:只要设备用了你的 DNS,安卓电视、手机 App 里的广告一起拦,不依赖任何客户端插件。
  • 全局可视:控制台里能看到家里每台设备在查询什么域名,哪些设备在偷偷上报数据一目了然。
  • 零客户端维护:不用在十几台设备上装插件、不用跟着浏览器更新改配置。

注意它的边界:广告和内容从同一域名加载时拦不掉(比如视频平台的贴片广告和正片常常同一个 CDN 域名),DNS 层拦截擅长的是第三方广告联盟和追踪脚本,对这类混在一块的广告无能为力。

二、Pi-hole 还是 AdGuard Home

这两个是最主流的两个选择,能力重叠但性格不同:

  • Pi-hole:老牌项目,社区和现成的黑名单订阅非常多,底层是一个 dnsmasq 加一个 Web 管理面板。它的哲学是「只做 DNS 过滤」,功能纯粹,折腾起来偏命令行。
  • AdGuard Home:单个二进制、自带完整 Web 界面,原生支持 DNS over HTTPS / DNS over TLS 上游,按客户端区分过滤规则、查询日志和统计都在面板里做得更细。

选择建议很直接:如果你想要「开箱即用、界面好看、还要加密上游 DNS」,选 AdGuard Home;如果你已经有 dnsmasq 生态的经验、想接大量现成的 Pi-hole 黑名单订阅,选 Pi-hole。两者都支持自建上游、都支持自定义黑名单、都能跑在 Docker 里,本文以更省心的 AdGuard Home 为主线,Pi-hole 的差异会单独标注。

三、部署:一个容器搞定

先讲解一个最容易翻车的点:DNS 服务必须用 53 端口,而宿主机上很可能已经有一个东西占着 53——systemd-resolved。不处理它,容器会报「address already in use」起不来。

先把宿主机的 53 端口腾出来:

sudo systemctl disable --now systemd-resolved
sudo rm -f /etc/resolv.conf
echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf

注意上面这步做完,宿主机的 DNS 会临时指向 1.1.1.1,等 AdGuard 跑起来后再把它改回 127.0.0.1。这就是很多教程没讲清楚的地方——顺序错了会把自己搞到没网。

然后用 Docker Compose 起 AdGuard Home:

services:
  adguardhome:
    image: adguard/adguardhome:latest
    container_name: adguardhome
    restart: unless-stopped
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "3000:3000/tcp"
    volumes:
      - /opt/adguard/work:/opt/adguardhome/work
      - /opt/adguard/conf:/opt/adguardhome/conf
docker compose up -d

首次访问 http://服务器IP:3000 走初始化向导:管理界面监听端口建议改成 80 或别的端口(3000 只是初始向导用的),管理员账号密码自己设一个强的。

Pi-hole 的对应部署是官方脚本一行搞定(curl -sSL https://install.pi-hole.net | bash),或者用 pihole/pihole 镜像,思路一样,都是要先把宿主机的 systemd-resolved 让开。

四、配好上游加密 DNS 与分流

这是 AdGuard Home 相比 Pi-hole 最大的优势:上游服务器可以直接填 DoH / DoT 地址,让你的 DNS 查询也是加密的,ISP 看不到你查了什么。在「设置 → DNS 设置 → 上游 DNS 服务器」里填:

https://dns.cloudflare.com/dns-query
https://dns.google/dns-query
tls://dns.quad9.net

下面有个「并行请求」和「负载均衡」的选项:

  • 并行请求(Parallel queries):同时问所有上游,谁先回用谁,响应最快但查询量翻倍。
  • 负载均衡(Load balancing):轮流用不同上游,查询量平均分摊。

家里用推荐选「并行请求」,快就是硬道理。另外「Bootstrap DNS 服务器」必须填,它是用来解析上游 DoH 域名的明文 DNS,填 1.1.1.1 和 8.8.8.8 即可。

分流功能也很实用:「上游 DNS 服务器」区域可以按域名指定不同的上游,比如国内域名走阿里/腾讯 DNS 保证解析速度,国外域名走出海的 DoH 保证准确,这在 AdGuard Home 里配置起来比 Pi-hole 直观得多。

五、黑名单怎么选:宁少勿多

AdGuard Home 自带「过滤器 → DNS 黑名单」,内置了一批规则列表可以一键勾选,也可以自己加订阅 URL。常见的组合:

  • AdGuard DNS filter:官方维护,误杀率低,作为基础盘。
  • OISD:社区评价很高的通用拦截列表,平衡做得好。
  • 国内广告规则:针对中文 App 和网站的广告域名列表。

关键原则是「宁少勿多」:黑名单不是越大越好,规则越激进,误杀的网站和 App 功能越多。曾经有人一口气订阅了几十万条规则,结果家里的智能家居 App 连不上服务器、微信图片加载不出来,最后排查了半天才发现是 DNS 拦截干的。正确做法是从最小的规则集开始,遇到广告再针对性加,而不是一上来就全勾。

六、防「DNS 挂了全家断网」:最关键的一步

DNS 过滤是典型的单点故障——一旦这台服务挂掉,家里所有设备的网络解析都会失败,表现为「Wi-Fi 连着但什么都打不开」。有三层防护必须做:

1. 客户端配置双 DNS,但顺序有讲究

路由器 DHCP 下发的 DNS 里,把 AdGuard 设为主 DNS,再配一个 1.1.1.1 做备用。注意:客户端默认只会在主 DNS 超时后才用备用,所以备用 DNS 既能兜底,又不会削弱过滤效果。

2. 只对 DHCP 下发的设备设 DNS,路由器自己走运营商 DNS

如果你在路由器上把上游 DNS 直接改成 AdGuard,那么一旦 AdGuard 挂掉,路由器自己都解析不了域名,你连管理后台和 SSH 都进不去——这是最要命的场景。稳妥做法是路由器保持运营商 DNS,只靠 DHCP 把 AdGuard 推给客户端;同时给 AdGuard 所在的那台机器配一个固定的备用 DNS。

3. 加一层看门狗

用 systemd 或一个简单的 cron 每分钟探测一次 DNS 是否正常,异常就重启容器;或者干脆让 AdGuard 跑在一台平时不太动的机器上,减少被折腾坏的概率。

七、验证拦截是否真的生效

配完不要只看面板上的统计数字就以为成了,用两个命令实测一下最可靠。先在服务器上直接查一个广告域名:

dig @127.0.0.1 doubleclick.net +short
dig @127.0.0.1 ads.google.com +short

如果返回 0.0.0.0 或者你配置的拦截 IP,说明拦截生效了;如果还返回真实的公网 IP,说明黑名单没匹配上,去面板里查这个域名是否命中规则。再查一个正常域名(比如 baidu.com)确认解析没被误伤。

还可以在客户端侧验证:在手机或电脑上执行 nslookup ad.doubleclick.net,看解析结果是不是被改写了。只有客户端侧也返回拦截地址,才说明 DHCP 下发的 DNS 配置真正生效——很多时候服务器上配好了,但客户端还缓存着旧的 DNS 或者根本没拿到新配置,重启一下网络或者等 DHCP 租约续期即可。

八、六个必踩的坑

  • systemd-resolved 占着 53 端口:Deploy 前必须先禁用,或把 systemd-resolved 的 DNSStubListener 关掉,只让它监听 127.0.0.53。
  • 没给自己的设备配固定备用 DNS:AdGuard 一挂,你自己的 SSH 和 Web 后台都进不去,只能物理接触机器。
  • 黑名单订阅太多太激进:误杀 App 和网站功能,症状是「网络时好时坏」,排查成本极高。
  • 53 端口只开了 TCP 没开 UDP:绝大多数 DNS 查询走 UDP,只开 TCP 会表现为「能查但极慢」。UDP 和 TCP 都要放。
  • 把管理面板 3000 端口暴露到公网:控制台里有你全家的浏览记录,必须只在内网访问,外网要过 VPN。
  • 忘了配 Bootstrap DNS:DoH 上游解析不了,表现为所有查询都超时,服务看起来是「坏的」。

八、小结

用 AdGuard Home 或 Pi-hole 做 DNS 层广告拦截,是自建服务里「投入产出比」最高的一个:一台低配机器、一个容器、一次配置,全家所有设备从此告别大部分弹窗和追踪,安卓电视和手机 App 也能享受到。真正的门槛不在部署,而在两件事——先把宿主机 53 端口让出来,再给自己的设备留好备用 DNS。把这两件事做对,你就得到了一个安静、干净、还能随时看到谁在上报数据的家庭网络。下次再有人抱怨手机 App 里的广告关不掉,你就可以告诉他:装插件没用,得从 DNS 下手。

Last modification:October 13th, 2026 at 07:24 pm

Leave a Comment