Clash DNS 配置详解:nameserver、fallback 与 DNS 劫持的关系

解释 Clash DNS 模块中 nameserver、fallback、enhanced-mode 各自的作用与取值,说明 DNS 劫持场景下的正确配置方式。

DNS 模块在 Clash 里的位置

Clash 的分流规则分两类:按域名匹配(DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD)与按 IP 匹配(IP-CIDR、GEOIP)。按 IP 的规则必须先拿到域名对应的地址才能判定走向,因此 Clash 内置了完整的 DNS 解析模块,而不是把解析交还给操作系统。域名规则在连接进入时即可匹配,IP 规则则依赖 DNS 模块给出的解析结果,两者共同决定一次连接进哪条策略组。

系统默认 DNS 通常是运营商下发的明文 UDP 53 服务,查询内容全程可见、可被中间设备改写。Clash 接管 DNS 之后,查询走哪条链路、用什么协议、采信哪份结果,全部可在配置里固定下来,这是 nameserver、fallback、enhanced-mode 这些字段存在的前提。

dns 段的总开关是 enable;listen 决定 Clash 在哪个地址与端口上应答查询,常见写法 0.0.0.0:53。桌面客户端开启系统代理或 TUN 模式时,一般会自动把系统 DNS 指向这个监听地址,局域网内其他设备也可以把 DNS 手动指过来,实现查询统一收口。

nameserver:主上游与取值写法

nameserver 是 Clash 的主解析链路,列表内每一项支持三种形态:

  • 纯 IP,如 223.5.5.5,走传统明文 UDP 53,延迟最低;
  • tls://1.1.1.1:853,DNS over TLS,查询走加密的 853 端口;
  • https://doh.pub/dns-query,DNS over HTTPS,查询封装在 HTTPS 请求里。

列表的语义是并发竞速,而不是主备:Clash 会同时向列表内全部上游发起查询,采用最先返回的结果。因此 nameserver 里放 2~3 个低延迟上游即可,堆叠更多条目不会提升可靠性,只会放大出口流量。

与 nameserver 配套的是 default-nameserver,它是整条链路的引导解析器。DoH、DoT 上游本身以域名形式给出,解析“解析器自己的域名”时不能再依赖这些上游,否则形成循环依赖。default-nameserver 必须填可以直接 UDP 访问的纯 IP,例如 223.5.5.5119.29.29.29,只在启动阶段使用,平日查询不经过它。

default-nameserver 只写纯 IP

不要把 https://tls:// 形式填进 default-nameserver。它是 DNS 链路的起点,职责是解析 DoH、DoT 服务器的域名,本身必须不依赖任何加密上游。

fallback 与 fallback-filter:备用结果的判定逻辑

对 fallback 最常见的误解是“主上游挂了才启用”。实际行为是:配置 fallback 后,Clash 对同一域名会同时查询 nameserver 与 fallback 两组上游,然后按 fallback-filter 的规则决定采信哪一份结果。fallback 是结果筛选机制,不是故障转移机制。

默认判定条件是 geoip: truegeoip-code: CN:若 nameserver 返回的 IP 归属中国大陆,采用 nameserver 的结果;否则改用 fallback 的结果。这条逻辑的意图很直接——境内域名信任境内低延迟上游,境外域名的解析结果只信任加密出境的上游。

fallback-filter 还有两个补充条件:ipcidr 列出不可信的网段,返回 IP 落入其中(例如保留段 240.0.0.0/4)即判定结果被污染,强制采用 fallback;domain 列出直接走 fallback 结果的域名,适合个别确认会被投毒的目标。

一个前提不能省:fallback 上游必须全部使用 DoH 或 DoT。如果 fallback 里填明文 UDP 地址,境外域名的查询仍以明文出网,劫持与投毒问题原样保留,fallback 机制形同虚设。

enhanced-mode:fake-ip 与 redir-host 的分歧

enhanced-mode 决定 Clash 如何回应应用发起的 DNS 请求,两个取值对应两条路线。

redir-host 是传统模式:Clash 收到域名连接后先做一次真实解析,拿到 IP 再按规则转发。行为直观、兼容性最好,代价是本地会产生真实的 DNS 查询,这些查询途经网络时存在被劫持、被记录的窗口。

fake-ip 是默认推荐:Clash 对需要解析的域名直接返回 fake-ip-range(默认 198.18.0.1/16)段内的一个假地址,应用连接这个假地址时,Clash 反查出原始域名并按域名规则分流,真正的解析推迟到代理出口一侧完成。本地几乎不再发起真实域名查询,劫持者拿不到可改写的明文请求,延迟也少一次往返。

