Clash DNS 配置详解:nameserver、fallback 与 DNS 劫持三段到底怎么填
从 dns 段的 enable、listen 开始,逐字段解释 nameserver 与 fallback 的分工、fallback-filter 的过滤逻辑,以及 TUN 模式下 DNS 劫持为什么必须配合 Fake-IP 才能生效。
Clash 的 dns 段是配置里最容易出歧义的部分。同样一段配置,有人打开网页秒开,有人一直在转圈;差别通常不在节点,而在 nameserver、fallback 与 dns-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 是否运行。关闭时,系统代理模式下所有域名交给系统解析器,规则里的 GEOIP、IP-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 | 是否运行内置 DNS | true |
| 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.1与8.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'
geoip 与 geoip-code 是主开关。geoip: true 表示对 nameserver 返回的 IP 做地理位置判断,geoip-code: CN 表示「中国大陆 IP 视为可信」。命中这个条件,直接用 nameserver 的结果。
ipcidr 追加可信 IP 段。内网域名解析出来的私有地址没有国家归属,会被 geoip 误判成境外结果而反复触发 fallback,所以把 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、127.0.0.0/8 列进来。240.0.0.0/4 是原版 Clash 文档示例里的保留段,保留无妨。
domain 是例外清单。写在这里的域名不经过滤,直接走 fallback。语法上 +.google.com 表示主域加所有子域,*.google.com 只表示子域。常用境外域名放进来,可以省掉一次 geoip 判断。
完整判定顺序如下:
- 域名命中
domain列表 → 直接使用fallback结果。 nameserver返回的 IP 命中geoip-code(CN)→ 使用nameserver结果。- 返回的 IP 命中
ipcidr→ 使用nameserver结果。 - 以上都不满足(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-SUFFIX、DOMAIN-KEYWORD 这类规则因此继续有效。
redir-host 模式下,内置 DNS 返回真实地址。应用直接连接真实 IP,流量进 TUN 时只剩 IP 包,规则区没有域名可匹配,只能靠 GEOIP、IP-CIDR 兜底。CDN 域名与需要精确分流的场景,规则会大面积失效。这个模式在系统代理下没问题——域名由 HTTP CONNECT 请求携带——问题只出在 TUN 模式。
结论:劫持保证查询进内核,fake-ip 保证域名不丢。两者缺一,就会出现「规则全走直连」或「规则全走代理」的两极现象,而且日志里很难看出原因。
只开 dns-hijack 而 enhanced-mode 保持 redir-host,是 TUN 模式下最隐蔽的配置错误:网页能开,但所有域名规则都不命中。
fake-ip 还有一个配套字段 fake-ip-filter:需要真实地址的域名要排除在外。局域网设备、.lan 与 .local 后缀、本地服务的域名写进这里,否则拿到假地址后无法访问。
一套可直接落地的完整配置
把前面的字段合成一份可用的配置,取值逻辑如下:nameserver 用国内普通 DNS 保证速度;fallback 用境外 DoH 保证污染域名能纠正;fake-ip 让域名规则在 TUN 模式下继续生效;dns-hijack 用 any: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-hijack写any:53,不要写8.8.8.8:53。后者只劫持发往该地址的查询,系统 DNS 一变就失效。fake-ip-filter务必排除内网域名,否则局域网设备访问异常。- TUN 模式不要用
redir-host。域名规则失效是「能上网但分流全错」最常见的根源。 - 53 端口被占用时,
listen改127.0.0.1:5353,系统 DNS 同步改,不要只改一半。 - 改完配置先看调试日志里的
dns输出,再用dig或nslookup查询内置 DNS,确认返回的是假地址还是真实地址。
DNS 配置没有万能模板,只有一套自洽逻辑:nameserver 负责快,fallback 负责准,fallback-filter 决定何时切换,fake-ip 负责把域名信息送到规则区。照着这个顺序核对,大多数解析异常都能定位到具体字段。