Clash DNS 配置详解:nameserver、fallback 与域名劫持处理

域名解析是 Clash 规则分流的前置环节:规则按域名匹配、按 IP 归属地判断,都依赖一份干净、可控的解析结果。本文按配置字段逐层拆解 Clash 内置 DNS 的工作方式,讲清 nameserver 与 fallback 的分工、一次查询的完整路径,以及 DNS 泄漏、53 端口劫持、结果污染三类典型故障的定位与处理。

53 默认监听端口·fake-ip 增强模式·198.18.0.0/16 假地址段·DoH / DoT 加密上游

DNS 为什么是分流的地基

Clash 的绝大多数规则以域名为匹配对象:DOMAIN、DOMAIN-SUFFIX、GEOSITE 都直接看域名;GEOIP、IP-CIDR 这类规则则需要先把域名解析成 IP 才能判断。也就是说,一次连接该走直连还是代理,答案的一半藏在 DNS 应答里。

如果解析环节交给系统默认 DNS,而这条链路又被运营商劫持或投毒,Clash 拿到的就是错误答案:国内站点被解析到境外地址从而误走代理,或者相反。更隐蔽的情况是查询经由境外明文 UDP 发出,中途被抢答,返回结果与查询目标完全无关,分流也就无从谈起。

因此 Clash 内置了一个 DNS 服务器:开启后,系统或 TUN 接口把域名查询统一交给 Clash,由它按照配置的上游、策略与缓存集中应答。增强模式(enhanced-mode)进一步决定应答的方式:redir-host 返回真实解析结果,fake-ip 则先返回一个假地址,等连接真正到来时再反查域名做规则判断。

fake-ipfake-ip mode

增强模式之一。对查询立即返回 198.18.0.0/16 段内的假地址并记录映射,连接到来时反查域名再匹配规则,走代理的域名无需真实解析。

redir-hostredir-host mode

增强模式之一。先向上游完成真实解析再应答,所有域名都要经过一次完整查询,结果质量受上游链路影响。

域名劫持DNS hijacking

链路上的中间设备抢答或改写 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 的应答。
维度nameserverfallback
角色默认上游,承担绝大多数解析可信对照上游,结果默认不采用
典型选择国内公共 DNS 的 DoH 地址境外公共 DNS 的 DoH / DoT 地址
查询时机每次真实解析均并发查询与 nameserver 同时并发查询
结果采用条件应答通过 fallback-filter 检验nameserver 应答未通过检验
mihomo 现状保留,配合 nameserver-policy 使用已标记弃用,不建议新配置使用

两点需要特别注意。其一,fallback 上游必须使用 DoH 或 DoT 这类加密通道:若 fallback 本身也是明文 UDP,它的查询同样会被劫持,对照机制形同虚设。其二,mihomo(Meta 内核)已将 fallback 与 fallback-filter 标记为弃用,官方建议改用 nameserver-policy 按域名集合显式分流,语义更直接,后文详述。

一次域名查询的完整路径

  1. 应用发起查询

    系统 DNS 指向 Clash 的监听地址,或由 TUN 接口在网络层截获,查询进入 Clash 内置 DNS 服务器。

  2. fake-ip 判定

    增强模式为 fake-ip 且域名不在豁免名单内时,立即返回 198.18.x.x 假地址并记录映射;名单内域名则进入真实解析流程。

  3. 连接到来,反查域名

    应用向假地址发起连接,Clash 反查出原始域名,先按域名完成规则匹配,决定直连或交给哪个代理节点。

  4. 需要 IP 时真实解析

    命中 GEOIP、IP-CIDR 规则或目标需要直连时,先查 nameserver-policy 是否有专用上游,未命中则走 nameserver 并发查询。

  5. 污染检验与应答

    原版 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 配置完成后,规则分流才有可靠的地基。后续的自定义规则编写与策略组设计,都可以在这份干净的解析结果之上展开。

下载Clash