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-ip | redir-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?
其余情况请优先怀疑别的层。
- 国内网站被解析到国外,访问明显变慢。 说明国内域名没有走国内解析服务器,需要检查
nameserver是否为空,以及fallback-filter是否配置了地区判断。 - 某些域名长期解析失败或指向明显错误的地址。 典型的污染表现。对策是让这些域名走
fallback里的加密解析服务器,而不是明文查询。 - 代理开着,却持续被判定为真实地区。 前提是已经排除了出口 IP 本身的问题。如果换节点也没用,而关掉浏览器加密 DNS 后现象消失,那问题就在解析层。
如果你的症状是「节点全部超时」或「客户端根本连不上」,那不是 DNS 问题,改这里没有任何帮助,应该走节点全红的分层排查。
照抄网上的 DNS 配置片段有什么风险?
流传最广的那些配置片段,通常是某个人为自己的环境调出来的,它默认了一整套上下文:特定的规则集、特定的增强模式、是否启用 TUN、甚至特定的机场。把其中一段单独搬过来,常见的后果有三种。
一是和机场下发的配置打架。多数订阅转换服务会在配置里注入自己的 dns 段,你在下面又写一段,谁生效取决于加载顺序,结果往往不是你想的那个。二是国内解析被误伤。有些片段为了追求抗污染,把所有域名都送去境外解析,国内网站于是集体变慢。三是模式错配。为 redir-host 写的 fake-ip-filter 放进 fake-ip 环境里不起作用,反之则可能让一批域名彻底解析不出来。
务实的做法是:先定位到具体哪一项不对,只改那一项,并且改之前把原配置备份一份。整段覆盖是最容易把一个小问题换成三个新问题的操作。
改完之后怎么验证确实生效了?
按顺序做完这几步,结论才靠得住。
- 重载配置或重启客户端。 dns 段的改动多数不会热生效,不重载就测,测的还是旧配置。
- 清系统 DNS 缓存。 系统会把最近的解析结果缓存一段时间,不清就查不到新结果。
- 完整退出浏览器进程再打开。 浏览器有自己独立的一层缓存,只关标签页无效。
- 查询一个国内域名。 结果应该指向国内地址,并且响应很快。
- 查询一个国外域名。 fake-ip 模式下应返回保留网段地址,redir-host 模式下应返回真实的境外地址。
- 用在线检测页面看解析出口。 出口不应显示为你本地的运营商解析服务器。
六项全部符合预期,才算改对了。只要有一项对不上,先回到第一步确认配置真的加载了,而不是继续往配置里加东西。
小结
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 缓存,浏览器还需要完整重启进程,只关标签页不够。两处都清完、并重启客户端让配置重新加载,结果才可信。