基于 OpenWrt、dnsmasq 与 AdGuard Home 的家庭内网 DNS 实战方案

家庭内网 DNS 很容易被低估:一开始只是想让 nasgitrouter 这些名字能访问,后来开始有公网 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Internet
|
公网 IP
|
OpenWrt
- 路由
- 防火墙
- NAT
- DHCP / dnsmasq
- 端口转发 80/443 到反向代理
|
+-----------------------------+
| |
AdGuard Home Reverse Proxy
DNS 入口 / 过滤 / 统计 / 重写 Caddy / Nginx Proxy Manager
| |
| +--> Git / Jenkins / NAS / API / Blog
|
公网 DNS 上游 / DoH / DoT

更具体一点,可以这样规划:

1
2
3
4
5
6
7
OpenWrt 网关:       192.168.9.1
AdGuard Home: 192.168.9.2
反向代理: 192.168.7.10
NAS / 存储: 192.168.8.10
业务服务: 192.168.7.20 ~ 192.168.7.99
管理设备: 192.168.9.10 ~ 192.168.9.99
普通客户端: 192.168.9.100 ~ 192.168.9.250

如果你只有一个网段,也可以简化成:

1
2
3
4
5
OpenWrt:            192.168.1.1
AdGuard Home: 192.168.1.2
反向代理: 192.168.1.10
NAS: 192.168.1.20
其他服务: 192.168.1.30+

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
2
3
80/tcp
443/tcp
WireGuard VPN 端口,可选

不要把 PostgreSQL、Redis、Jenkins、NAS 管理端、Docker API 等端口直接暴露到公网。那不是自建服务,那是给扫描器开自助餐。

4. 域名设计

家庭内网建议分两套域名。

4.1 内网基础设施域名:home.arpa

推荐使用:

1
home.arpa

示例:

1
2
3
4
5
6
router.home.arpa       -> 192.168.9.1
adguard.home.arpa -> 192.168.9.2
proxy.home.arpa -> 192.168.7.10
nas.home.arpa -> 192.168.8.10
git.home.arpa -> 192.168.7.20
jenkins.home.arpa -> 192.168.7.21

home.arpa 是 RFC 8375 指定给家庭网络使用的特殊域名。它的语义比随便造一个 .lan.home.internal 更规范。

不建议使用:

1
.local

.local 是 mDNS 使用的特殊域名,macOS、iOS、Linux Avahi、部分智能设备会把它当作多播 DNS 处理。你拿它做普通 DNS,后面非常容易出现“有的设备能解析,有的设备不能解析”的玄学问题。

4.2 对外服务域名:真实公网域名

如果你有自己的公网域名,例如:

1
example.com

建议对外服务使用:

1
2
3
4
5
git.lab.example.com
jenkins.lab.example.com
api.lab.example.com
blog.lab.example.com
nas.lab.example.com

公网 DNS 中配置:

1
*.lab.example.com    A    你的公网 IPv4

或者逐条配置:

1
2
3
git.lab.example.com       A    你的公网 IPv4
jenkins.lab.example.com A 你的公网 IPv4
api.lab.example.com A 你的公网 IPv4

内网 AdGuard Home 中配置 DNS Rewrite:

1
*.lab.example.com    ->   192.168.7.10

192.168.7.10 是反向代理地址。

这样访问路径就会变成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
外网用户:
git.lab.example.com
-> 公网 DNS
-> 公网 IP
-> OpenWrt 端口转发
-> 反向代理
-> Git 服务

内网用户:
git.lab.example.com
-> AdGuard Home DNS Rewrite
-> 192.168.7.10
-> 反向代理
-> Git 服务

这就是 Split DNS,也叫内外网分流解析。它比依赖 NAT Loopback / Hairpin NAT 更清楚。

5. 推荐部署方式

有两种常见方式。

5.1 方式一:AdGuard Home 直接跑在 OpenWrt 上

适合:

  • x86 OpenWrt;
  • 路由器 CPU/内存足够;
  • 不想单独开一台服务器;
  • 内网设备不多。

架构:

1
2
3
4
Client
-> OpenWrt:53 / AdGuard Home
-> dnsmasq:5353 / 本地 DHCP 主机名
-> 公网 DNS 上游

