自建私有 DNS 实战:AdGuard Home 统一拦截广告与跟踪


大部分人把 DNS 当成"运营商或路由器给的、装好网络就用"的黑盒,很少想到它能被你自定义。但当你开始关心三件事——"某个域名到底被解析到了谁的 IP"、家里/自己所有设备的浏览隐私、以及"烦人的广告/跟踪域名能不能直接拦掉"——就该考虑自建一个私有 DNS 了。以 AdGuard Home 为代表的私有 DNS/过滤服务,能让你在局域网(甚至跨设备)用它解析域名,同时按你的规则拦截广告和跟踪域名,还能看透明的查询日志。这篇讲清它解决的三个核心问题、怎么自托管起来、上游 DNS 与过滤规则怎么配,以及"私有 DNS 的边界"在哪里。

一、自建私有 DNS 到底解决什么:隐私、过滤、与"看见"

自建 DNS 之所以值得,是因为默认 DNS 的状态你可能不想要。第一个是隐私与可信:你的设备每访问一个网站都要先问 DNS"这个域名对应哪个 IP",如果你用运营商的公共 DNS,这个"你访问了哪些域名"的清单对它们就是透明的;自建后这份查询日志归你自己,还能用 DoH/DoT 之类加密 DNS 保护查询在传输中不被窥探。第二个是过滤:把广告、跟踪、恶意域名通过规则直接解析成空,几乎所有设备就统一生效,不必逐台装过滤插件。第三个是"看见":你终于能看清"到底哪些域名在被解析",对排查某个 app 在偷偷连什么特别有用。

把这一点定准:私有 DNS 不是用来"替代正规权威 DNS"的,而是给"你自己这一侧"加一个"想缓存、想过滤、想记录"的控制层。它适合的对象是"你用自有设备、想统一拦截广告/跟踪、想把 DNS 查询握在自己手里"的人;如果家里和 VPS 规模都很小、也不太在意这些,那默认 DNS 也过得去。

二、最小自托管:AdGuard Home 在两个典型位置的部署

部署 AdGuard Home 最常见的两个位置是:局域网网关(给家里所有设备统一生效)和 VPS(给自己 VPS 上、或通过 VPN/隧道让外部设备用它)。两种都极其简单,官方提供 Docker 镜像。给一个"在 Linux/VPS 上自托管"的最小示例:

# 用 Docker 起 AdGuard Home,映射 53 端口(DNS)和 80(Web 管理)
docker run -d --name adguardhome --restart unless-stopped \
  -p 53:53/tcp -p 53:53/udp -p 80:80 \
  -v /srv/adguard/work:/opt/adguardhome/work \
  -v /srv/adguard/conf:/opt/adguardhome/conf \
  adguard/adguardhome:latest

# 首次通过 http://服务器IP:80 进入配置向导,设定管理面板与监听地址

起完在向导里填好你要监听的接口和"上游 DNS",把局域网里设备的 DNS 指到这台机器(或用 DHCP 下发),它们的所有查询就都经过它了。文档里 `-p 53:53` 尤其要注意:53 是被系统保留的 DNS 端口,占用时要确保系统自带的 dnsmasq/systemd-resolved 没抢先占端口,否则容器起不来——这是新手最常卡的地方。如果不想动 53,也可以让 AdGuard 只监听自定义高端口、由系统配置把 systemd-resolved 之类替掉。

三、上游 DNS 与过滤规则:怎么看"该问谁"和"拦哪些"

AdGuard Home 的配置里,最值得花心思的两块是"上游 DNS"和"过滤规则"。上游就是你用它转发真实查询的那些 DNS(多个可以并列 + 并行);为了隐私与防劫持,建议选支持加密的公共 DNS(DoH/DoT),也可以用自己的规则指定"哪些域名走哪个上游"。过滤规则则决定了"哪些域名要被处理掉"——AdGuard 自带一套默认的广告/跟踪/恶意域名列表,你也可以订阅其他规则清单或手写 `||某域名^` 这类语法。

