← 返回博客

2026年软路由DNS分流与防污染完全指南:dnsmasq、SmartDNS、mosdns与AdGuard Home实战(国内外域名分流、去广告与PassWall/OpenClash协作)

📌 一分钟总结

软路由全屋代理后DNS怎么配才不浪费机场?本文用dnsmasq国内外域名分流、SmartDNS双上游测速、mosdns规则分流、AdGuard Home去广告四套方案,从安装到配置一步步拆解,讲透53端口与PassWall/OpenClash协作,附防泄漏验证、选型决策与常见坑排查。

软路由装好了、代理插件配好了、全屋设备都能科学上网了——结果发现淘宝图片转圈、京东反复弹验证码、视频网站开屏广告一个不少,奈飞偶尔还给你来个「检测到代理」。大多数人这时候会怀疑线路,其实问题往往出在更不起眼的地方:DNS。软路由把全屋流量接管之后,DNS 就不再是「运营商给什么用什么」的小事,而是决定「国内外网站谁快谁慢、广告拦不拦得住、代理稳不稳定」的总开关。本文把软路由上四套主流 DNS 方案——dnsmasq 原生分流、SmartDNS 双上游测速、mosdns 规则化分流、AdGuard Home 全家桶——从安装到配置一步步拆开,再讲清楚它们和 PassWall、OpenClash 到底怎么协作、53 端口冲突怎么解、防泄漏怎么验证。内容偏实操,命令都可以直接复制,建议收藏后按需跳读。

一、为什么软路由需要单独配一套 DNS?

先回答一个很多人没想明白的问题:手机、电脑自己都能设 DNS,为什么软路由要「多管闲事」?因为软路由一旦开了透明代理,全屋设备的 DNS 请求默认都会打到它这里,它就成了整条链路的 DNS 总出口。这个位置配不好,三个问题会同时放大:

第一,运营商 DNS 的劫持与污染。国内绝大多数宽带默认下发的是运营商 DNS。运营商 DNS 能干的事远不止解析:它可以对不存在的域名返回广告页 IP(域名抢注劫持),可以在 HTTP 页面里插跳转广告,遇到被墙的域名还可能直接返回一个错误结果。GFW 的 DNS 污染原理和表现,我在GFW 防火长城工作原理指南里有详细拆解——简单说,污染返回的是一个「假 IP」,让你访问到错误服务器或直接超时。路由器层面不处理,光靠客户端改 DNS 是治标不治本,因为总有一批设备(智能家居、游戏机、老手机)不会自己改。

第二,国内外域名混用一个 DNS,CDN 就近优势全废。国内网站基本都接入了国内 CDN,解析结果应该按你的地理位置就近分配。如果你把上游 DNS 换成 8.8.8.8 这类国外服务器,它返回的往往是中国香港或海外的 CDN 节点——于是你「科学上网成功了,国内网站反而变慢了」,淘宝图片加载半天、视频卡在缓冲。反过来,如果所有域名都走国内 DNS,国外网站又可能被污染或解析到不合适的节点。正解只有一个:国内外域名分流解析。

第三,透明代理接管后,DNS 直接决定代理体验。PassWall、OpenClash 这类插件接管流量后,有两种 DNS 处理思路:一种是「域名全交给插件,由代理端统一解析」(fake-ip 模式),另一种是「本地分流解析,只把需要代理的流量交给远端」。两种思路各有坑,选错就会出现「网页能开但很慢」「部分 App 连不上」「DNS 泄漏」等怪问题。这些在第五节和第七节细讲。

判断一套 DNS 方案好不好,不能只看解析快不快,还要看解析出来的 IP 能不能稳定连上——毕竟解析只解决「知道去哪」,连不连得动是另一回事。本文所有配置验证都跑在一条低延迟的 IEPL 专线环境上(我用自由猫做基准,专线抖动小,方便区分「是 DNS 的问题还是线路的问题」),这样得出的结论对你才有参考价值。下面先补架构基础,再上方案。

二、软路由 DNS 架构基础:dnsmasq、上游与 53 端口