这种方式需要解决端口冲突:OpenWrt 默认 dnsmasq 监听 53,AdGuard Home 也需要监听 53。

做法是把 dnsmasq 改到 5353,让 AdGuard Home 监听 53:

1
2
3
uci set dhcp.@dnsmasq[0].port='5353'
uci commit dhcp
/etc/init.d/dnsmasq restart

然后 AdGuard Home 上游里配置:

1
2
[/home.arpa/]127.0.0.1:5353
[/lan/]127.0.0.1:5353

私有反向 DNS 服务器配置:

1
127.0.0.1:5353

优点:简单。
缺点:OpenWrt 负载变大,路由器挂了 DNS 也一起挂。

如果你的 OpenWrt 不是 x86,而是普通家用路由器,我更推荐下一种方式。

5.2 方式二:AdGuard Home 跑在内网服务器上

这是更推荐的方式。

架构:

1
2
3
4
Client
-> AdGuard Home:53
-> OpenWrt dnsmasq:53 / home.arpa / PTR
-> 公网 DNS 上游

示例:

1
2
3
OpenWrt:        192.168.9.1
AdGuard Home: 192.168.9.2
反向代理: 192.168.7.10

OpenWrt 上 dnsmasq 保持默认 53 端口,继续负责 DHCP 和本地主机名。AdGuard Home 跑在 NAS、虚拟机、小主机或 Docker 中。

优点:

  • OpenWrt 负载低;
  • AdGuard 日志、统计、过滤更稳定;
  • Docker 迁移方便;
  • 后续可以部署第二个 AdGuard Home 做备用。

缺点:

  • AdGuard 服务器挂了,全网 DNS 受影响;
  • 最好准备第二个 DNS 或备用方案。

本文后续以“AdGuard Home 跑在内网服务器上”为主进行实战说明。

6. 实战环境假设

本文使用下面的示例环境:

1
2
3
4
5
6
7
8
OpenWrt 网关:       192.168.9.1
AdGuard Home: 192.168.9.2
反向代理: 192.168.7.10
NAS: 192.168.8.10
Git: 192.168.7.20
Jenkins: 192.168.7.21
内网域名: home.arpa
公网域名: lab.example.com

你可以按自己的网络替换这些 IP 和域名。

7. 第一步:给 AdGuard Home 固定 IP

AdGuard Home 必须使用固定 IP。否则 DHCP 租约变动后,全网 DNS 会直接失效。

可以在 OpenWrt LuCI 中操作:

1
网络 -> DHCP/DNS -> 静态地址分配 -> 添加

设置:

1
2
3
主机名:adguard
MAC 地址:AdGuard 服务器网卡 MAC
IPv4 地址:192.168.9.2

也可以通过 UCI 配置:

1
2
3
4
5
6
uci add dhcp host
uci set dhcp.@host[-1].name='adguard'
uci set dhcp.@host[-1].mac='AA:BB:CC:DD:EE:FF'
uci set dhcp.@host[-1].ip='192.168.9.2'
uci commit dhcp
/etc/init.d/dnsmasq restart

注意替换 MAC 地址。

8. 第二步:配置 OpenWrt dnsmasq 本地域名

建议把 OpenWrt 的本地域名设置为:

1
home.arpa

LuCI 路径:

1
网络 -> DHCP/DNS -> 常规设置

建议配置:

1
2
3
4
本地域名:home.arpa
展开主机名:启用
本地服务:启用
过滤私有地址反向查询:启用

UCI 示例:

1
2
3
4
5
6
7
8
uci set dhcp.@dnsmasq[0].domain='home.arpa'
uci set dhcp.@dnsmasq[0].local='/home.arpa/'
uci set dhcp.@dnsmasq[0].expandhosts='1'
uci set dhcp.@dnsmasq[0].domainneeded='1'
uci set dhcp.@dnsmasq[0].boguspriv='1'
uci set dhcp.@dnsmasq[0].authoritative='1'
uci commit dhcp
/etc/init.d/dnsmasq restart

这样 dnsmasq 可以把 DHCP 静态租约里的主机名解析成:

1
2
3
adguard.home.arpa
router.home.arpa
nas.home.arpa

