基于 OpenWrt、dnsmasq 与 AdGuard Home 的家庭内网 DNS 实战方案
家庭内网 DNS 很容易被低估:一开始只是想让 nas、git、router 这些名字能访问,后来开始有公网 IP、反向代理、HTTPS、Docker、虚拟机、NAS、监控、Git、Jenkins、对象存储,DNS 就会从“小功能”变成“所有服务的入口”。
这篇文章给出一套适合家庭/小型 Homelab 的实战方案:OpenWrt 负责路由、防火墙和 DHCP;dnsmasq 负责 DHCP 租约和本地主机名;AdGuard Home 作为全网 DNS 入口,负责过滤、统计、内网域名重写和上游 DNS 转发。
目标不是把家庭网络做成运营商机房,而是做成“稳定、清晰、可排障、后续能升级”的内网 DNS 体系。DNS 架构最怕职责混乱,混乱之后排障就像在黑屋子里找网线,摸到什么都像答案。
1. 适用场景
本文方案适合下面这种网络:
- 家里或小型工作室使用 OpenWrt 做主路由;
- 内网设备不算特别多,一般几十台以内;
- 有 NAS、服务器、Docker、虚拟机、开发环境;
- 希望内网访问服务时使用域名,而不是记 IP;
- 希望全网广告过滤、恶意域名拦截、DNS 查询统计;
- 有公网 IP,部分内网服务需要对外提供访问;
- 暂时不想上 BIND9 / PowerDNS / Kea 这种更重的 DNS/DHCP 体系。
如果你的内网规模已经很大,例如有多个办公区域、大量 VLAN、上百条 DNS 记录、需要正式主从权威 DNS、需要 DDNS 自动注册 PTR/A 记录,那么可以考虑 BIND9、PowerDNS 或 Kea。对于普通家庭内网来说,OpenWrt + dnsmasq + AdGuard Home 已经足够好用。
2. 总体架构
推荐架构如下:
1 | |
更具体一点,可以这样规划:
1 | |
如果你只有一个网段,也可以简化成:
1 | |
3. 组件职责划分
3.1 OpenWrt:网络入口
OpenWrt 负责:
- WAN 拨号或公网 IP 接入;
- LAN/VLAN 管理;
- 防火墙;
- NAT;
- 端口转发;
- DHCP 服务;
- DHCP Option 下发 DNS 服务器地址。
OpenWrt 默认通过 dnsmasq 和 odhcpd 提供 DNS、DHCP、DHCPv6 等能力。这里我们保留 dnsmasq 的 DHCP 能力,但把“全网 DNS 查询入口”交给 AdGuard Home。
3.2 dnsmasq:DHCP 与本地主机名
dnsmasq 是轻量级 DNS/DHCP/TFTP/PXE 工具,适合小型网络、路由器、防火墙和虚拟化网络。本文中 dnsmasq 主要负责:
- DHCP 地址池;
- 静态租约;
- 客户端主机名;
- 本地域名
home.arpa的基础解析; - 给 AdGuard Home 提供私有反向解析来源。
不建议把复杂内网 DNS 全部塞进 dnsmasq。简单主机名可以放 dnsmasq,服务域名和公网域名内外网分流更适合放 AdGuard Home DNS Rewrite。
3.3 AdGuard Home:全网 DNS 入口
AdGuard Home 负责:
- 全网 DNS 查询入口;
- 广告过滤;
- 恶意域名拦截;
- DNS 查询日志;
- 客户端统计;
- DNS Rewrite;
- 指定域名转发到本地 dnsmasq;
- 公网 DNS 通过 DoH/DoT 转发到上游。
3.4 反向代理:公网服务入口
如果你有公网 IP,并且内网服务要对外暴露,强烈建议增加反向代理层,例如 Caddy 或 Nginx Proxy Manager。
公网只开放:
1 | |
不要把 PostgreSQL、Redis、Jenkins、NAS 管理端、Docker API 等端口直接暴露到公网。那不是自建服务,那是给扫描器开自助餐。
4. 域名设计
家庭内网建议分两套域名。
4.1 内网基础设施域名:home.arpa
推荐使用:
1 | |
示例:
1 | |
home.arpa 是 RFC 8375 指定给家庭网络使用的特殊域名。它的语义比随便造一个 .lan、.home、.internal 更规范。
不建议使用:
1 | |
.local 是 mDNS 使用的特殊域名,macOS、iOS、Linux Avahi、部分智能设备会把它当作多播 DNS 处理。你拿它做普通 DNS,后面非常容易出现“有的设备能解析,有的设备不能解析”的玄学问题。
4.2 对外服务域名:真实公网域名
如果你有自己的公网域名,例如:
1 | |
建议对外服务使用:
1 | |
公网 DNS 中配置:
1 | |
或者逐条配置:
1 | |
内网 AdGuard Home 中配置 DNS Rewrite:
1 | |
192.168.7.10 是反向代理地址。
这样访问路径就会变成:
1 | |
这就是 Split DNS,也叫内外网分流解析。它比依赖 NAT Loopback / Hairpin NAT 更清楚。
5. 推荐部署方式
有两种常见方式。
5.1 方式一:AdGuard Home 直接跑在 OpenWrt 上
适合:
- x86 OpenWrt;
- 路由器 CPU/内存足够;
- 不想单独开一台服务器;
- 内网设备不多。
架构:
1 | |
这种方式需要解决端口冲突:OpenWrt 默认 dnsmasq 监听 53,AdGuard Home 也需要监听 53。
做法是把 dnsmasq 改到 5353,让 AdGuard Home 监听 53:
1 | |
然后 AdGuard Home 上游里配置:
1 | |
私有反向 DNS 服务器配置:
1 | |
优点:简单。
缺点:OpenWrt 负载变大,路由器挂了 DNS 也一起挂。
如果你的 OpenWrt 不是 x86,而是普通家用路由器,我更推荐下一种方式。
5.2 方式二:AdGuard Home 跑在内网服务器上
这是更推荐的方式。
架构:
1 | |
示例:
1 | |
OpenWrt 上 dnsmasq 保持默认 53 端口,继续负责 DHCP 和本地主机名。AdGuard Home 跑在 NAS、虚拟机、小主机或 Docker 中。
优点:
- OpenWrt 负载低;
- AdGuard 日志、统计、过滤更稳定;
- Docker 迁移方便;
- 后续可以部署第二个 AdGuard Home 做备用。
缺点:
- AdGuard 服务器挂了,全网 DNS 受影响;
- 最好准备第二个 DNS 或备用方案。
本文后续以“AdGuard Home 跑在内网服务器上”为主进行实战说明。
6. 实战环境假设
本文使用下面的示例环境:
1 | |
你可以按自己的网络替换这些 IP 和域名。
7. 第一步:给 AdGuard Home 固定 IP
AdGuard Home 必须使用固定 IP。否则 DHCP 租约变动后,全网 DNS 会直接失效。
可以在 OpenWrt LuCI 中操作:
1 | |
设置:
1 | |
也可以通过 UCI 配置:
1 | |
注意替换 MAC 地址。
8. 第二步:配置 OpenWrt dnsmasq 本地域名
建议把 OpenWrt 的本地域名设置为:
1 | |
LuCI 路径:
1 | |
建议配置:
1 | |
UCI 示例:
1 | |
这样 dnsmasq 可以把 DHCP 静态租约里的主机名解析成:
1 | |
如果你有多个网段,可以分别设置 DHCP 地址池和静态租约。核心思想不变:dnsmasq 管“设备拿什么 IP”,AdGuard Home 管“客户端 DNS 查询从哪里进来”。
9. 第三步:让 DHCP 下发 AdGuard Home 作为 DNS
让所有客户端通过 DHCP 拿到 AdGuard Home 作为 DNS 服务器。
LuCI 路径:
1 | |
填入:
1 | |
6 是 DHCP Option 6,表示 DNS Server。
UCI 示例:
1 | |
如果你的接口不是 lan,请替换成实际接口名。
验证客户端拿到的 DNS:
Linux/macOS:
1 | |
Windows:
1 | |
应该能看到 DNS Server 是:
1 | |
10. 第四步:部署 AdGuard Home
10.1 Docker Compose 部署方式
如果 AdGuard Home 跑在 Linux 服务器或 NAS 上,推荐用 Docker Compose。
1 | |
启动:
1 | |
首次访问:
1 | |
初始化时建议:
1 | |
如果服务器上已有其他 DNS 服务占用 53,先检查:
1 | |
常见占用来源:
- systemd-resolved;
- 本机 dnsmasq;
- Docker 相关 DNS;
- 其他安全软件。
10.2 OpenWrt 上部署 AdGuard Home
如果你选择把 AdGuard Home 跑在 OpenWrt 上,重点是让 AdGuard Home 使用 53 端口,并把 dnsmasq 移到其他端口。
常见做法:
1 | |
AdGuard Home 上游配置:
1 | |
但还是那句话:如果路由器性能一般,别硬上。DNS 过滤、日志、统计都吃资源,x86 OpenWrt 没问题,普通小路由器可能会被折腾成“电子暖手宝”。
11. 第五步:配置 AdGuard Home 上游 DNS
进入:
1 | |
推荐配置:
1 | |
如果你更重视国内解析速度,可以优先使用:
1 | |
如果你更重视隐私和国际服务解析,可以使用:
1 | |
不要一次塞太多上游 DNS。上游 DNS 不是火锅,不是什么都放进去就更香。一般 2~4 个足够。
12. 第六步:配置内网域名转发
由于 dnsmasq 还管理 DHCP 租约和本地主机名,因此 AdGuard Home 需要把 home.arpa 转发给 OpenWrt dnsmasq。
在 AdGuard Home 的上游 DNS 中添加:
1 | |
如果你还保留 OpenWrt 默认的 lan 域,也可以加:
1 | |
完整示例:
1 | |
含义:
1 | |
测试:
1 | |
应该能返回:
1 | |
13. 第七步:配置私有反向 DNS
AdGuard Home 查询日志里如果只显示一堆 IP,不好排查。可以让 AdGuard Home 通过 OpenWrt dnsmasq 做私有反向解析。
进入:
1 | |
填写:
1 | |
这样查询日志中客户端可能显示为:
1 | |
而不是只有:
1 | |
这对排查非常有帮助。
14. 第八步:配置 DNS Rewrite
DNS Rewrite 是 AdGuard Home 非常适合家庭内网的功能。
进入:
1 | |
添加:
1 | |
如果你有公网服务域名:
1 | |
可以统一重写到反向代理:
1 | |
如果 AdGuard Home 当前版本界面不支持通配符重写,或者行为和预期不一致,就逐条写:
1 | |
测试:
1 | |
应该返回:
1 | |
15. 第九步:公网服务暴露设计
如果你有公网 IP,需要对外提供服务,推荐:
1 | |
不要:
1 | |
推荐只开放:
1 | |
如果需要远程管理,再开放 VPN,例如 WireGuard:
1 | |
15.1 公网 DNS 配置
在你的域名服务商中添加:
1 | |
如果公网 IP 会变化,使用 DDNS:
1 | |
如果你有公网 IPv6,先不要急着发布 AAAA 记录。IPv6 下设备可能直接暴露在公网,主要靠防火墙拦截,不像 IPv4 NAT 那样天然隔离。
15.2 OpenWrt 端口转发
LuCI 路径:
1 | |
添加两条:
1 | |
UCI 示例:
1 | |
16. 第十步:反向代理配置示例
这里以 Caddy 为例。Caddy 的优点是配置简单,自动 HTTPS,适合家庭内网和小型自托管服务。
Caddyfile:
1 | |
如果你的服务只允许内网访问,不想对公网暴露,不要放到公网 DNS 和反向代理公开站点里。可以只用:
1 | |
这些域名只在内网 AdGuard Home 中解析。
17. 第十一步:强制客户端使用 AdGuard Home,可选
有些设备会自己写死 DNS,例如:
1 | |
如果你希望全网 DNS 都经过 AdGuard Home,可以在 OpenWrt 上把 LAN 侧 53 端口请求重定向到 AdGuard Home。
1 | |
注意:这只能拦截传统 DNS 的 53 端口。对于 DoH,也就是 DNS-over-HTTPS,因为走 443,很难完全拦截;对于 DoT,也就是 DNS-over-TLS,可以考虑阻断 853 端口。
阻断 DoT 示例:
1 | |
这一步不是必须。家庭网络里先稳定再强制,别一上来就把规则配满。防火墙规则配得太猛,最后可能先把自己关在门外。
18. IPv6 注意事项
如果你的宽带有公网 IPv6,要特别注意:
1 | |
建议:
- 没有明确需求,不要在公网 DNS 发布内网服务的 AAAA 记录;
- OpenWrt IPv6 入站默认保持拒绝;
- 对外 IPv6 服务也统一经过反向代理;
- AdGuard Home 里可以配置 IPv6 DNS,但要确保客户端拿到的是你想要的 DNS;
- 手机、平板、IoT 设备经常优先使用 IPv6,排障时要同时测试 A 和 AAAA。
测试:
1 | |
如果你没有准备开放 IPv6,AAAA 不应该返回公网 IPv6 地址。
19. 常用测试命令
19.1 测试 AdGuard Home 是否可用
1 | |
19.2 测试内网域名
1 | |
19.3 测试 dnsmasq 本地解析
1 | |
19.4 测试公网服务域名的内网 Rewrite
1 | |
内网应该返回:
1 | |
外网查询应该返回:
1 | |
19.5 测试客户端实际 DNS
macOS:
1 | |
Linux:
1 | |
Windows:
1 | |
19.6 清理缓存
macOS:
1 | |
Windows:
1 | |
Linux systemd-resolved:
1 | |
OpenWrt:
1 | |
AdGuard Home:
1 | |
20. 常见问题排查
20.1 客户端没有走 AdGuard Home
检查 DHCP 下发的 DNS:
1 | |
如果客户端 DNS 不是 192.168.9.2,检查 OpenWrt DHCP Option:
1 | |
重新获取 DHCP:
1 | |
手机直接断开 Wi-Fi 后重连。
20.2 AdGuard Home 启动不了 53 端口
检查端口占用:
1 | |
如果是 systemd-resolved 占用,需要调整本机 DNS 服务。
如果是 dnsmasq 占用,要么关闭本机 dnsmasq,要么让 AdGuard Home 使用另一个 IP 监听。
20.3 home.arpa 不能解析
分两层测:
1 | |
如果 OpenWrt 自己都不能解析,问题在 dnsmasq / 静态租约 / 本地域名。
1 | |
如果 OpenWrt 能解析,但 AdGuard 不能解析,问题在 AdGuard Home 的上游域名转发:
1 | |
20.4 内网访问公网域名走了公网 IP
比如内网访问:
1 | |
返回的是公网 IP,而不是 192.168.7.10。
检查 AdGuard Home DNS Rewrite:
1 | |
然后清理客户端 DNS 缓存。
20.5 外网访问不了服务
检查链路:
1 | |
如果运营商封锁 80/443,可以考虑:
- 更换端口;
- 使用 Cloudflare Tunnel;
- 使用 FRP / WireGuard;
- 使用 VPS 做中转。
20.6 AdGuard Home 查询日志显示 IP,不显示主机名
配置:
1 | |
同时确认 OpenWrt dnsmasq 能反向解析:
1 | |
20.7 Android / iOS 仍然绕过 DNS
Android 可能开启了“私人 DNS”,iOS 可能使用配置描述文件或 App 内 DoH。解决思路:
- 关闭客户端私人 DNS;
- 阻断 853 端口;
- 对常见 DoH 域名做策略控制;
- 接受部分 App 自带 DoH 无法完全管控。
家庭网络不必追求“百分百管控”,否则你会比公司网管还累,还没人给你发工资。
21. 安全清单
21.1 AdGuard Home 不要暴露公网
不要开放:
1 | |
AdGuard Home 只服务内网:
1 | |
21.2 只暴露反向代理
公网端口建议只开放:
1 | |
管理入口走 VPN:
1 | |
21.3 服务加认证
即使已经有反向代理,也建议:
- Jenkins 加强密码和权限;
- NAS 管理端不要直接公网暴露;
- Git 服务开启 2FA;
- 管理后台加 Basic Auth / OAuth / Authelia;
- 数据库、Redis、Docker API 永远不要直接公网暴露。
21.4 备份配置
至少备份:
1 | |
建议把配置放到 Git 私有仓库里,但注意不要提交密码、Token、证书私钥。
22. 什么时候需要升级到 BIND9 或 PowerDNS?
OpenWrt + dnsmasq + AdGuard Home 很适合小型家庭内网,但不是万能。
出现下面情况,可以考虑升级:
- DNS 记录超过 50 条;
- 需要大量 PTR 反向解析;
- 需要标准权威 DNS zone;
- 需要主从 DNS;
- 需要 TSIG、zone transfer;
- 需要和 CMDB / IPAM / 自动化平台联动;
- 希望所有 DNS 记录 GitOps 管理。
升级方向:
1 | |
本文这套方案的定位是第一档到第二档之间:够用、清晰、成本低、后续能平滑升级。
23. 最终推荐配置汇总
OpenWrt
1 | |
dnsmasq
1 | |
AdGuard Home
1 | |
反向代理
1 | |
域名
1 | |
访问路径
1 | |
24. 结语
这套方案的核心不是“用了多少工具”,而是职责清晰:
1 | |
家庭内网的 DNS 建设,一开始不要追求复杂。先把下面几件事做好:
- 全网 DNS 统一走 AdGuard Home;
- 内网基础设施使用
home.arpa; - 对外服务使用真实公网域名;
- 内外网用 Split DNS 分流;
- 公网只暴露反向代理;
- 管理入口走 VPN;
- 配置可备份、可恢复、可排障。
做到这一步,你的家庭内网就已经比很多“临时拼起来的 Homelab”稳很多了。后面服务变多,再引入 BIND9 或 PowerDNS,也不会推倒重来。
参考资料
- OpenWrt Wiki:DHCP and DNS configuration
https://openwrt.org/docs/guide-user/base-system/dhcp - OpenWrt Wiki:DHCP and DNS examples
https://openwrt.org/docs/guide-user/base-system/dhcp_configuration - OpenWrt Wiki:AdGuard Home
https://openwrt.org/docs/guide-user/services/dns/adguard-home - OpenWrt Wiki:Firewall configuration
https://openwrt.org/docs/guide-user/firewall/firewall_configuration - OpenWrt Wiki:Port forwarding / DNAT
https://openwrt.org/docs/guide-user/firewall/fw3_configurations/port_forwarding - dnsmasq 官方文档
https://thekelleys.org.uk/dnsmasq/doc.html - dnsmasq man page
https://thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html - AdGuard Home Configuration Wiki
https://github.com/AdguardTeam/AdGuardHome/wiki/Configuration - AdGuard DNS Filtering Syntax
https://adguard-dns.io/kb/general/dns-filtering-syntax/ - RFC 8375:Special-Use Domain
home.arpa.
https://www.rfc-editor.org/rfc/rfc8375.html - RFC 6762:Multicast DNS,
.local保留语义
https://www.rfc-editor.org/rfc/rfc6762.html - Caddy Reverse Proxy Quick-start
https://caddyserver.com/docs/quick-starts/reverse-proxy - Caddy Automatic HTTPS
https://caddyserver.com/docs/automatic-https