家庭网络
家庭网络智能 DNS 分流实战:用 mosdns 实现国内外域名解析加速与 DoH 防污染
2026年10月13日
用 mosdns 给家庭网络做国内外 DNS 分流,加速访问并防污染。
家庭网络智能 DNS 分流实战:用 mosdns 实现国内外域名解析加速与 DoH 防污染
摘要
家里访问国内站点慢、打开部分国外服务又经常解析超时?根因往往不是带宽,而是 DNS。本文用轻量开源工具 mosdns 在家庭网关上做 DNS 分流:国内域名走本地运营商解析保证快,国外域名走 DoH/DoT 加密解析防污染,并保留广告域名拦截能力。
为什么需要 DNS 分流
默认情况下,路由器把所有域名都交给同一个上游 DNS。问题有两个:一是国内域名被送到境外 DNS 会绕路变慢;二是境外域名在部分网络环境下会被污染或劫持,导致能 ping 通 IP 却打不开网页。
分流的核心思路是"按域名归属选路":
- 国内域名(如 taobao.com、qq.com)→ 国内公共 DNS(如 223.5.5.5、119.29.29.29),延迟低、解析准。
- 国外域名(如 github.com、openai.com)→ DoH/DoT 加密上游(如 Cloudflare 1.1.1.1、Google 8.8.8.8 的 DoH 端点),防篡改。
- 广告/跟踪域名 → 返回 0.0.0.0 或 NXDOMAIN 直接拦截。
mosdns 是什么
mosdns 是一个用 Go 写的高性能 DNS 转发器,特色是"按规则分流 + 多上游并发 + 可插拔逻辑"。它比单纯的 DNS 去广告工具(如 AdGuard Home)更侧重"分流解析",也常和 AdGuard 搭配:AdGuard 负责缓存与去广告面板,mosdns 放在更上游做分流选路。
部署形态通常是 Docker 容器(群晖/飞牛/OpenWrt 均可),监听 53 端口,把自己设为局域网的 DNS 服务器。
部署步骤(以 Docker 为例)
- 准备配置目录:
mkdir -p /opt/mosdns && cd /opt/mosdns
- 编写
config.yaml,核心结构包含三个部分:上游定义、分流规则、监听端口。示例片段:
upstream:
- addr: "223.5.5.5"
tag: "local"
- addr: "https://1.1.1.1/dns-query"
tag: "remote"
- 用 docker-compose 拉起:
services:
mosdns:
image: sbwml/mosdns:latest
container_name: mosdns
volumes:
- ./config.yaml:/etc/mosdns/config.yaml
network_mode: host
restart: unless-stopped
- 把路由器 DHCP 下发的 DNS 改为这台主机的 IP(如 192.168.1.10),或在 OpenWrt 的"网络→DHCP/DNS"里把"DNS 转发"指向它。
两条关键规则
- 地理分流:mosdns 内置 geoip 与 geosite 数据库,可按域名所属地区自动判定走 local 还是 remote。规则大致是:命中国内列表→local;其余→remote。
- 防污染校验:对 remote 上游开启"EDNS 客户端子网关闭 + 并行查询 + 结果比对",如果返回的 IP 属于被污染段,则丢弃重新解析。
与 AdGuard Home 的取舍
如果你只想要"去广告 + 基础加速",AdGuard Home 一个就够;但当你出现"国内快、国外抽风"的割裂现象,就需要 mosdns 做更细的分流。常见组合:客户端 DNS → AdGuard(53) → mosdns(分流) → 上游。两者共用一台机器时注意端口错开(AdGuard 用 53,mosdns 用 5335,AdGuard 的上游填 127.0.0.1:5335)。
验证与排错
- 验证分流是否生效:
dig github.com +short @192.168.1.10
dig taobao.com +short @192.168.1.10
观察前者是否走加密上游、后者是否走国内。
- 常见坑:国内公共 DNS 用 UDP 53 易被运营商限速,可改用 DoT(tls://dot.pub);geosite 数据库需定期更新否则新域名会误判;IPv6 环境下记得同时处理 AAAA 记录。
小结
DNS 分流是家庭网络里"投入小、体感强"的优化项。一条 mosdns 规则就能让国内外访问同时变快变稳,配合 AdGuard 还能顺手去广告。建议先在旁路由或一台常开设备上试点,确认解析正常再全屋切换 DNS。