如果你有多个网段,可以分别设置 DHCP 地址池和静态租约。核心思想不变:dnsmasq 管“设备拿什么 IP”,AdGuard Home 管“客户端 DNS 查询从哪里进来”。

9. 第三步:让 DHCP 下发 AdGuard Home 作为 DNS

让所有客户端通过 DHCP 拿到 AdGuard Home 作为 DNS 服务器。

LuCI 路径:

1
网络 -> 接口 -> LAN -> DHCP 服务器 -> 高级设置 -> DHCP 选项

填入:

1
6,192.168.9.2

6 是 DHCP Option 6,表示 DNS Server。

UCI 示例:

1
2
3
uci add_list dhcp.lan.dhcp_option='6,192.168.9.2'
uci commit dhcp
/etc/init.d/dnsmasq restart

如果你的接口不是 lan,请替换成实际接口名。

验证客户端拿到的 DNS:

Linux/macOS:

1
2
3
scutil --dns | grep nameserver
# 或
resolvectl status

Windows:

1
ipconfig /all

应该能看到 DNS Server 是:

1
192.168.9.2

10. 第四步:部署 AdGuard Home

10.1 Docker Compose 部署方式

如果 AdGuard Home 跑在 Linux 服务器或 NAS 上,推荐用 Docker Compose。

1
2
3
4
5
6
7
8
9
services:
adguardhome:
image: adguard/adguardhome:latest
container_name: adguardhome
restart: unless-stopped
network_mode: host
volumes:
- ./work:/opt/adguardhome/work
- ./conf:/opt/adguardhome/conf

启动:

1
docker compose up -d

首次访问:

1
http://192.168.9.2:3000

初始化时建议:

1
2
DNS 监听地址:0.0.0.0:53
Web 管理地址:192.168.9.2:3000 或 0.0.0.0:3000

如果服务器上已有其他 DNS 服务占用 53,先检查:

1
sudo ss -lntup | grep ':53'

常见占用来源:

  • systemd-resolved;
  • 本机 dnsmasq;
  • Docker 相关 DNS;
  • 其他安全软件。

10.2 OpenWrt 上部署 AdGuard Home

如果你选择把 AdGuard Home 跑在 OpenWrt 上,重点是让 AdGuard Home 使用 53 端口,并把 dnsmasq 移到其他端口。

常见做法:

1
2
3
uci set dhcp.@dnsmasq[0].port='5353'
uci commit dhcp
/etc/init.d/dnsmasq restart

AdGuard Home 上游配置:

1
2
[/home.arpa/]127.0.0.1:5353
[/lan/]127.0.0.1:5353

但还是那句话:如果路由器性能一般,别硬上。DNS 过滤、日志、统计都吃资源,x86 OpenWrt 没问题,普通小路由器可能会被折腾成“电子暖手宝”。

11. 第五步:配置 AdGuard Home 上游 DNS

进入:

1
AdGuard Home -> 设置 -> DNS 设置 -> 上游 DNS 服务器

推荐配置:

1
2
3
4
https://dns.alidns.com/dns-query
https://223.5.5.5/dns-query
https://1.1.1.1/dns-query
https://cloudflare-dns.com/dns-query

如果你更重视国内解析速度,可以优先使用:

1
2
https://dns.alidns.com/dns-query
https://doh.pub/dns-query

如果你更重视隐私和国际服务解析,可以使用:

1
2
https://1.1.1.1/dns-query
https://dns.google/dns-query

不要一次塞太多上游 DNS。上游 DNS 不是火锅,不是什么都放进去就更香。一般 2~4 个足够。

12. 第六步:配置内网域名转发

由于 dnsmasq 还管理 DHCP 租约和本地主机名,因此 AdGuard Home 需要把 home.arpa 转发给 OpenWrt dnsmasq。

在 AdGuard Home 的上游 DNS 中添加:

1
[/home.arpa/]192.168.9.1

如果你还保留 OpenWrt 默认的 lan 域,也可以加:

1
[/lan/]192.168.9.1

完整示例:

1
2
3
[/home.arpa/]192.168.9.1
https://dns.alidns.com/dns-query
https://1.1.1.1/dns-query

含义:

1
2
home.arpa 域名 -> OpenWrt dnsmasq
其他域名 -> 公网上游 DNS

测试:

