🏠 家庭网络架构与 DNS 查询流程


I. 网络拓扑结构(以软路由作主路由为例)

上游ISP


光猫(Bridge Mode)
└─ 功能:
- 光电信号转换
- 桥接模式
- 大内网 IP 下发给下游设备


软路由(主路由)
└─ 功能:
- PPPoE 拨号
- DHCP 服务
- 网络网关
- 控制整个局域网流量
└─ 核心服务:
- Dnsmasq(53端口)
- OpenClash(7874端口)
- AdGuard Home(多个自定义端口)


硬路由(AP 模式)
└─ 功能:
- 无线接入点(AP)
- 有线网口扩展
- 关闭路由 & DHCP 功能,仅做交换和转发,桥接

II. DNS 查询解析流程

1️⃣ 客户端请求 & 强制重定向(透明劫持)

客户端(无论 DNS 设置如何)发起查询请求:
DNS 查询 (UDP/53)

被软路由防火墙规则劫持

转发至:Dnsmasq (127.0.0.1:53)

2️⃣ Dnsmasq 转发至 OpenClash

Dnsmasq 的上游 DNS 设置为:
→ OpenClash (127.0.0.1:7874)或 MosDNS (127.0.0.1:5335)

3️⃣ 使用OpenClash 分流(Fake-IP 模式)或MosDNS进行分流

OpenClash 判断域名类型:
├─ 🇨🇳 国内域名
│ → 转发至 AdGuard Home (国内专用, Port 5353)
└─ 🌍 国外域名
→ 回落至 AdGuard Home (国外专用, Port 5380)

OpenClash部分详细配置不展开说明,这里分享MosDNS配置情况:

MosDNS 判断域名类型:
├─ 🇨🇳 国内域名
│ → 转发至 AdGuard Home (国内专用, Port 5353)
└─ 🌍 国外域名
→ 回落至 AdGuard Home (国外专用, Port 5380)

  • 一般而言不要开启dns转发功能,如有需要可自行到dnsmasq处手动设置,因为太多应用依赖了dnsmasq,直接设置或者强制替换dnsmasq的53端口可能会导致意想不到的问题

4️⃣ AdGuard Home 最终解析路径

国内域名:
本地AdGuard Home (5353)
→ 上游 DNS:运营商 DNS或国内公共DNS
→ 高速解析 + CDN 优化

国外域名:
本地AdGuard Home (5380)
→ 上游 DNS(DoH 加密):
→ 海外自建 AdGuard Home
→ 上游 DNS(DoH 加密):
→ Cloudflare (https://dns.cloudflare.com/dns-query)

注意事项

  • AdGuard Home (国内) 必须避开 53 端口(如用 5353),如果开启了dnsmasq重定向客户端所有dns查询,AdGuard Home (国内) 如果上游用的运营商无加密dns,则必须部署到其他不会被自己路由器劫持的地方,以防止出现dns查询回环,导致死循环。如果使用的是国内doh提供商,则无需担心被软路由劫持
  • 其中两个上游AdGuard Home均需配置黑名单,屏蔽应用自带的doh服务(诸如httpdns.bilibili.com),以防止dns劫持失败
    GitHub BlockHttpDNS
https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/AdGuard/BlockHttpDNS/BlockHttpDNS.txt
  • 建议开启dnsmasq重定向功能,以防止某些app会使用内置114dns查询,如果不劫持,这些dns查询会直接绕过路由器

✨ 方案总结

  • 🧠 智能分流:国内直连,国外走海外解析
  • 🚫 广告过滤:国内 + 国外双重 AdGuard 拦截
  • 🛡️ DNS 防污染:全程 DoH 加密,抵抗污染
  • 🔁 全网透明:客户端设备无需设置,自带优化体验,并自带ECH功能 ()检查是否启用了ECH功能
  • 🎮 控制力强:灵活调整 DNS 流向与策略

❔ 相关问题

因为国外公共DOH服务间歇性被阻断,会影响网页速度,最好办法是自建海外DOH服务

  • DNS泄漏一般发生在哪些环节?
  1. 客户端使用了自带的114dns或其他dns查询服务,dnsmasq没有设置重定向所有dns查询请求
  2. 客户端使用了自带的DOH查询,adgardhome没有做好屏蔽这些域名
  3. 海外查询的上游dns直接使用了明文的查询方式,比如1.1.1.1,这样会被运营商劫持,正确做法是使用doh或者dot等方式
  • 在一些dns泄漏测试网站怎么出现了好几个国家的IP?

如果没有出现国内的ip,一般没有泄漏问题,如果出现多个海外国家ip,这种问题是你所使用的海外上游DNS查询商负载均衡导致的,可能会分流到其他国家(一般是分流到部署在美国的DNS,这常发生在使用谷歌dns的情况)

  • 为什么这样设置后本地客户端ping会无法ping通?

因为某些应用fakeip模式下返回的是假的ip地址,icmp协议等网络层协议不会被转发到海外。如果需要真实ping,具体设置方法可浏览器搜索(保命)

  • 海外dns查询可以用国内的服务商吗?

自建私用的递归查询DNS服务器是可行的,但必须设置白名单,一般而言,海外dns查询端口要设置在高位端口,且多数情况,客户端请求是用的DOH方式(明文dns会直接被ISP劫持约等于白建)。所以需要屏蔽所有基于UDP明文查询的dns查询请求,可防止被扫后滥用。⚠️ 如果没有设置好白名单,变成了一个可供国内公开查询的dns服务器,轻则ip被封,重则会被查水表

  • IPV6的DNS如何配置?

可以参考以下配置方式,目前暂未出现v6的错误的情况:


  • 本地双AdgardHome是如何实现的?

可用docker版本的Adgardhome搭建,可使用host模式,但要注意host下最好把第一个创建的Adgardhome网页端口设置在非3000端口上,以免下一个Adgardhome创建时起冲突,或者使用附带以下命令的方式创建:

docker pull adguard/adguardhome
docker run --name adguardhome\    --restart unless-stopped\    -v /my/own/workdir:/opt/adguardhome/work\    -v /my/own/confdir:/opt/adguardhome/conf\    -p 53:53/tcp -p 53:53/udp\    -p 67:67/udp -p 68:68/udp\    -p 80:80/tcp -p 443:443/tcp -p 443:443/udp -p 3000:3000/tcp\  #此处更改Adgardhome的网页监听端口,默认3000    -p 853:853/tcp\    -p 784:784/udp -p 853:853/udp -p 8853:8853/udp\    -p 5443:5443/tcp -p 5443:5443/udp\    -d adguard/adguardhome

参考资料

AdGuardHome