# 过滤器规则语法示意(AdGuard/Adblock 风格)
||ads.example.com^        # 拦截这个域名
||tracker.example.com^    # 拦截跟踪域名
||malicious.example.com^  # 拦截这个已知恶意域名

要建立两个习惯。一是"上游别迷信单一默认":列两三个可信任的上游做备份,其中一个挂了仍能解析。二是"过滤别一刀切":家里网络被误拦某合法域名(尤其是一些内网 *.local 或某些服务的探测域名)会很烦,所以 AdGuard 里有"白名单/允许清单"以及按客户端规则,用来"对某些设备不过滤"或"放行某些域名"——设置白名单永远比改规则来得快。

四、安全的一层:DoH/DoT 与该加密的部分

既然把 DNS 握到自己手上是为了隐私,那么"从你的设备到你的 DNS 之间"的这段也要加密,否则查询虽到了你这、中途仍可能被偷看或篡改。AdGuard Home 支持作为 DoH/DoT(DNS over HTTPS/TLS)的服务端:客户端通过 HTTPS/TLS 接口来查询,而非裸的 53 UDP。配置时给它一个域名 + 证书(正好可以用前面聊过的 Caddy 自动证书那套),就能把"设备 → 你的 DNS"这段加密。

# 概念:AdGuard 可开启 DoT 服务并配证书,客户端用 dns.adguard.example.com 这类地址访问
# 设备端在系统/网络设置里填加密 DNS 地址(如 dns://... 或 tls://dns.example.com)

要明确它的边界:加密保护的是"你的设备到你 DNS 这一段";一旦查询继续上行到公共上游、再到权威域名服务器,那段通常仍是非加密的。所以自建 DNS 提升的是"这一段"的隐私,而不是"整条链路全程加密"——别混淆。真正落实到"查询全程解密不了"往往要靠更复杂的方案,多数自托管用户想要的"我自己侧这支可控、可过滤、加密到自己这",这里已经做到。

五、自托管私有 DNS 的边界:别高估它、也别随意打开公网

最后有两句提醒。第一,别把它当"能拦一切"的万能;它主要拦"已知的、在规则列表里的域名",对"新生成的、没进规则库的广告/恶意域名"力不从心,所以还要和防火墙、杀毒、良好习惯一起用,而不是全靠过滤。第二,别把没加访问控制的 DNS 直接暴露到公网——开放中继式的公共 DNS 会被别人滥用当跳板(也消耗你带宽与日志),AdGuard Home 有"允许列表"可以限定哪些客户端能来查询;想让外部设备安全用,优先走前面聊过的 VPN/隧道而不是把它裸开。

# 出于安全:对"谁能查询"做限制(界面里的 Allowlist / 客户端设置),
# 并且公网访问走反代 + 认证、或走私网/VPN,而不是裸暴露 53。

综上,私有 DNS 是一个"小而美"的自托管加分项:它把"查询日志在自己手里、广告/跟踪能统一拦、缓存效率提升"这一层加到了你的网络入口。但它不是安全银弹、也不是全链加密,是否值得切入取决于你对"DNS 查询是否握在自己手里"的在意程度。

结语

自建私有 DNS(以 AdGuard Home 为代表)的价值,是把"默认 DNS 的不可见、不可控"变成"你自己的可解析、可过滤、可记录、可加密的一段"。落地三点:在局域网网关或 VPS 用 Docker 起起来、认清 53 端口之争;配好可信的上游与过滤规则,用白名单保住被误拦的合法域名;需要时开 DoH/DoT 把"设备到你这段"加密。同时记得它的边界——过滤不万能、别裸开放公网。当那些"烦人广告 + 偷偷联网 + 说不清谁在被解析"的小问题聚集成明显困扰时,自建私有 DNS 就是那个用不太费事的方式,把"这一层的解析与过滤"还给你自己的清爽答案。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

OpenTelemetry 分布式追踪实战:看清请求到底慢在哪一层

ZFS 存储实战:数据完整性校验、快照与冗余的正确用法

评 论
更换验证码