1
dig @192.168.9.2 router.home.arpa

应该能返回:

1
router.home.arpa.  A  192.168.9.1

13. 第七步:配置私有反向 DNS

AdGuard Home 查询日志里如果只显示一堆 IP,不好排查。可以让 AdGuard Home 通过 OpenWrt dnsmasq 做私有反向解析。

进入:

1
AdGuard Home -> 设置 -> DNS 设置 -> 私有反向 DNS 服务器

填写:

1
192.168.9.1

这样查询日志中客户端可能显示为:

1
2
3
iphone.home.arpa
macbook.home.arpa
nas.home.arpa

而不是只有:

1
192.168.9.123

这对排查非常有帮助。

14. 第八步:配置 DNS Rewrite

DNS Rewrite 是 AdGuard Home 非常适合家庭内网的功能。

进入:

1
过滤器 -> DNS 重写

添加:

1
2
3
4
router.home.arpa      -> 192.168.9.1
adguard.home.arpa -> 192.168.9.2
proxy.home.arpa -> 192.168.7.10
nas.home.arpa -> 192.168.8.10

如果你有公网服务域名:

1
2
3
git.lab.example.com
jenkins.lab.example.com
api.lab.example.com

可以统一重写到反向代理:

1
*.lab.example.com     -> 192.168.7.10

如果 AdGuard Home 当前版本界面不支持通配符重写,或者行为和预期不一致,就逐条写:

1
2
3
git.lab.example.com       -> 192.168.7.10
jenkins.lab.example.com -> 192.168.7.10
api.lab.example.com -> 192.168.7.10

测试:

1
dig @192.168.9.2 git.lab.example.com

应该返回:

1
192.168.7.10

15. 第九步:公网服务暴露设计

如果你有公网 IP,需要对外提供服务,推荐:

1
公网 DNS -> OpenWrt -> 反向代理 -> 内网服务

不要:

1
2
3
4
公网端口 3000 -> Gitea
公网端口 8080 -> Jenkins
公网端口 9000 -> MinIO
公网端口 5000 -> 某个后台

推荐只开放:

1
2
80/tcp
443/tcp

如果需要远程管理,再开放 VPN,例如 WireGuard:

1
51820/udp

15.1 公网 DNS 配置

在你的域名服务商中添加:

1
*.lab.example.com    A    你的公网 IPv4

如果公网 IP 会变化,使用 DDNS:

1
OpenWrt DDNS -> 更新域名 A 记录

如果你有公网 IPv6,先不要急着发布 AAAA 记录。IPv6 下设备可能直接暴露在公网,主要靠防火墙拦截,不像 IPv4 NAT 那样天然隔离。

15.2 OpenWrt 端口转发

LuCI 路径:

1
网络 -> 防火墙 -> 端口转发 -> 添加

添加两条:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
名称:HTTP to Proxy
协议:TCP
外部区域:wan
外部端口:80
内部区域:lan
内部 IP:192.168.7.10
内部端口:80

名称:HTTPS to Proxy
协议:TCP
外部区域:wan
外部端口:443
内部区域:lan
内部 IP:192.168.7.10
内部端口:443

UCI 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
uci add firewall redirect
uci set firewall.@redirect[-1].name='HTTP-to-Proxy'
uci set firewall.@redirect[-1].src='wan'
uci set firewall.@redirect[-1].src_dport='80'
uci set firewall.@redirect[-1].dest='lan'
uci set firewall.@redirect[-1].dest_ip='192.168.7.10'
uci set firewall.@redirect[-1].dest_port='80'
uci set firewall.@redirect[-1].proto='tcp'
uci set firewall.@redirect[-1].target='DNAT'

uci add firewall redirect
uci set firewall.@redirect[-1].name='HTTPS-to-Proxy'
uci set firewall.@redirect[-1].src='wan'
uci set firewall.@redirect[-1].src_dport='443'
uci set firewall.@redirect[-1].dest='lan'
uci set firewall.@redirect[-1].dest_ip='192.168.7.10'
uci set firewall.@redirect[-1].dest_port='443'
uci set firewall.@redirect[-1].proto='tcp'
uci set firewall.@redirect[-1].target='DNAT'

uci commit firewall
/etc/init.d/firewall restart