OpenWrt 系固件默认带一个叫 dnsmasq 的轻量服务,它同时干两件事:给内网设备发 IP(DHCP)和帮内网设备解析域名(DNS)。默认情况下,dnsmasq 监听路由器的 53 端口,把收到的查询转发给「上游」——也就是你在固件里配的 223.5.5.5、119.29.29.29 或者运营商下发的 DNS。理解 dnsmasq 只需要抓住三个概念:

  • 监听端口:默认 53,内网所有设备的 DNS 请求都打到这;
  • 上游:dnsmasq 自己不做递归解析,它把查询转发给谁,谁就是上游;
  • 规则文件:dnsmasq 支持按域名指定不同上游,格式是 server=/example.com/1.2.3.4,意思是 example.com 这个域名及其子域,都交给 1.2.3.4 解析。

「按域名指定上游」这条能力,就是整套 DNS 分流的地基:把国内域名(一个庞大的域名列表)指给国内 DNS,其余域名走 DoH/DoT 加密上游或代理端解析。DNS 的递归查询、污染对抗、DoH/DoT 这些底层原理我不重复展开,需要补课的直接看这篇 DNS 解析原理与优化指南,本文专注软路由上的部署。

之所以强调 53 端口,是因为它是软路由上冲突最密集的地方:dnsmasq 要占 53,代理插件(PassWall、OpenClash 的某些模式)也想占 53,SmartDNS、mosdns、AdGuard Home 装上来默认还是想占 53。一台路由器上不可能两个进程同时监听同一个端口,所以方案之间的本质区别,常常就是「谁占 53、谁被指向上游」。先记住这个端口格局,后面每个方案都会回到这张图上:

组件默认端口角色
dnsmasq53DHCP + DNS 转发(默认值守者)
SmartDNS6053多上游测速择优(可选替代 53)
mosdns5335规则化分流 + 广告域名拦截
AdGuard Home3000(面板)/53(服务)去广告 + 缓存 + 日志全家桶
PassWall / OpenClash视模式而定代理流量接管(可能抢占 53)

下面四种方案按「从轻到重」排列:方案一适合只想解决国内外分流的用户,方案二三四在它基础上叠加测速、规则和去广告。建议至少把方案一跑通,再考虑升级。

三、方案一:dnsmasq 原生分流(最轻量,先跑通这个)

dnsmasq 原生分流的思路最朴素:维护一份「国内域名清单」,清单内的域名走国内 DNS,清单外的域名走国外加密 DNS。OpenWrt 社区有个现成项目 dnsmasq-china-list,把国内常见域名整理成了 dnsmasq 规则文件,还带一个「污染域名黑名单」(bogus-nxdomain),可以直接拿来用。

第 1 步:换成 dnsmasq-full

OpenWrt 默认的 dnsmasq 是精简版,不支持一些高级参数。先换成完整版(dnsmasq-full),它会接管 DHCP 功能,所以要先卸载原版再装,避免两个 dnsmasq 抢 53 端口:

opkg update
opkg remove dnsmasq
opkg install dnsmasq-full
/etc/init.d/dnsmasq enable
/etc/init.d/dnsmasq restart

第 2 步:下载国内域名清单

把 dnsmasq-china-list 生成的两个规则文件放进 dnsmasq 的配置目录。OpenWrt 上一般用 /etc/dnsmasq.d/:

mkdir -p /etc/dnsmasq.d
cd /etc/dnsmasq.d
# accelerated-domains.china.conf:国内域名走国内 DNS
# bogus-nxdomain.china.conf:把被污染的常见假 IP 全部丢弃
wget -O accelerated-domains.china.conf https://cdn.jsdelivr.net/gh/felixonmars/dnsmasq-china-list@master/accelerated-domains.china.conf
wget -O bogus-nxdomain.china.conf https://cdn.jsdelivr.net/gh/felixonmars/dnsmasq-china-list@master/bogus-nxdomain.china.conf

第 3 步:配置上游与规则目录

OpenWrt 的 dnsmasq 配置统一走 uci(写入 /etc/config/dhcp)。关键是把「解析失败不再回退到系统默认上游」(noresolv)打开,再声明规则目录,最后用 server 参数给非国内域名指定加密上游。以阿里 DNS 223.5.5.5 作为国内上游、用 https-dns-proxy 提供的本地 DoH(默认 127.0.0.1:5053)作为国外上游为例:

uci set dhcp.@dnsmasq[0].noresolv='1'
uci set dhcp.@dnsmasq[0].confdir='/etc/dnsmasq.d'
uci add_list dhcp.@dnsmasq[0].server='223.5.5.5'
uci add_list dhcp.@dnsmasq[0].server='127.0.0.1#5053'
uci commit dhcp
/etc/init.d/dnsmasq restart

这里有个新手必踩的坑:noresolv=1 只对「清单没覆盖的域名」生效。国内域名清单里的域名会命中 accelerated-domains.china.conf 里的 server=/xxx/223.5.5.5 规则,直接走国内 DNS;清单外的域名才轮到 dnsmasq 的全局 server 设置,也就是那个本地 DoH。如果你没装 https-dns-proxy 又不想折腾,临时把国外上游指向 1.1.1.1 也能跑,但明文 DNS 出公网有被运营商抢答的风险,建议至少用 DoH/DoT 兜底。

第 4 步:验证分流是否生效

重启后分别解析一个国内域名和一个国外域名,看返回的解析服务器是谁:

# 应该由国内 DNS 应答(223.5.5.5)
nslookup www.taobao.com 127.0.0.1
# 应该由 DoH 上游应答(127.0.0.1#5053 转发后的公共 DNS)
nslookup www.google.com 127.0.0.1

这套方案的优点:零额外进程、规则文件可定时自动更新、稳定性最高;缺点:没有测速择优,也没有去广告能力,国外域名的解析质量完全取决于你选的那个加密上游。它适合「只要国内网站别变慢」的轻度用户,也是后面所有方案的底座。

四、方案二:SmartDNS——双上游自动测速择优

SmartDNS 是软路由圈老牌 DNS 工具,核心卖点是「多上游 + 测速择优」:同时向多个 DNS 服务器发起查询,谁先返回且延迟低就用谁的结果,还能按域名分组指定上游。用在分流场景里的典型做法是:国内一组、国外一组,各组内部自动择优。

安装与基础配置

OpenWrt 官方源里没有 SmartDNS,一般用第三方源或直接下载 ipk 安装。装好后编辑 /etc/config/smartdns,核心配置如下:

config smartdns
    option enabled '1'
    option port '6053'              # 避开 dnsmasq 的 53
    option speed_check_mode 'ping:tcp:http'   # 测速方式
    option cache_size '4096'        # 缓存条数

config server
    option name 'china'
    option ip '223.5.5.5'
    option group 'china'

config server
    option name 'abroad'
    option ip '8.8.8.8'
    option group 'abroad'

