Clash 的 dns 段是配置里最容易出歧义的部分。同样一段配置,有人打开网页秒开,有人一直在转圈;差别通常不在节点,而在 nameserverfallbackdns-hijack 三个字段的配合。本文按 dns 段的书写顺序,逐个字段讲清楚它为什么存在、什么时候生效。

dns 段先设对:enable、listen 与 enhanced-mode

dns 段不是一组开关,而是 Clash 内置 DNS 服务器的完整配置。它负责三件事:接收查询、决定返回什么地址、把结果交给路由规则区使用。先看最小可用形态:

dns:
  enable: true
  listen: 127.0.0.1:53
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  fake-ip-filter:
    - '*.lan'
    - '*.local'
  default-nameserver:
    - 223.5.5.5
    - 1.1.1.1
  nameserver:
    - 223.5.5.5
    - 119.29.29.29

enable 决定内置 DNS 是否运行。关闭时,系统代理模式下所有域名交给系统解析器,规则里的 GEOIPIP-CIDR 判断拿到的可能是被污染过的地址,分流自然不准。开启后,Clash 自己成为解析器,查询结果同时供规则匹配使用。

listen 决定监听地址与端口。127.0.0.1:53 只服务本机,适合纯系统代理场景;0.0.0.0:53 同时服务局域网设备和 TUN 劫持进来的查询,TUN 模式建议用后者。若 53 端口被其他程序占用,可改成 127.0.0.1:5353,但系统 DNS 与代理设置要同步指过去。

enhanced-mode 二选一:fake-ip 返回保留网段的假地址,redir-host 返回真实地址。这个字段对规则匹配的影响最大,第四节单独展开。先记住结论:TUN 模式选 fake-ip

字段作用推荐取值
enable是否运行内置 DNStrue
listen监听地址:端口系统代理用 127.0.0.1:53;TUN 用 0.0.0.0:53
ipv6是否响应 AAAA 查询false,避免 IPv6 泄漏与解析变慢
enhanced-mode返回假地址或真实地址fake-ip
fake-ip-range假地址保留网段198.18.0.1/16
default-nameserver引导解析 DoH 服务器域名223.5.5.5、1.1.1.1

nameserver 与 fallback 的分工:一条主路,一条备路

nameserver 是主解析通道。每个域名进来,默认先交给它。fallback 是备解析通道,只有当 nameserver 的结果被判定为不可信时,才会发起第二次解析,并以 fallback 的结果为准。

判定逻辑一句话:nameserver 返回的 IP 属于中国大陆,说明域名没被污染,直接用;返回境外地址,就怀疑是污染产物,交给 fallback 重查一遍。所以两个列表的选型有明确分工——nameserver 放国内 DNS 图快,fallback 放境外可信 DNS 图准。

  nameserver:
    - 223.5.5.5
    - 119.29.29.29

  fallback:
    - https://1.1.1.1/dns-query
    - https://8.8.8.8/dns-query
  • nameserver 建议用普通 UDP 查询的国内 DNS,延迟个位数毫秒,对国内 CDN 域名返回就近节点。
  • fallback 建议用 DoH,结果可信且抗污染;1.1.1.18.8.8.8 都是 IP 直写,不依赖额外解析。
  • 不要反过来:把 nameserver 填境外、fallback 填国内。所有查询都走慢速境外解析,真正需要纠错时 fallback 给的还是国内结果,机制失去意义。
  • fallback 列表里也不要混入国内 DNS,否则污染域名拿到的依然是错误 IP。

fallback 不是负载均衡,也不是并发查询取最快答案。它只在 nameserver 结果可疑时触发一次,平时不产生额外流量。

fallback-filter 的过滤逻辑:geoip、ipcidr 与 domain

fallback-filter 决定什么时候触发 fallback。它只看 nameserver 的解析结果,由三个条件组成:

  fallback-filter:
    geoip: true
    geoip-code: CN
    ipcidr:
      - 240.0.0.0/4
      - 10.0.0.0/8
      - 172.16.0.0/12
      - 192.168.0.0/16
      - 127.0.0.0/8
    domain:
      - '+.google.com'
      - '+.youtube.com'

geoipgeoip-code 是主开关。geoip: true 表示对 nameserver 返回的 IP 做地理位置判断,geoip-code: CN 表示「中国大陆 IP 视为可信」。命中这个条件,直接用 nameserver 的结果。

ipcidr 追加可信 IP 段。内网域名解析出来的私有地址没有国家归属,会被 geoip 误判成境外结果而反复触发 fallback,所以把 10.0.0.0/8172.16.0.0/12192.168.0.0/16127.0.0.0/8 列进来。240.0.0.0/4 是原版 Clash 文档示例里的保留段,保留无妨。