16. 第十步:反向代理配置示例

这里以 Caddy 为例。Caddy 的优点是配置简单,自动 HTTPS,适合家庭内网和小型自托管服务。

Caddyfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git.lab.example.com {
reverse_proxy 192.168.7.20:3000
}

jenkins.lab.example.com {
reverse_proxy 192.168.7.21:8080
}

api.lab.example.com {
reverse_proxy 192.168.7.22:8080
}

nas.lab.example.com {
reverse_proxy 192.168.8.10:5000
}

如果你的服务只允许内网访问,不想对公网暴露,不要放到公网 DNS 和反向代理公开站点里。可以只用:

1
2
3
nas.home.arpa
postgres.home.arpa
redis.home.arpa

这些域名只在内网 AdGuard Home 中解析。

17. 第十一步:强制客户端使用 AdGuard Home,可选

有些设备会自己写死 DNS,例如:

1
2
3
8.8.8.8
1.1.1.1
114.114.114.114

如果你希望全网 DNS 都经过 AdGuard Home,可以在 OpenWrt 上把 LAN 侧 53 端口请求重定向到 AdGuard Home。

1
2
3
4
5
6
7
8
9
10
11
uci add firewall redirect
uci set firewall.@redirect[-1].name='Redirect-LAN-DNS-to-AdGuard'
uci set firewall.@redirect[-1].src='lan'
uci set firewall.@redirect[-1].src_dport='53'
uci set firewall.@redirect[-1].dest='lan'
uci set firewall.@redirect[-1].dest_ip='192.168.9.2'
uci set firewall.@redirect[-1].dest_port='53'
uci set firewall.@redirect[-1].proto='tcp udp'
uci set firewall.@redirect[-1].target='DNAT'
uci commit firewall
/etc/init.d/firewall restart

注意:这只能拦截传统 DNS 的 53 端口。对于 DoH,也就是 DNS-over-HTTPS,因为走 443,很难完全拦截;对于 DoT,也就是 DNS-over-TLS,可以考虑阻断 853 端口。

阻断 DoT 示例:

1
2
3
4
5
6
7
8
9
uci add firewall rule
uci set firewall.@rule[-1].name='Block-DoT-to-WAN'
uci set firewall.@rule[-1].src='lan'
uci set firewall.@rule[-1].dest='wan'
uci set firewall.@rule[-1].dest_port='853'
uci set firewall.@rule[-1].proto='tcp udp'
uci set firewall.@rule[-1].target='REJECT'
uci commit firewall
/etc/init.d/firewall restart

这一步不是必须。家庭网络里先稳定再强制,别一上来就把规则配满。防火墙规则配得太猛,最后可能先把自己关在门外。

18. IPv6 注意事项

如果你的宽带有公网 IPv6,要特别注意:

1
2
IPv4:通常通过 NAT 隔离
IPv6:设备可能直接拥有公网地址,主要靠防火墙保护

建议:

  • 没有明确需求,不要在公网 DNS 发布内网服务的 AAAA 记录;
  • OpenWrt IPv6 入站默认保持拒绝;
  • 对外 IPv6 服务也统一经过反向代理;
  • AdGuard Home 里可以配置 IPv6 DNS,但要确保客户端拿到的是你想要的 DNS;
  • 手机、平板、IoT 设备经常优先使用 IPv6,排障时要同时测试 A 和 AAAA。

测试:

1
2
dig A git.lab.example.com @192.168.9.2
dig AAAA git.lab.example.com @192.168.9.2

如果你没有准备开放 IPv6,AAAA 不应该返回公网 IPv6 地址。

19. 常用测试命令

19.1 测试 AdGuard Home 是否可用

1
dig @192.168.9.2 www.baidu.com

19.2 测试内网域名

1
2
3
dig @192.168.9.2 router.home.arpa
dig @192.168.9.2 adguard.home.arpa
dig @192.168.9.2 nas.home.arpa

19.3 测试 dnsmasq 本地解析

1
dig @192.168.9.1 router.home.arpa

19.4 测试公网服务域名的内网 Rewrite

1
dig @192.168.9.2 git.lab.example.com

内网应该返回:

1
192.168.7.10

外网查询应该返回:

1
你的公网 IP