保存后启动服务,再把 dnsmasq 的国外上游指向 SmartDNS(127.0.0.1#6053),国内域名仍然按方案一的清单走 223.5.5.5。想省事也可以让 SmartDNS 直接取代 dnsmasq 占 53,但那样 DHCP 要另想办法,一般不建议新手这么干。

/etc/init.d/smartdns enable
/etc/init.d/smartdns start
uci add_list dhcp.@dnsmasq[0].server='127.0.0.1#6053'
uci commit dhcp
/etc/init.d/dnsmasq restart

SmartDNS 解决不了的事

SmartDNS 的测速有一个容易误解的点:它测的是「哪个 DNS 服务器响应快」,不是「哪个解析结果访问快」。DNS 服务器快,只代表查询过程快;解析出来的 IP 连不连得动、晚高峰稳不稳,DNS 工具管不着。很多用户把 DNS 从运营商换成 SmartDNS 后感觉「也没快多少」,就是因为瓶颈根本不在解析环节,而在出口线路——晚高峰 DNS 秒回但视频照样缓冲的场景,十有八九卡在线路拥塞而不是解析。这也是为什么我建议解析方案和线路方案分开评估:DNS 层追求「国内就近、国外不污染」,线路层追求「冗余度够、高峰期不 collapse」。我自己在高峰期会切到多线路冗余的方案(万达云这类中转+IEPL 双线并行的机场),把「DNS 查得对」和「线路走得动」两件事同时解决,而不是只优化其中一头。

五、方案三:mosdns——规则化分流的瑞士军刀

mosdns 是近年很火的 Go 语言 DNS 工具,v5 版本用单个 YAML 配置就能实现「按域名/按 GeoIP 分流 + 广告域名拦截 + 缓存 + 自定义插件链」,规则自由度比 SmartDNS 高一个量级,内存占用却很小,很适合软路由。它的思路不是「测速择优」,而是「规则说了算」:国内域名走国内 DNS、被墙域名走 DoH、广告域名直接拒答。

安装

从 GitHub Releases 下载对应架构的二进制(x86_64 软路由选 linux-amd64),放到 /usr/bin,再准备数据目录:

wget -O /usr/bin/mosdns https://github.com/IrineSistiana/mosdns/releases/latest/download/mosdns-linux-amd64.zip
chmod +x /usr/bin/mosdns
mkdir -p /etc/mosdns

mosdns 还需要 geosite 和 geoip 数据文件(区分国内/国外域名和 IP),首次启动会自动下载,也可以手动放到 /etc/mosdns 下。

最小可用配置

一个能跑通「国内域名国内解析、其余域名 DoH 解析、广告域名拒答」的最小 config.yaml 长这样:

log:
  level: info
data_providers:
  - tag: geosite_cn
    file: /etc/mosdns/geosite_cn.txt
  - tag: geoip_cn
    file: /etc/mosdns/geoip_cn.txt
  - tag: adlist
    file: /etc/mosdns/adlist.txt
plugins:
  - tag: ad_block
    type: domain_set
    args:
      lists: [adlist]
      exps:
        - reject
  - tag: cn_forward
    type: forward
    args:
      upstreams:
        - addr: 223.5.5.5
  - tag: ab_forward
    type: forward
    args:
      upstreams:
        - addr: https://1.1.1.1/dns-query
  - tag: main_sequence
    type: sequence
    args:
      - exec: ad_block
      - matches: has_wanted_ans
        exec: reject
      - matches: qname & $geosite_cn
        exec: cn_forward
      - exec: ab_forward

配置要点:广告域名命中 adlist 直接 reject(客户端拿到空应答,连接建立失败,广告自然加载不出来);查询的域名命中 geosite_cn(国内域名库)就交给 223.5.5.5;其余域名统一走 Cloudflare 的 DoH。启动并让 dnsmasq 把上游指过来:

nohup /usr/bin/mosdns start --dir /etc/mosdns --config /etc/mosdns/config.yaml >/dev/null 2>&1 &
uci add_list dhcp.@dnsmasq[0].server='127.0.0.1#5335'
uci commit dhcp
/etc/init.d/dnsmasq restart

mosdns 的优势是灵活:你可以把「需要代理访问的域名」单独摘出来走代理端解析,也可以对特定域名做 IP 替换(比如给奈飞域名返回指定解锁 IP),玩法比前两个方案多得多。代价是配置有学习成本,YAML 写错一个缩进服务就起不来——爱折腾的用户会很喜欢,想省心的用户建议直接看方案四。

六、方案四:AdGuard Home——去广告 + 缓存 + 日志全家桶

AdGuard Home 严格说不是 DNS 分流工具,而是一台「家用 DNS 服务器」:它把去广告、加密上游、缓存、查询日志、家长控制全塞进一个 Web 面板里。对大多数家庭用户来说,它是最省心的选择——装完在网页上点几下,全屋广告少一大半,还能看到每台设备都在查什么域名。

安装与初始化

OpenWrt 上可以用官方一键脚本,也可以下 ipk 安装。装完后 AdGuard Home 默认监听 3000 端口提供初始化面板:

curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
# 安装为系统服务
/opt/AdGuardHome/AdGuardHome -s install
/opt/AdGuardHome/AdGuardHome -s start

浏览器打开 http://软路由IP:3000 走初始化向导,注意两个关键选择:

  • 监听端口:如果 dnsmasq 还要管 DHCP,AdGuard Home 就监听 127.0.0.1:5353,再由 dnsmasq 转发过来;如果想让 AdGuard Home 直接接管 53(dnsmasq 只留 DHCP 并把 DNS 交给它),在 OpenWrt 里把 dnsmasq 的 port 改成 0 即可。
  • 上游 DNS:面板的「DNS 设置 → 上游 DNS 服务器」里,按「国内一组、国外一组」填上游(223.5.5.5、119.29.29.29 / 1.1.1.1、8.8.8.8 等),再开启「并行请求」和「负载均衡」;国内国外分组靠「DNS 服务设定 → 特殊规则」里的域名表实现,或用它的「Bootstrap DNS」配合分流。

去广告与规则

AdGuard Home 的去广告靠「过滤器」:订阅规则列表后,广告域名会在 DNS 层被拦截,返回 0.0.0.0,内网设备根本拿不到广告服务器的 IP。常用的中文规则:AdGuard DNS filter、anti-AD、乘风规则。面板里「过滤器 → DNS 拦截清单 → 添加」,粘贴规则 URL 即可,几分钟生效。查询日志是另一个宝藏:能看出哪台设备在偷偷连什么域名——智能家居的外联、电视的开机广告域名、甚至内网被植入的挖矿回连,在日志里都藏不住。

AdGuard Home 的局限要心里有数:它拦的是「DNS 层广告」,对走 HTTPS 的广告(比如 YouTube 视频内嵌广告、B 站视频广告)无能为力——那些广告和视频内容走同一个加密连接,DNS 拦不掉。想拦这类广告得靠代理插件的规则分流(OpenClash 的广告规则集),DNS 层去广告和代理层去广告是互补关系,不是替代关系。内存方面,AdGuard Home 常驻占用几十 MB,256MB 内存的入门软路由跑起来偏紧,512MB 以上很轻松;低配设备建议关掉查询日志或缩短保留时间。

七、与 PassWall / OpenClash 协作:谁解析、谁代理、防泄漏

独立 DNS 工具链配好之后,最关键的整合问题来了:代理插件(PassWall、OpenClash)自己也有一套 DNS 逻辑,两套体系并存,到底谁说了算?我的推荐分工是:独立 DNS 负责「分流解析」(国内就近、国外不污染),代理插件负责「转发流量」,插件的 DNS 只处理真正走了代理的那部分域名。这样各管一段,互不打架。

实操上要注意三点:

① 53 端口归属要明确。PassWall 的「DNS 相关设置」里如果开了类似「使用 DNS 转发」的选项,它可能自己监听 53,和 dnsmasq/SmartDNS 冲突。检查方法:netstat -lntup | grep :53,看 53 端口到底被谁占着。原则是内网设备的 DNS 入口只有一个(dnsmasq 或 AdGuard Home),代理插件不要抢占 53,需要代理的域名由插件在转发时自行解析即可。OpenClash 的 DNS 模式(fake-ip 与 redir-host 的区别)在OpenClash 进阶配置指南里有完整说明,这里只提醒一句:fake-ip 模式会把域名映射成假的 198.18.x.x 地址,再在代理内核里还原——它本身是一套完整的 DNS 方案,如果你在用 OpenClash 的 fake-ip,外部再叠一层 dnsmasq 国内分流反而容易乱,二选一更稳。

② 泄漏检查必须做。DNS 分流最常见的翻车现场是「看起来配好了,实际泄漏」:内网某台设备手动把 DNS 指到了 8.8.8.8 直连,绕过了你的分流;或者 IPv6 的 DNS 通告没关,设备走 IPv6 的运营商 DNS 查询。DNS 泄漏的检测方法和修复步骤,客户端防泄漏指南里写得很全,软路由上的排查思路一样:先看内网设备拿到的 DNS 是不是路由器的内网 IP,再用 dnsleaktest.com 这类工具确认出口。真正的泄漏是「查询请求没走你的链路就出了公网」——这种情况你的分流规则全部失效,还容易被运营商抢答。

③ 流媒体与特殊场景要单独处理。DNS 分流解决的是「访问速度」和「基础防污染」,但奈飞解锁、ChatGPT 可用性这类问题,DNS 只是配角,真正决定成败的是出口 IP 类型。常见的现象是:DNS 全配好了,奈飞还是提示「检测到代理」,或者跨境电商后台登几个号就被风控——这说明出口 IP 是机房 IP,被目标站识别了。这种场景靠调 DNS 没用,需要换「干净」的出口:住宅 IP / 原生 IP 机场(仙路湾这类主打原生住宅 IP 的方案),让目标站看到的是一个普通家庭宽带的 IP,而不是数据中心 IP。流媒体解锁的完整判断方法可以参考流媒体解锁完全指南,DNS 层能做的只是确保查询不被污染、别把不该走代理的域名绕出去。

八、四套方案怎么选:对比与决策框架

四套方案不是互相排斥的,很多老玩家是「dnsmasq 分流底座 + AdGuard Home 去广告」或「mosdns 一把梭」。先看对比表,再按你的情况对号入座:

方案上手难度核心能力资源占用适合谁
dnsmasq 分流★☆☆国内外域名分流几乎为零轻度用户、低配路由
SmartDNS★★☆分流 + 双上游测速择优低追求解析速度、愿意折腾配置
mosdns★★★规则化分流 + 广告拒答 + 自定义低爱折腾、要精细规则的高级用户
AdGuard Home★☆☆去广告 + 缓存 + 日志 + 分流中(几十 MB)家庭用户、想省心 + 全屋去广告

决策框架很简单:

  • 路由器内存 ≤256MB、只想让「国内网站别被国外 DNS 拖慢」→ 方案一,dnsmasq 分流一条命令的事,最稳;
  • 家里电视、手机广告多,想让全家清净 + 能看到每台设备的查询记录 → 方案四 AdGuard Home,Web 面板点几下就完事;
  • 你是网络爱好者,想搞清楚每条查询走了谁、要最大自由度 → 方案三 mosdns,规则写明白之后一劳永逸;
  • 对解析延迟极其敏感、又不想碰 YAML → 方案二 SmartDNS,双上游测速是它的甜点区;
  • 主力诉求是奈飞原生解锁、跨境电商多账号这类「IP 纯净度」问题 → DNS 分流只是前置步骤,重点放在出口 IP 类型上(见第七节),DNS 层用方案一兜底就够。

拿最常见的家庭场景举个例子,帮你把上面的框架落到具体配置上:假设你是一台 x86 软路由(4GB 内存)跑 OpenWrt,家里有十几台设备,主力需求是「国内网站要快、电视别老弹广告、偶尔全家看奈飞」。这套需求的最优解通常是「dnsmasq 分流底座 + AdGuard Home 去广告」的组合:dnsmasq 保持 53 端口值守,负责 DHCP 和国内域名就近解析;AdGuard Home 监听 127.0.0.1:5353,只做广告拦截和查询日志;dnsmasq 把「清单外的国外域名」先发给 AdGuard Home 过滤一道,再交给 DoH 上游。这样 AdGuard Home 的规则误杀影响面可控(国内域名根本不经过它),日志也能看到国外域名的查询情况。如果你不想维护两套服务,也可以让 AdGuard Home 直接接管 53 并内部分流,代价是它的国内域名规则要自己维护,不如 dnsmasq-china-list 省心。配置顺序建议:先 dnsmasq 分流跑通(验证国内域名就近、国外域名不污染)→ 再加 AdGuard Home 去广告 → 最后做泄漏检查,每一步都验证通过再进下一步,出问题能快速定位。

内存更小的 ARM 设备(比如 R2S、R4S)建议反过来:资源有限,就别上 AdGuard Home 全家桶了,直接 mosdns 一个进程搞定分流 + 广告拒答,内存占用个位数 MB,规则还比 dnsmasq-china-list 更灵活。判断标准就一条:你的核心诉求是「省心 + 可视化」还是「低资源 + 高自由」,前者选 AdGuard Home,后者选 mosdns。

九、常见坑与排查

软路由 DNS 的坑高度集中在几个固定位置,按出现频率排:

坑 1:53 端口被占,服务起不来。症状:dnsmasq 或新装的服务反复重启失败,日志里写 address already in use。处理:netstat -lntup | grep :53 看到底是谁,把不需要占 53 的组件改到别的端口,或停掉旧服务再启动新的。

坑 2:改完重启就失效。症状:当场测试正常,路由器一重启配置全丢。处理:OpenWrt 上一切要持久化,必须写进 uci 并 uci commit(或写进 /etc/rc.local),只改运行中的内存配置不落盘,重启必丢。SmartDNS、mosdns 这类第三方服务还要记得 enable 开机自启。

坑 3:IPv6 DNS 泄漏。症状:IPv4 全走你的分流了,但设备还有 IPv6 地址,DNS 查询走 IPv6 的运营商 DNS,污染照旧。处理:在 DHCP/DNS 的 IPv6 设置里关掉 DNS 通告,或让 dnsmasq 只通告你的内网 DNS。IPv6 和代理的完整关系见IPv6 科学上网指南,坑比想象的多。

坑 4:缓存了污染结果。症状:换了上游 DNS 后某个网站还是打不开,因为 dnsmasq/AdGuard Home 的缓存里还留着污染前的坏记录。处理:清空缓存——dnsmasq 直接重启,AdGuard Home 在面板「DNS 设置 → 清空缓存」,SmartDNS 重启服务即可。

坑 5:国内域名走了国外 DNS,被验证码轰炸。症状:淘宝、京东、12306 反复弹「安全验证」。处理:检查是不是清单没生效(confdir 没配对)或 noresolv 没开,导致国内域名漏到国外上游。用 nslookup 查一个国内域名的应答服务器归属即可确认。

坑 6:换了方案全家断网。症状:改完 dnsmasq 上游后所有设备解析失败。处理:先 /etc/init.d/dnsmasq restart 恢复默认,确认新服务(SmartDNS/mosdns/AdGuard Home)真的在监听、日志无报错,再改 dnsmasq 上游——每一步改完先手动 nslookup 验证,别一口气改完再查。更系统的软路由排障方法可以看软路由故障排查指南,DNS 只是其中一层。

坑 7:广告规则误杀,正常网站打不开。症状:加了某个去广告规则后,个别网站白屏、App 登录失败、支付页面加载不出来。处理:AdGuard Home 面板的查询日志里搜那个域名,看是不是被某条规则拦截了,把域名加进「允许列表」;mosdns 则在 adlist 之外维护一个白名单 domain_set,优先级高于拦截。去广告规则的维护是个长期活,别指望一次配好永远不动——这也是为什么我建议广告规则单独放一个组件(AdGuard Home/mosdns),而不是和分流逻辑写死在一起,出问题好单独摘除。

坑 8:日志里出现大量外部 DNS 查询,说明有设备在绕过。症状:AdGuard Home 查询日志里几乎看不到某台设备的记录,但路由器 WAN 口抓包发现有设备直连 8.8.8.8:53。处理:内网设备(尤其是智能电视、某些 App)会硬编码公共 DNS,绕过你的分流。两个解法:一是在防火墙加一条规则,把内网发往 53 端口的出站请求全部 DNAT 到路由器自己;二是把这些设备手动指定 DNS 为路由器内网 IP。前者一劳永逸,后者适合设备数量少的家庭。

十、FAQ

Q1:软路由上做 DNS 分流,和我在电脑/手机客户端里改 DoH 有什么区别?

客户端改 DoH 只对那一台设备生效,而且很多 App 不走系统 DNS(自己硬编码了 8.8.8.8 之类),照样泄漏。软路由分流是网关级生效,全屋设备(包括没法设置的智能家居、游戏机)统一走你的规则,还能顺带做去广告和日志。两者不冲突,客户端 DoH 是设备级的最后一道保险。

Q2:dnsmasq-full 和原版 dnsmasq 冲突怎么办?

必须先卸载原版再装 full 版:opkg remove dnsmasq && opkg install dnsmasq-full。两个版本同时存在会抢 53 端口,DHCP 也会乱。装完确认 /etc/init.d/dnsmasq 还在、DHCP 正常下发。

Q3:用了 AdGuard Home,还需要 SmartDNS 或 mosdns 吗?

AdGuard Home 自带上游分组、并行请求和缓存,轻度用户不需要再叠 SmartDNS。mosdns 的规则自由度更高(比如按域名返回指定 IP),只有你有这类特殊需求时才值得在 AdGuard Home 前面再套一层。

Q4:我在用 OpenClash 的 fake-ip 模式,还需要 dnsmasq 国内分流吗?

fake-ip 模式下所有域名都由 OpenClash 内核统一处理,你额外叠 dnsmasq 分流会两头打架。要么用 fake-ip 全权交给 OpenClash(它内部也能配国内直连 DNS),要么关掉 fake-ip 用 redir-host + 外部 DNS 分流。别混着来。

Q5:上游 DNS 已经换成 223.5.5.5,国内网站还是慢,为什么?

先确认国内域名真的命中了国内 DNS(nslookup 看应答服务器),再确认解析出来的 IP 是国内 CDN 节点。如果都没问题,慢的原因大概率不在 DNS,而在线路——晚高峰拥塞、跨网互访都会让你觉得「网页转圈」,这时候查 DNS 是查不出结果的。

Q6:软路由只有 256MB 内存,能跑 AdGuard Home 吗?

能跑但偏紧。AdGuard Home 常驻几十 MB,加上 OpenWrt 和代理插件容易吃紧。低配机器建议:关掉查询日志、缓存调小、用 dnsmasq 分流代替 AdGuard Home 的全家桶,或者干脆上 mosdns(内存占用个位数 MB)。

Q7:AdGuard Home 能拦 YouTube 视频广告吗?

拦不了。YouTube 视频广告和视频内容走同一个 HTTPS 连接,DNS 层无法区分。DNS 去广告擅长拦的是「独立域名」的广告(网页横幅、App 开屏、电视广告),视频内嵌广告要靠代理内核的规则集去处理。

Q8:怎么确认我的软路由 DNS 没泄漏?

三步:① 内网设备查一下自己拿到的 DNS,应该是路由器内网 IP;② 浏览器开 dnsleaktest.com 或 whoer.net,看测试出口的 DNS 归属地;③ 在路由器上 tcpdump -i br-lan port 53 抓一下,确认内网 53 请求都进了你的 dnsmasq。三步都干净,才算真的没漏。

Q9:DNS 分流配好了,对游戏延迟有帮助吗?

帮助有限。游戏延迟主要由「出口线路」和「游戏服务器距离」决定,DNS 只影响进游戏前的域名解析那几十毫秒。真正对游戏有用的是 UDP 转发、游戏模式分流这些代理层面的优化——DNS 分流最多保证你解析到正确的游戏服务器 IP(不被污染带偏),别指望它降低游戏内 ping。想系统优化游戏体验,看软路由游戏加速指南那篇更对症。

Q10:我已经买了机场,还需要自己折腾软路由 DNS 吗?

看你买的是什么方案。如果你用的是客户端 App(手机、电脑上开 Clash 之类),客户端自带的 DNS 处理通常够用,不用折腾路由器。但如果你上了软路由/旁路由想「全屋代理」,路由器这一层的 DNS 就必须管——因为此时它承担的是网关职责,配不好会出现「部分设备上不了网」「国内网站变慢」这些客户端时代遇不到的问题。机场解决的是「出口线路」,DNS 分流解决的是「解析路径」,两者是上下游关系,不冲突。

Q11:升级固件或重刷 OpenWrt 之后,DNS 配置全没了怎么办?

这是软路由日常里最容易被忽视的一环:uci 配置、dnsmasq.d 规则文件、mosdns 的 YAML、AdGuard Home 的数据目录,默认都散落在系统分区里,升级固件(尤其是重刷)时很可能被清掉。建议在配置稳定后做两件事:一是把 /etc/config/smartdns、/etc/mosdns/、/etc/dnsmasq.d/ 等关键路径打包备份到外置存储或电脑上;二是把安装命令写成一个 setup.sh 脚本,重刷后跑一遍脚本就能恢复大部分配置。AdGuard Home 本身在面板里有「重写/过滤器」导出功能,规则列表记得留一份 URL 清单。别等断网那天才想起来备份——DNS 配置这种东西,恢复起来比当初配的时候痛苦十倍。

总结

软路由的 DNS 配置,本质是把「全屋的域名解析」从「运营商默认」升级成「国内就近、国外加密、广告拦截、日志可见」的自主体系。最轻的 dnsmasq 分流十分钟能跑通,最重的 AdGuard Home 全家桶一下午也能玩明白——真正拉开体验差距的,是理解 53 端口谁在值守、上游该指给谁、代理插件和独立 DNS 怎么分工这三件事。先把方案一跑通作为底座,再按家庭需求往上去广告或加规则,最后用泄漏检查收尾。DNS 这层理顺了,你会发现很多「以为要换机场才能解决」的卡顿和怪问题,其实早就解决了。

推荐阅读