Clash DNS 配置详解:nameserver、fallback 与域名劫持处理
域名解析是 Clash 规则分流的前置环节:规则按域名匹配、按 IP 归属地判断,都依赖一份干净、可控的解析结果。本文按配置字段逐层拆解 Clash 内置 DNS 的工作方式,讲清 nameserver 与 fallback 的分工、一次查询的完整路径,以及 DNS 泄漏、53 端口劫持、结果污染三类典型故障的定位与处理。
DNS 为什么是分流的地基
Clash 的绝大多数规则以域名为匹配对象:DOMAIN、DOMAIN-SUFFIX、GEOSITE 都直接看域名;GEOIP、IP-CIDR 这类规则则需要先把域名解析成 IP 才能判断。也就是说,一次连接该走直连还是代理,答案的一半藏在 DNS 应答里。
如果解析环节交给系统默认 DNS,而这条链路又被运营商劫持或投毒,Clash 拿到的就是错误答案:国内站点被解析到境外地址从而误走代理,或者相反。更隐蔽的情况是查询经由境外明文 UDP 发出,中途被抢答,返回结果与查询目标完全无关,分流也就无从谈起。
因此 Clash 内置了一个 DNS 服务器:开启后,系统或 TUN 接口把域名查询统一交给 Clash,由它按照配置的上游、策略与缓存集中应答。增强模式(enhanced-mode)进一步决定应答的方式:redir-host 返回真实解析结果,fake-ip 则先返回一个假地址,等连接真正到来时再反查域名做规则判断。
增强模式之一。对查询立即返回 198.18.0.0/16 段内的假地址并记录映射,连接到来时反查域名再匹配规则,走代理的域名无需真实解析。
增强模式之一。先向上游完成真实解析再应答,所有域名都要经过一次完整查询,结果质量受上游链路影响。
链路上的中间设备抢答或改写 DNS 应答,使查询者得到与真实记录不符的 IP,最常见于明文 UDP 53 查询。
配置骨架:enable、listen 与 enhanced-mode
DNS 模块的入口是配置文件中的 dns 段。最小可用骨架如下:
dns:
enable: true
listen: 0.0.0.0:53
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- "*.localhost"
- time.*.com
- ntp.*.com
- localhost.ptlogin2.qq.com
逐字段说明:
- enable:总开关。为 false 时 Clash 不监听 DNS,域名解析交还系统,规则中的 IP 判断只能依赖系统解析结果。
- listen:监听地址与端口。0.0.0.0:53 表示接管本机所有网卡的 53 端口,需要相应权限;图形客户端通常会自动完成授权与系统 DNS 指向。
- ipv6:是否应答 AAAA 查询。网络不具备 IPv6 出口时保持 false,可避免应用优先尝试不可达的 v6 地址。
- enhanced-mode:增强模式,取 fake-ip 或 redir-host,语义见上文术语卡。
- fake-ip-range:假地址池,默认 198.18.0.1/16。该段属于基准测试保留地址,正常网络中不会出现真实主机;若内网确实占用此段,需另选一段。
- fake-ip-filter:假地址豁免名单。名单内域名不做假地址应答,直接真实解析。局域网域名、NTP 授时、部分依赖 STUN 的语音与游戏服务通常需要列入。
53 端口被占用是 DNS 模块最常见的启动失败原因。Linux 桌面的 systemd-resolved、Windows 的 Internet 连接共享都会占用 53。可将 listen 改为 0.0.0.0:1053 并配合 TUN 模式接管,或停用占用方。
nameserver 与 fallback:两组上游的分工
nameserver 是默认上游列表。一次真实解析发起时,Clash 向列表内所有上游并发查询,取最先返回的应答。它承担绝大多数域名的解析,尤其是需要低延迟、按本地运营商调度结果的国内域名,因此通常填写国内公共 DNS 的 DoH 地址。上游地址支持四种写法:纯 IP(明文 UDP)、tls:// 加域名(DoT)、https:// 加路径(DoH)、dhcp:// 加网卡名(跟随系统分配)。
fallback 是原版 Clash 的对照上游机制。它与 nameserver 同时被查询,但结果默认不被采用;只有当 nameserver 的应答未通过 fallback-filter 的检验时,Clash 才改用 fallback 的结果。设计意图是:国内上游快但可能被人为改写,境外上游慢但可信,用过滤器在两者之间择优。fallback-filter 提供三种判据:
- geoip 与 geoip-code:nameserver 应答 IP 的归属国家代码不等于设定值(默认 CN)时,判定结果可疑,采用 fallback。
- ipcidr:应答 IP 落入名单网段(如保留段 240.0.0.0/4)时,判定为污染。
- domain:名单内域名无条件使用 fallback 的应答。
| 维度 | nameserver | fallback |
|---|---|---|
| 角色 | 默认上游,承担绝大多数解析 | 可信对照上游,结果默认不采用 |
| 典型选择 | 国内公共 DNS 的 DoH 地址 | 境外公共 DNS 的 DoH / DoT 地址 |
| 查询时机 | 每次真实解析均并发查询 | 与 nameserver 同时并发查询 |
| 结果采用条件 | 应答通过 fallback-filter 检验 | nameserver 应答未通过检验 |
| mihomo 现状 | 保留,配合 nameserver-policy 使用 | 已标记弃用,不建议新配置使用 |
两点需要特别注意。其一,fallback 上游必须使用 DoH 或 DoT 这类加密通道:若 fallback 本身也是明文 UDP,它的查询同样会被劫持,对照机制形同虚设。其二,mihomo(Meta 内核)已将 fallback 与 fallback-filter 标记为弃用,官方建议改用 nameserver-policy 按域名集合显式分流,语义更直接,后文详述。
一次域名查询的完整路径
应用发起查询
系统 DNS 指向 Clash 的监听地址,或由 TUN 接口在网络层截获,查询进入 Clash 内置 DNS 服务器。
fake-ip 判定
增强模式为 fake-ip 且域名不在豁免名单内时,立即返回 198.18.x.x 假地址并记录映射;名单内域名则进入真实解析流程。
连接到来,反查域名
应用向假地址发起连接,Clash 反查出原始域名,先按域名完成规则匹配,决定直连或交给哪个代理节点。
需要 IP 时真实解析
命中 GEOIP、IP-CIDR 规则或目标需要直连时,先查 nameserver-policy 是否有专用上游,未命中则走 nameserver 并发查询。
污染检验与应答
原版 Clash 用 fallback-filter 检验 nameserver 结果,不通过则采用 fallback 应答;最终结果写入缓存,后续相同查询直接命中缓存返回。
nameserver-policy 与 proxy-server-nameserver
nameserver-policy 按域名或域名集合指定专用上游,优先级高于 nameserver。mihomo 支持以 geosite: 前缀引用域名集合,一行配置即可让整组域名走指定上游,这正是它取代 fallback 的原因:分流依据写在明处,不再依赖事后的结果检验。
proxy-server-nameserver 专用于解析节点服务器的域名。订阅里的节点地址若是域名,必须先解析出 IP 才能建立代理连接;若用普通上游经代理解析,就形成循环依赖。这一项必须填写直连可达的上游。default-nameserver 则是引导上游:配置中的 DoH、DoT 上游本身也是域名,需要一组纯 UDP 上游先把这些域名解析出来。
dns:
default-nameserver:
- 223.5.5.5
- 119.29.29.29
proxy-server-nameserver:
- https://dns.alidns.com/dns-query
nameserver:
- https://dns.alidns.com/dns-query
- https://doh.pub/dns-query
nameserver-policy:
"geosite:cn":
- https://dns.alidns.com/dns-query
- https://doh.pub/dns-query
"geosite:geolocation-!cn":
- https://1.1.1.1/dns-query
- https://dns.google/dns-query
"+.corp.example.com":
- 10.0.0.2
这份示例中,国内域名集合走阿里与腾讯的 DoH,境外集合走 Cloudflare 与 Google 的 DoH,企业内部域名指向内网 DNS;nameserver 作为未命中策略时的默认出口。境外 DoH 上游的查询本身经代理发出,链路可信,不再需要 fallback 那套事后比对。
泄漏、劫持与污染:三类典型故障的处理
DNS 泄漏
浏览器自带的安全 DNS(Chrome、Edge 默认开启)会绕过系统 DNS 直接发起 DoH 查询,Clash 看不到域名,只能按 IP 匹配规则,分流精度明显下降。处理方式是关闭浏览器的安全 DNS 选项,或启用 TUN 模式在网络层接管全部流量,让浏览器无论向谁查询都先经过 Clash。
53 端口劫持
明文 UDP 53 查询在链路上可被任意中间节点抢答,境外 UDP 上游在国内网络环境下几乎必然得到抢答结果。凡是写进配置的上游,出境方向一律使用 DoH 或 DoT;nameserver 中不应出现境外明文 UDP 地址。
结果污染
fake-ip 模式下,走代理的域名根本不需要真实解析结果,污染无从进入决策;需要直连的域名交给国内 DoH 上游,受污染概率很低。若个别域名解析异常,先检查 fake-ip-filter 是否需要补充,再通过客户端日志确认该域名实际命中的上游。
nameserver 里出现 8.8.8.8 之类的境外明文 UDP,是配置审计中最常见的错误。它不会带来更准的结果,只会引入抢答污染与额外的超时等待。
参考配置与核对清单
综合上文,一份可直接套用的 mihomo 风格 DNS 配置如下:
dns:
enable: true
listen: 0.0.0.0:1053
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- time.*.com
- ntp.*.com
default-nameserver:
- 223.5.5.5
- 119.29.29.29
proxy-server-nameserver:
- https://dns.alidns.com/dns-query
nameserver:
- https://dns.alidns.com/dns-query
- https://doh.pub/dns-query
nameserver-policy:
"geosite:geolocation-!cn":
- https://1.1.1.1/dns-query
- https://dns.google/dns-query
启用前逐项核对:
- enable 为 true,listen 端口未被其他服务占用;
- 系统 DNS 已指向 Clash,或已开启 TUN 模式;
- nameserver 使用国内 DoH,境外上游全部走加密通道;
- proxy-server-nameserver 已配置且直连可达,节点域名能正常解析;
- fake-ip-filter 包含局域网与授时域名;
- 客户端日志中无持续的 DNS 超时记录。
DNS 配置完成后,规则分流才有可靠的地基。后续的自定义规则编写与策略组设计,都可以在这份干净的解析结果之上展开。