19.5 测试客户端实际 DNS

macOS:

1
scutil --dns | grep nameserver

Linux:

1
resolvectl status

Windows:

1
2
ipconfig /all
nslookup git.lab.example.com

19.6 清理缓存

macOS:

1
2
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder

Windows:

1
ipconfig /flushdns

Linux systemd-resolved:

1
sudo resolvectl flush-caches

OpenWrt:

1
2
/etc/init.d/dnsmasq restart
logread -e dnsmasq

AdGuard Home:

1
docker logs -f adguardhome

20. 常见问题排查

20.1 客户端没有走 AdGuard Home

检查 DHCP 下发的 DNS:

1
2
3
ipconfig /all
scutil --dns
resolvectl status

如果客户端 DNS 不是 192.168.9.2,检查 OpenWrt DHCP Option:

1
uci show dhcp | grep dhcp_option

重新获取 DHCP:

1
2
3
4
5
6
7
# Windows
ipconfig /release
ipconfig /renew

# Linux
sudo dhclient -r
sudo dhclient

手机直接断开 Wi-Fi 后重连。

20.2 AdGuard Home 启动不了 53 端口

检查端口占用:

1
sudo ss -lntup | grep ':53'

如果是 systemd-resolved 占用,需要调整本机 DNS 服务。
如果是 dnsmasq 占用,要么关闭本机 dnsmasq,要么让 AdGuard Home 使用另一个 IP 监听。

20.3 home.arpa 不能解析

分两层测:

1
dig @192.168.9.1 router.home.arpa

如果 OpenWrt 自己都不能解析,问题在 dnsmasq / 静态租约 / 本地域名。

1
dig @192.168.9.2 router.home.arpa

如果 OpenWrt 能解析,但 AdGuard 不能解析,问题在 AdGuard Home 的上游域名转发:

1
[/home.arpa/]192.168.9.1

20.4 内网访问公网域名走了公网 IP

比如内网访问:

1
git.lab.example.com

返回的是公网 IP,而不是 192.168.7.10

检查 AdGuard Home DNS Rewrite:

1
git.lab.example.com -> 192.168.7.10

然后清理客户端 DNS 缓存。

20.5 外网访问不了服务

检查链路:

1
2
3
4
5
6
7
公网 DNS 是否指向公网 IP?
OpenWrt 是否有公网 IP?
运营商是否封锁 80/443?
OpenWrt 端口转发是否正确?
反向代理是否监听 80/443?
后端服务是否正常?
服务自己的访问控制是否允许?

如果运营商封锁 80/443,可以考虑:

  • 更换端口;
  • 使用 Cloudflare Tunnel;
  • 使用 FRP / WireGuard;
  • 使用 VPS 做中转。

20.6 AdGuard Home 查询日志显示 IP,不显示主机名

配置:

1
私有反向 DNS 服务器:192.168.9.1

同时确认 OpenWrt dnsmasq 能反向解析:

1
dig @192.168.9.1 -x 192.168.9.2

20.7 Android / iOS 仍然绕过 DNS

Android 可能开启了“私人 DNS”,iOS 可能使用配置描述文件或 App 内 DoH。解决思路:

  • 关闭客户端私人 DNS;
  • 阻断 853 端口;
  • 对常见 DoH 域名做策略控制;
  • 接受部分 App 自带 DoH 无法完全管控。

家庭网络不必追求“百分百管控”,否则你会比公司网管还累,还没人给你发工资。

21. 安全清单

21.1 AdGuard Home 不要暴露公网

不要开放:

1
2
3
WAN -> AdGuard Home 53
WAN -> AdGuard Home 3000
WAN -> AdGuard Home 80/443 管理页

AdGuard Home 只服务内网:

1
2
3
192.168.9.0/24
192.168.8.0/24
192.168.7.0/24

21.2 只暴露反向代理

公网端口建议只开放:

1
2
80/tcp
443/tcp

管理入口走 VPN:

1
2
3
WireGuard
Tailscale
ZeroTier

21.3 服务加认证

即使已经有反向代理,也建议:

  • Jenkins 加强密码和权限;
  • NAS 管理端不要直接公网暴露;
  • Git 服务开启 2FA;
  • 管理后台加 Basic Auth / OAuth / Authelia;
  • 数据库、Redis、Docker API 永远不要直接公网暴露。

