机场实测室JICHANGTUIJIAN.MOM
搜索线路 / 教程/
客户端教程

Clash 的 DNS 怎么设:防污染、防泄漏与国内解析

一句话结论

多数人并不需要手动改 DNS,机场下发的配置通常已经设好 fake-ip 与国内外分流解析。只有出现节点能连但网页打不开、国内网站被解析到国外 IP、开了代理仍被识别真实地区这三类现象时才值得动手。改之前先确认自己用的是 fake-ip 还是 redir-host,两者排查方式完全不同。

DNS 是整条链路里最沉默的一段。它不出现在节点列表上,没有延迟数字,配置文件里那十几行也很少有人细看——直到某天节点全绿、开关全开,而网页就是打不开,或者你人在国内、代理开着,某个网站却坚持认为你在上海。

这些现象的共同点是:数据通道没问题,出问题的是「名字翻译成地址」这一步。浏览器要访问一个网站,先得把域名换成 IP,这个动作发生在真正发送请求之前。如果翻译结果是错的,后面的代理链路再完美,请求也送到了错误的地方。

好消息是,这一层多数人根本不需要碰。机场下发的配置通常已经把国内外分流解析写好了,能正常上网就是它在工作的证据。真正值得动手的场景只有三类,下面会逐一说清。在此之前,得先弄明白你手上跑的是哪一套解析模式,因为 fake-ip 和 redir-host 的排查方法几乎没有交集。

Clash 的 DNS 在整条链路的哪个位置起作用?

把一次访问拆开看,顺序是这样的:应用发起请求 → 域名被解析成地址 → 流量按规则决定走代理还是直连 → 数据经节点传出。Clash 的 DNS 模块插在第二步,它会接管本机的解析请求,而不是让系统直接去问运营商的 DNS 服务器。

接管这件事本身解决了两个问题。一是防污染:某些域名在公网解析时会拿到被篡改的错误地址,由 Clash 转发给境外解析服务器就能绕过。二是让分流规则有依据:很多规则是按域名匹配的,如果域名在 Clash 看到之前就已经变成了 IP,基于域名的规则就全部失效了——这也是规则分流必须和 DNS 配合的原因。

# 结构示例:一段典型的 dns 配置,所有服务器地址均已替换为占位域名
dns:
  enable: true
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  fake-ip-filter: # 这些域名不参与 fake-ip,返回真实地址
    - '*.lan'
    - 'localhost.ptlogin2.example.invalid'
  nameserver: # 国内解析服务器
    - 223.5.5.5
    - https://dns-cn.example.invalid/dns-query
  fallback: # 国外域名的解析服务器,走代理
    - https://dns-global.example.invalid/dns-query
  fallback-filter:
    geoip: true
    geoip-code: CN

这段配置的意义不在于抄走,而在于认出结构:nameserver 管国内、fallback 管国外、fallback-filter 负责在两者冲突时做裁决。看懂这三块,后面的排查就有了坐标。

fake-ip 和 redir-host 有什么区别?我用的是哪种?

这是本文最关键的一个分叉。两种模式对同一个域名的处理方式截然不同。

fake-ipredir-host
解析动作立刻返回一个保留网段的假地址,不做真实解析老老实实做一次真实解析,拿到公网地址
真实解析发生在节点那一端你本机这一端
首次访问速度快,省掉一次等待慢,要等解析返回
抗污染能力强,本地根本不解析取决于用的是哪个解析服务器
常见副作用部分依赖真实 IP 的应用会异常解析结果可能被污染或泄漏
典型识别特征查询国外域名返回 198.18 开头的地址查询国外域名返回真实公网地址

判断自己在用哪种,最直接的办法是看配置文件里 enhanced-mode 的值。如果你用的是机场下发的配置、界面上看不到源文件,就在系统里查询一个国外域名,看返回什么。

# 结构示例:查询一个域名的解析结果,域名请替换成你实际要测的
nslookup www.example.invalid

返回 198.18.x.x 这类地址,说明是 fake-ip;返回一个看起来正常的公网地址,说明是 redir-host。

fake-ip 下的解析结果是假的,这是设计如此,不是故障。用它去 ping、去查归属地、去做任何基于 IP 的判断,得到的结论都没有意义。

国内域名为什么要单独走国内 DNS?

如果所有域名都丢给境外解析服务器,国内网站会出两种问题。

一是慢。解析请求要跨境走一圈再回来,每打开一个新域名都多等几十到几百毫秒。二是错。大型国内站点普遍用 CDN,同一个域名对不同地区的用户返回不同的边缘节点地址。用境外服务器解析,你拿到的往往是一个海外机房的地址,访问速度反而比不解析还慢。

所以合理的做法是分工:国内域名交给国内的解析服务器,让 CDN 正确地把你判给最近的节点;国外域名交给境外服务器并让解析请求本身也走代理,避免在解析阶段就暴露意图。fallback-filter 里的 geoip-code: CN 干的就是这个裁决工作——当两边给出的答案冲突时,如果结果指向国内地址就采信国内那一份。

出现哪些现象说明发生了 DNS 泄漏?

「泄漏」这个词在中文语境里被用得很宽。这里指的是:你以为解析请求走了代理,实际上它从本地网络直接发了出去。判断依据是现象,不是感觉。

