Clash DNS 配置详解:nameserver、fallback 与 DNS 劫持逐项拆解
逐项讲清 Clash DNS 段的 nameserver、fallback、fallback-filter 与 enhanced-mode 劫持参数,说明国内外解析分流的原理,并给出一份可直接套用的推荐配置。
逐项讲清 Clash DNS 段的 nameserver、fallback、fallback-filter 与 enhanced-mode 劫持参数,说明国内外解析分流的原理,并给出一份可直接套用的推荐配置。
很多人第一次接触 Clash 配置文件时,会把注意力全放在 proxies 和 rules 两段——毕竟节点和分流规则看起来才是"决定能不能用"的部分。但实际排障中,相当一部分"某个网站打不开""明明用了代理还是加载国内 CDN""切换节点后网页变慢"的问题,根源都在 dns 段没配对。
原因很简单:代理规则大多数情况下按域名匹配,但网络请求最终要落到 IP 地址上。如果域名解析这一步就被污染或者走错了路径,后面规则写得再精细也救不回来。DNS 配置的核心任务,就是保证"该走代理的域名解析出真实 IP,该走直连的域名解析出国内 CDN 就近的 IP",两条路互不干扰。
Clash 和 Clash Meta(mihomo 内核)的 DNS 模块结构大同小异,常见字段可以分成三层来理解:
一个最基础的骨架大致如下:
dns:
enable: true
ipv6: false
default-nameserver:
- 223.5.5.5
- 119.29.29.29
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
nameserver:
- 223.5.5.5
- 119.29.29.29
fallback:
- https://1.1.1.1/dns-query
- https://8.8.8.8/dns-query
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
default-nameserver 是一个容易被忽略的字段:它只用来解析 nameserver、fallback 里那些写成域名形式(比如 DoH 地址)的服务器本身,必须填纯 IP,否则会出现"解析 DNS 服务器地址"这种循环依赖问题。
只有一组 nameserver 时,所有域名都走同一批服务器解析,这在有明确分流需求的场景下并不够用。nameserver-policy 允许按域名规则指定专属解析服务器,写法类似规则匹配:
dns:
nameserver-policy:
"geosite:cn":
- 223.5.5.5
- 119.29.29.29
"geosite:geolocation-!cn":
- https://1.1.1.1/dns-query
- https://8.8.8.8/dns-query
这段配置的意思是:命中 geosite:cn(国内域名合集)的请求,固定用国内 DNS 解析,拿到的自然是就近的 CDN 节点;命中海外域名合集的请求,固定用加密的境外 DNS 解析,避免国内运营商 DNS 在中间"顺手"返回一个错误结果。这样配置之后,国内网站不会因为走了境外解析而绕远路、变慢,海外网站也不会因为用了国内 DNS 而解析出无法访问的 IP。
需要注意,nameserver-policy 的匹配优先级高于普通的 nameserver,规则命中就直接生效,不会再走 fallback 判断逻辑——这是它和下面要讲的 fallback 机制最大的区别:一个是"预先分流",一个是"事后纠错"。
fallback 机制的设计初衷,是应对"不知道该走国内 DNS 还是境外 DNS"的域名——尤其是没有覆盖在 nameserver-policy 分流规则里的域名。它的判断逻辑大致是这样运作的:
nameserver 和 fallback 两组服务器;nameserver 返回的 IP 后,对照 fallback-filter 里的条件做检查;geoip-code: CN(即被判定为中国大陆 IP)或者命中了 ipcidr 列表里的地址段,就认为这个结果"可信",直接采用;fallback 服务器的解析结果。ipcidr 里常见的 240.0.0.0/4 是一段保留地址,部分运营商在 DNS 污染时会返回落在这个区间的假地址,把它加入过滤列表可以让 Clash 提前识别出污染结果。fallback-filter 还支持 domain 字段,可以按域名白名单强制走 fallback,常用于个别经常被污染的站点。
enhanced-mode 决定了 Clash 用什么方式把域名请求"接管"过来再按规则分流,常见两个取值区别很大:
Clash 会在本机接管 DNS 请求,给每个域名临时分配一个位于 fake-ip-range 区间内的虚假 IP 返回给应用程序。应用程序拿着这个假 IP 发起连接时,Clash 核心会在内部把假 IP 还原成原始域名,再按规则做真正的解析和转发。这种方式的优点是解析请求完全不出本机、不会被运营商截获,配合 TUN 模式使用时体验最完整;缺点是少数依赖真实 IP 做校验的场景(比如某些局域网设备发现、P2P 直连)可能出现异常,需要用 fake-ip-filter 把相关域名排除出去。
这种模式下 Clash 会先用配置好的 DNS 服务器把域名解析成真实 IP,再按 IP 或域名规则分流。它的兼容性更好,不容易出现"假 IP 导致程序识别异常"的问题,但解析过程本身会经过一次完整的 DNS 查询,速度略慢,且如果规则库里同时存在 IP 段规则,可能因为解析结果和实际路由地址不完全一致而出现误判。
没有特殊兼容性需求的话,启用 TUN 模式时优先选 fake-ip;如果发现某些内网工具、游戏或设备发现功能异常,再把对应域名加入 fake-ip-filter,而不是直接切回 redir-host 牺牲整体体验。
综合以上几个字段,下面这份配置适合大多数"国内直连、境外代理"的常规使用场景,可以整段替换进配置文件的 dns 段:
dns:
enable: true
ipv6: false
default-nameserver:
- 223.5.5.5
- 119.29.29.29
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- "+.stun.*.*"
- "+.stun.*.*.*"
nameserver:
- 223.5.5.5
- 119.29.29.29
fallback:
- https://1.1.1.1/dns-query
- https://8.8.8.8/dns-query
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
nameserver-policy:
"geosite:cn":
- 223.5.5.5
- 119.29.29.29
"geosite:geolocation-!cn":
- https://1.1.1.1/dns-query
- https://8.8.8.8/dns-query
这份配置的分流逻辑是:先看 nameserver-policy 有没有命中,命中就直接按对应服务器解析;没命中的走 nameserver 默认解析,再由 fallback-filter 判断结果是否可信,不可信才切到 fallback;整个过程配合 fake-ip 在本机接管,查询请求不会被运营商 DNS 截获。如果订阅商提供了自带的 DNS 优化方案,可以先保留默认配置再逐项对照替换,不必整段覆盖。
配好之后如果还是遇到问题,可以按下面几个方向定位:
nameserver-policy 没有覆盖到相关域名,或者国内 DNS 列表里只写了一个服务器且响应慢,建议补两个不同运营商的公共 DNS。fake-ip-filter,不需要整体换成 redir-host。fallback-filter 里的 ipcidr 是否包含了当地运营商常用的污染地址段,必要时把该域名加进 fallback-filter.domain 强制走 fallback。