21.4 备份配置

至少备份:

1
2
3
4
5
OpenWrt /etc/config/network
OpenWrt /etc/config/dhcp
OpenWrt /etc/config/firewall
AdGuardHome.yaml
Caddyfile / Nginx Proxy Manager 数据目录

建议把配置放到 Git 私有仓库里,但注意不要提交密码、Token、证书私钥。

22. 什么时候需要升级到 BIND9 或 PowerDNS?

OpenWrt + dnsmasq + AdGuard Home 很适合小型家庭内网,但不是万能。

出现下面情况,可以考虑升级:

  • DNS 记录超过 50 条;
  • 需要大量 PTR 反向解析;
  • 需要标准权威 DNS zone;
  • 需要主从 DNS;
  • 需要 TSIG、zone transfer;
  • 需要和 CMDB / IPAM / 自动化平台联动;
  • 希望所有 DNS 记录 GitOps 管理。

升级方向:

1
2
3
4
5
6
7
8
9
10
11
小型家庭网络:
OpenWrt + dnsmasq + AdGuard Home

中型 Homelab:
OpenWrt + AdGuard Home + BIND9

自动化 Homelab / 小型企业:
OpenWrt + AdGuard Home + PowerDNS + API

企业级 DHCP/DDNS:
OpenWrt/网关 + Kea DHCP + BIND9/PowerDNS

本文这套方案的定位是第一档到第二档之间:够用、清晰、成本低、后续能平滑升级。

23. 最终推荐配置汇总

OpenWrt

1
2
3
4
职责:路由 / 防火墙 / DHCP / NAT / 端口转发
IP:192.168.9.1
DHCP 下发 DNS:192.168.9.2
本地域名:home.arpa

dnsmasq

1
2
3
4
职责:DHCP / 静态租约 / 本地主机名 / PTR 来源
local:/home.arpa/
domain:home.arpa
expandhosts:1

AdGuard Home

1
2
3
4
5
职责:全网 DNS 入口 / 广告过滤 / 查询日志 / DNS Rewrite
IP:192.168.9.2
上游:DoH / DoT / 公共 DNS
内网域名转发:[/home.arpa/]192.168.9.1
私有反向 DNS:192.168.9.1

反向代理

1
2
3
职责:公网服务统一入口 / HTTPS / 域名分流
IP:192.168.7.10
公网开放:80/443

域名

1
2
内网基础设施:home.arpa
对外服务:lab.example.com

访问路径

1
2
3
4
5
6
7
8
内网访问基础设施:
nas.home.arpa -> AdGuard Home -> OpenWrt dnsmasq -> 192.168.8.10

内网访问公网服务域名:
git.lab.example.com -> AdGuard Home DNS Rewrite -> 192.168.7.10 -> 反向代理 -> Git

外网访问公网服务域名:
git.lab.example.com -> 公网 DNS -> 公网 IP -> OpenWrt -> 反向代理 -> Git

24. 结语

这套方案的核心不是“用了多少工具”,而是职责清晰:

1
2
3
4
OpenWrt:管网络入口
dnsmasq:管 DHCP 和本地主机名
AdGuard Home:管 DNS 入口、过滤、统计和重写
反向代理:管公网服务入口和 HTTPS

家庭内网的 DNS 建设,一开始不要追求复杂。先把下面几件事做好:

  • 全网 DNS 统一走 AdGuard Home;
  • 内网基础设施使用 home.arpa
  • 对外服务使用真实公网域名;
  • 内外网用 Split DNS 分流;
  • 公网只暴露反向代理;
  • 管理入口走 VPN;
  • 配置可备份、可恢复、可排障。

做到这一步,你的家庭内网就已经比很多“临时拼起来的 Homelab”稳很多了。后面服务变多,再引入 BIND9 或 PowerDNS,也不会推倒重来。

参考资料


基于 OpenWrt、dnsmasq 与 AdGuard Home 的家庭内网 DNS 实战方案
https://allendericdalexander.github.io/2026/06/17/devops/infra/openwrt-dnsmasq-adguard-home-lan-hexo-blog/
作者
AtLuoFu
发布于
2026年6月17日
许可协议