domain 是例外清单。写在这里的域名不经过滤,直接走 fallback。语法上 +.google.com 表示主域加所有子域,*.google.com 只表示子域。常用境外域名放进来,可以省掉一次 geoip 判断。

完整判定顺序如下:

  1. 域名命中 domain 列表 → 直接使用 fallback 结果。
  2. nameserver 返回的 IP 命中 geoip-code(CN)→ 使用 nameserver 结果。
  3. 返回的 IP 命中 ipcidr → 使用 nameserver 结果。
  4. 以上都不满足(IP 为境外)→ 用 fallback 重新解析,以 fallback 结果为准。

这套判定的代价是境外域名每次解析都可能多一次 fallback 查询,DoH 的 TLS 握手会抬高首包延迟。对延迟敏感的场景,可以用 nameserver-policy 为个别域名直接指定解析器,绕开整套判定:

  nameserver-policy:
    '+.baidu.com': 223.5.5.5
    '+.taobao.com': 223.5.5.5
    '+.google.com': https://8.8.8.8/dns-query

TUN 模式下的 DNS 劫持:为什么必须配合 Fake-IP

TUN 模式把全部 IP 流量收进虚拟网卡,看似 DNS 查询也会被接管。但系统解析器可能把查询发给任意 DNS 服务器——路由器地址、运营商 DNS、应用自带的 DoH——这些流量虽然进了 TUN,却未必经过内置 DNS。

dns-hijack 就是补这个缺口:在虚拟网卡上拦截所有发往 53 端口的 UDP 与 TCP 流量,强制重定向到内置 DNS。

tun:
  enable: true
  stack: system
  dns-hijack:
    - any:53

劫持解决「DNS 查询进内核」的问题,接下来还要解决「域名信息能不能带到连接阶段」的问题,这就是 enhanced-mode 的事。

fake-ip 模式下,内置 DNS 对查询返回 198.18.0.0/16 保留段的假地址,同时在内核记录域名与假地址的映射。应用拿着假地址发起连接,流量进 TUN 后,内核按映射还原出原始域名,再交给规则区匹配。DOMAIN-SUFFIXDOMAIN-KEYWORD 这类规则因此继续有效。

redir-host 模式下,内置 DNS 返回真实地址。应用直接连接真实 IP,流量进 TUN 时只剩 IP 包,规则区没有域名可匹配,只能靠 GEOIPIP-CIDR 兜底。CDN 域名与需要精确分流的场景,规则会大面积失效。这个模式在系统代理下没问题——域名由 HTTP CONNECT 请求携带——问题只出在 TUN 模式。

结论:劫持保证查询进内核,fake-ip 保证域名不丢。两者缺一,就会出现「规则全走直连」或「规则全走代理」的两极现象,而且日志里很难看出原因。

只开 dns-hijackenhanced-mode 保持 redir-host,是 TUN 模式下最隐蔽的配置错误:网页能开,但所有域名规则都不命中。

fake-ip 还有一个配套字段 fake-ip-filter:需要真实地址的域名要排除在外。局域网设备、.lan.local 后缀、本地服务的域名写进这里,否则拿到假地址后无法访问。

一套可直接落地的完整配置

把前面的字段合成一份可用的配置,取值逻辑如下:nameserver 用国内普通 DNS 保证速度;fallback 用境外 DoH 保证污染域名能纠正;fake-ip 让域名规则在 TUN 模式下继续生效;dns-hijackany:53 覆盖所有 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
    - 1.1.1.1
  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
      - 10.0.0.0/8
      - 172.16.0.0/12
      - 192.168.0.0/16
      - 127.0.0.0/8
    domain:
      - '+.google.com'
      - '+.youtube.com'
      - '+.github.com'

tun:
  enable: true
  stack: system
  dns-hijack:
    - any:53

落地后逐条核对这六个位置,是排查 DNS 问题的标准动作:

  • default-nameserver 不能省。它负责解析 DoH 服务器自身的域名,缺失时 doh.pub 这类域名形式的 DoH 无法建立连接;IP 直写的 1.1.1.1 不受影响,但保留总是稳妥。
  • dns-hijackany:53,不要写 8.8.8.8:53。后者只劫持发往该地址的查询,系统 DNS 一变就失效。
  • fake-ip-filter 务必排除内网域名,否则局域网设备访问异常。
  • TUN 模式不要用 redir-host。域名规则失效是「能上网但分流全错」最常见的根源。
  • 53 端口被占用时,listen127.0.0.1:5353,系统 DNS 同步改,不要只改一半。
  • 改完配置先看调试日志里的 dns 输出,再用 dignslookup 查询内置 DNS,确认返回的是假地址还是真实地址。

DNS 配置没有万能模板,只有一套自洽逻辑:nameserver 负责快,fallback 负责准,fallback-filter 决定何时切换,fake-ip 负责把域名信息送到规则区。照着这个顺序核对,大多数解析异常都能定位到具体字段。