fake-ip-filter 列出不应返回假地址的域名。局域网域名(*.lan*.local)、NTP 校时、STUN 打洞类服务必须拿到真实 IP 才能工作,收到假地址会直接异常,这些条目要保留在过滤列表里。fake-ip 与局域网共享代理、部分 P2P 联机场景存在兼容问题,遇到异常时退回 redir-host 即可,两种模式可以随时切换对比。

dns 段字段速查

字段作用常见取值
enableDNS 模块总开关true
listen应答查询的监听地址端口0.0.0.0:53
ipv6是否返回 AAAA 记录false
enhanced-mode应答模式fake-ip / redir-host
fake-ip-range假地址分配段198.18.0.1/16
fake-ip-filter不返回假地址的域名*.lan、*.local 等
default-nameserver引导解析器,解析上游域名223.5.5.5
nameserver主上游,并发竞速DoH / DoT / 纯 IP
fallback备用上游,按 filter 采信DoH / DoT
fallback-filter结果采信判定条件geoip、ipcidr、domain

DNS 劫持的机制与配置对策

DNS 劫持的典型机制:明文 UDP 53 查询途经运营商网关时,网关抢在真实上游之前返回伪造应答,把域名指向错误的 IP。外在表现是访问正常站点被带到无关页面、同一域名在不同网络下解析出差异巨大的结果。劫持针对的是“明文”与“53 端口”这两个特征,对策也围绕这两点展开。

下面四条同时成立,防劫持才算闭环:

  1. nameserver 与 fallback 全部使用 DoH、DoT,查询内容加密,中间设备读不到也改不了报文。
  2. enhanced-mode 使用 fake-ip,本地不再为走代理的域名发起真实解析,攻击面进一步收缩。
  3. 系统 DNS 指向 Clash 的 listen 地址,或开启 TUN 模式接管全部流量,所有查询收口进 Clash 内部。
  4. fallback-filter 保持 geoip 判定,境外域名的结果只来自加密上游,境内结果来自低延迟本地上游。

验证配置是否生效

把客户端日志级别调到 debug,观察 dns 相关输出;再用 dig @127.0.0.1 域名 分别测试境内与境外域名,对比返回的 IP 是否符合分流预期——境内域名应得到本地运营商附近的结果,走代理的域名在 fake-ip 模式下应返回 198.18 段地址。

可直接套用的完整示例

下面这段 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.ptlogin2.qq.com"
  default-nameserver:
    - 223.5.5.5
    - 119.29.29.29
  nameserver:
    - https://doh.pub/dns-query
    - https://dns.alidns.com/dns-query
  fallback:
    - https://dns.google/dns-query
    - tls://1.1.1.1:853
  fallback-filter:
    geoip: true
    geoip-code: CN
    ipcidr:
      - 240.0.0.0/4
    domain:
      - "+.example.com"

要点回顾:default-nameserver 两个纯 IP 负责引导;nameserver 两个境内 DoH 并发竞速;fallback 两个加密境外上游;fallback-filter 用 geoip-code CN 做采信分界,ipcidr 挡掉保留段污染,domain 列表按需增删个别域名。fake-ip-filter 里的条目按实际局域网环境补充,出现某服务异常时优先怀疑它缺了过滤条目。

mihomo(Clash Meta)里的演进

mihomo 内核完整兼容上述字段,老的 dns 配置可以原样平移。在此之上,它新增了几个更细的字段,适合逐步迁移:

  • nameserver-policy:按域名后缀规则指定上游,比 fallback 的二元判定精细,可以把某一组域名固定交给指定 DoH,实现多条解析链路并存;
  • proxy-server-nameserver:专门解析配置里节点服务器的域名,避免节点域名被污染导致整组代理不可用;
  • direct-nameserver:为直连流量单独指定解析链路,与代理域名解耦;
  • respect-rules:让 DNS 查询本身也按分流规则选择出口,境外上游的 DoH 请求经代理发出,进一步压低被干扰的概率。

迁移建议:新写的 mihomo 配置优先用 nameserver-policy 表达分流意图,把 fallback 留作兜底;老配置不必急于重写,先确认 fallback-filter 行为符合预期,再逐条迁移。

下载客户端,动手配置 DNS

dns 段写法在各家 Clash 客户端里通用。先到下载中心按平台装好客户端,再按本文调整 nameserver、fallback 与 enhanced-mode。

下载Clash