现象可能的原因优先检查的位置
在线检测页显示解析服务器是本地运营商解析请求没有被 Clash 接管系统代理是否开启、是否需要 TUN
代理开着,网站仍判定你在国内域名在本地被解析成国内地址fallback 与 fallback-filter 配置
部分域名能开,部分持续超时这些域名的解析结果被污染是否走了国内 nameserver
关掉浏览器的加密 DNS 后现象消失浏览器自己绕过了系统解析浏览器的安全 DNS 开关
只有某个软件异常,其他正常该软件内置了自己的解析器该软件的网络设置,或改用 TUN

最后两行值得单独强调。现代浏览器普遍内置加密 DNS,开启后会跳过系统解析直接向自己指定的服务器查询,Clash 完全看不到这些请求。部分下载工具和游戏客户端也有同样的行为。这类软件层面的绕过,在系统代理模式下无解,只能靠 TUN 模式在网卡层面兜住——当然,TUN 也有它自己的一堆前置条件。

哪三种情况才真的需要手动改 DNS?

其余情况请优先怀疑别的层。

  1. 国内网站被解析到国外,访问明显变慢。 说明国内域名没有走国内解析服务器,需要检查 nameserver 是否为空,以及 fallback-filter 是否配置了地区判断。
  2. 某些域名长期解析失败或指向明显错误的地址。 典型的污染表现。对策是让这些域名走 fallback 里的加密解析服务器,而不是明文查询。
  3. 代理开着,却持续被判定为真实地区。 前提是已经排除了出口 IP 本身的问题。如果换节点也没用,而关掉浏览器加密 DNS 后现象消失,那问题就在解析层。

如果你的症状是「节点全部超时」或「客户端根本连不上」,那不是 DNS 问题,改这里没有任何帮助,应该走节点全红的分层排查

照抄网上的 DNS 配置片段有什么风险?

流传最广的那些配置片段,通常是某个人为自己的环境调出来的,它默认了一整套上下文:特定的规则集、特定的增强模式、是否启用 TUN、甚至特定的机场。把其中一段单独搬过来,常见的后果有三种。

一是和机场下发的配置打架。多数订阅转换服务会在配置里注入自己的 dns 段,你在下面又写一段,谁生效取决于加载顺序,结果往往不是你想的那个。二是国内解析被误伤。有些片段为了追求抗污染,把所有域名都送去境外解析,国内网站于是集体变慢。三是模式错配。为 redir-host 写的 fake-ip-filter 放进 fake-ip 环境里不起作用,反之则可能让一批域名彻底解析不出来。

务实的做法是:先定位到具体哪一项不对,只改那一项,并且改之前把原配置备份一份。整段覆盖是最容易把一个小问题换成三个新问题的操作。

改完之后怎么验证确实生效了?

按顺序做完这几步,结论才靠得住。

  1. 重载配置或重启客户端。 dns 段的改动多数不会热生效,不重载就测,测的还是旧配置。
  2. 清系统 DNS 缓存。 系统会把最近的解析结果缓存一段时间,不清就查不到新结果。
  3. 完整退出浏览器进程再打开。 浏览器有自己独立的一层缓存,只关标签页无效。
  4. 查询一个国内域名。 结果应该指向国内地址,并且响应很快。
  5. 查询一个国外域名。 fake-ip 模式下应返回保留网段地址,redir-host 模式下应返回真实的境外地址。
  6. 用在线检测页面看解析出口。 出口不应显示为你本地的运营商解析服务器。

六项全部符合预期,才算改对了。只要有一项对不上,先回到第一步确认配置真的加载了,而不是继续往配置里加东西。

小结

DNS 处理的是「名字」而不是「路径」,所以它出问题时的表现,总是伪装成连接问题。先分清自己跑的是 fake-ip 还是 redir-host,这决定了后面所有排查动作的含义;国内域名走国内解析、国外域名走代理解析,是绝大多数配置的正确骨架。浏览器和部分软件的内置加密 DNS 会绕过 Clash,这一类只能靠网卡层接管来解决。最后,别整段抄配置——定位到具体那一行再改,才是成本最低的路径。

常见问题

我到底该不该动 Clash 的 DNS 设置?

多数情况下不该。机场下发的配置通常已经写好了 fake-ip 与国内外分流解析,能正常上网就说明这套设置在工作。只有出现节点能连但网页打不开、国内网站被解析到国外、或代理开着仍被识别为真实地区这三类现象时,手动调整才有意义。

fake-ip 和 redir-host 怎么区分我用的是哪一种?

看配置里 dns 段的 enhanced-mode 字段;如果没有配置文件权限,可以在系统里查询一个国外域名,解析结果落在 198.18 开头这类保留网段就是 fake-ip,返回真实公网地址则是 redir-host。

为什么开了代理,网站还是显示我在国内?

这类现象通常不是 IP 泄漏而是解析泄漏:域名在本地就被解析成了国内的地址,请求随后被送到了错误的服务器。也可能是浏览器自带的加密 DNS 绕过了 Clash,需要在浏览器设置里单独关掉。

网上的 DNS 配置片段能直接抄吗?

不建议整段覆盖。这些片段往往和作者自己的规则集、TUN 设置、增强模式绑定,单独抄一段过来容易和机场下发的配置冲突,常见后果是国内网站变慢或部分域名彻底解析不出来。

改完 DNS 后测试没变化,是没生效吗?

先清缓存再判断。系统层和浏览器层各有一份 DNS 缓存,浏览器还需要完整重启进程,只关标签页不够。两处都清完、并重启客户端让配置重新加载,结果才可信。