技术 / 实战指南

Clash DNS 老是漏?fake-ip、fallback 和 nameserver-policy 的排查清单

这篇不重复 Clash 全量配置讲解,只讲 DNS 泄露到底漏在哪里。按客户端接管、解析模式、解析链分工和症状归类的顺序查,比来回改一整份配置更快定位。

Clash 配置全篇已经讲过 DNS、策略组和分流规则。这篇只解决一个分支问题,DNS 到底漏在哪里。排查的顺序是先看客户端有没有真的把流量交给 Clash,再看解析模式,最后按症状查解析链。顺序对了,很多问题不用动整份配置就能定位。

完整参数说明请看Clash 配置文件详解,节点和链式代理的搭建请看Clash Verge 与 V2rayN 链式代理配置指南。如果你还没配过 Clash,先读全量篇。如果你已经配好,但怀疑 DNS 在漏,继续往下查。

检测页上看到本地运营商,先别急着改配置

DNS 泄露最容易让人误判的一点,是它常常不影响网页能不能打开。代理开着,国外网站照常打开,视频照常播放,只是在 DNS 检测页上,解析结果来自本地运营商。那一刻的第一反应往往是改配置,把 nameserver 换一组,把 fallback 换一组,再把整份配置推倒重写。改完再测,检测页还是老样子。

我自己的看法是,检测结果本身没有错,错的是排查的起点。DNS 泄露这个词,指的是域名解析走了不该走的路。代理开启的时候,DNS 查询的出口应该和代理链路一致。国内域名和国外域名应该按配置的策略分别解析。解析结果不应该出现明显的污染 IP,也不应该把国外域名解析到国内节点上。这三条里哪一条破了,漏的位置就不一样。先把症状记下来,再决定从哪一段链路开始查,远比一上来就改配置省时间。

第一段链路在客户端,配置写对了也可能没生效

很多泄露发生在客户端这一层,和配置文件没有关系。Clash 或者 Mihomo 内核已经启动,客户端界面也开着,这不等于流量已经被接管。只开着客户端界面,没有接管系统流量的时候,浏览器可能仍在用系统 DNS。系统代理或者 TUN 模式有没有生效,是第一件要确认的事。界面好看不代表接管生效,接管生效才有后面的解析链可言。

系统 DNS 指向哪里,是第二件要确认的事。如果系统里手动填了 114 或者运营商 DNS,Clash 的 DNS 配置写得再对也不会生效。系统 DNS 这条线绕过了 Clash,解析请求根本没有走到 Clash 的监听地址。排查的时候,系统 DNS 应该指向 Clash 的监听地址,例如常见的本地监听端口。这个指向关系对了,解析请求才有机会进入 Clash 的处理流程。

浏览器自身的加密 DNS 是第三个容易漏的口子。有些浏览器会绕过系统 DNS,直接用内置 DoH。那个时候就算 Clash 配置正确,浏览器查询仍可能走另一条路。排查期间先把浏览器的内置加密 DNS 关掉,再测一次。这个动作的作用是把变量隔离开,排查结束之后可以再打开。关掉之后检测结果变了,漏的位置就在浏览器这一层。关掉之后检测结果没变,再往配置里查。

fake-ip 和 redir-host 是两条不同的排查路线

Clash 的 enhanced-mode 决定了域名解析的基本方式。先确认你用的是哪一种,再决定后面怎么查。拿 fake-ip 的排查方法去套 redir-host 的配置,或者反过来,只会越查越乱。

fake-ip 模式下,Clash 会先给域名分配一个假 IP,再按规则决定走代理还是直连,真正解析发生在代理出口。常见问题集中在三个地方。假 IP 段和局域网段冲突,假 IP 过滤规则把不该过滤的域名放行了,或者客户端绕过了假 IP。假 IP 这个机制本身没有错,错的是它和客户端,和过滤规则之间的配合出了问题。

redir-host 模式下,域名按真实解析结果处理,依赖 nameserver 和 fallback 的分工。常见问题也集中在分工上。fallback 规则把国内域名也送到了国外 DNS,或者把国外域名送到了国内 DNS。分工一乱,解析结果就跟着乱。两种模式的排查方向完全不同,先分清模式,后面的每一步才有意义。

解析链的分工,每一个名字都有自己的活

把模式分清之后,再看解析链里每一个部件的活。nameserver 是默认的解析服务器,nameserver-policy 是给特定域名或者域名集合指定解析服务器,fallback 是后备解析服务器,fallback-filter 是决定哪些结果算污染,该用 fallback 重查一次的过滤器,default-nameserver 是用来解析加密 DNS 服务器域名本身的,proxy-server-nameserver 只用来解析代理节点本身的域名,fake-ip-filter 是假 IP 模式下哪些域名不拿假 IP 的过滤器。

这些名字听起来像一堆同义词,其实每一项的活都不一样。nameserver-policy 写错了,国内域名可能被送到国外 DNS。fallback-filter 的 geoip-code 不是 CN,或者 geosite 里没有把国内集合排除,国内结果可能被当成污染结果丢掉,再用国外 DNS 重查一次。default-nameserver 如果不是可用的 IP 形式,整个加密 DNS 链路都会退化,因为加密 DNS 服务器自己的域名都解析不出来。proxy-server-nameserver 如果和普通 nameserver 混用,代理节点域名的解析和普通域名的解析就会互相干扰。

理解分工之后,症状就有了对应的位置。症状不是孤立的,它指向链路上的某一段。

国外网站能打开,检测却显示本地运营商

这种症状最常见,也最容易误导人。网站能打开,说明代理链路本身是通的。检测显示本地运营商,说明解析请求没有走代理链路。这两个事实放在一起,指向的几乎都是客户端接管这一段。回到第一段链路,逐项确认系统代理,TUN,系统 DNS 和浏览器加密 DNS。不要先改 nameserver。nameserver 改得再好,解析请求没有走到 Clash 那里,都是白改。

国内网站变慢,或者国内域名走了代理

国内网站变慢,或者国内域名走了代理,指向的往往是 nameserver-policy 和 fallback-filter 这一段。先看国内域名有没有被明确指向国内 DNS,例如在 nameserver-policy 里把国内常用域名或者 geosite 国内集合指向国内解析服务器。再看 fallback-filter 的 geoip-code 是不是 CN,geosite 里是不是把国内集合排除了。过滤规则一旦写反,国内结果会被当成污染结果丢掉,再用国外 DNS 重查一次。重查一次就是一次绕路,绕路多了,国内网站自然变慢。

default-nameserver 也值得顺手看一眼。它是用来解析加密 DNS 服务器域名本身的,如果它不可用,整个加密 DNS 链路都会退化。链路退化之后,解析结果变慢或者变乱,表面上看起来像国内网站的问题,根子却在最底下那一环。

国外网站解析结果异常,或者间歇性打不开

国外网站解析结果异常,或者间歇性打不开,指向的往往是 fallback 这一侧。先看 fallback 里是不是境外可信的 DNS。把国内 DNS 写进 fallback,等于让国外域名也走国内解析。国内解析国外域名,结果要么被污染,要么不稳定,间歇性打不开就是这么来的。

再看 proxy-server-nameserver。它只用来解析代理节点本身的域名,不要把它和普通 nameserver 混用。混用之后,代理节点域名的解析结果可能影响普通域名的解析,普通域名的解析结果也可能反过来干扰节点连接。

fake-ip-filter 也值得查一次。假 IP 模式下,过滤器里有没有把不该放行的域名放行,例如把本地局域网域名和需要直连的内网域名混在一起,导致这些域名拿不到假 IP 映射。拿不到假 IP 映射的域名,解析路径就和预期不一样,异常也就跟着来了。

改完配置没效果,先问改的是不是正在运行的那份

还有一类症状,配置看起来没效果,原因在改错了地方。确认你改的是正在运行的那份配置,而不是另一份备份文件。这个错误听起来很低级,实际排查里出现得一点都不少。订阅文件,本地文件,备份文件,名字很像,内容差一点,改了备份文件,运行的那份纹丝不动,检测结果当然纹丝不动。

改完要重新加载配置,重启客户端或者重新加载订阅之后,再测一次。不要凭感觉判断。感觉上改完了,和配置真正重新加载了,是两回事。

一次只改一个变量。只改 fallback,或者只改 nameserver-policy,改完测一次再改下一个。同时改五处,出了问题也定位不到是哪一处。排查的纪律就是一次只动一个地方,让每一次检测结果都能对应到某一次改动上。

三个误区,都是把复杂问题想简单了

把所有域名都指向同一组 DNS,看起来最简单。国内和国外域名分开解析,才是这套配置存在的意义。统一成一组,等于主动放弃了分工,分工放弃了,解析结果自然会乱。

在 fallback 里写国内 DNS,看起来是多一组服务器更稳定。fallback 的作用是给国外域名一个可信的后备结果。国内 DNS 对国外域名来说,恰恰是不可信的那一组。多一组服务器没有错,错的是把不该进 fallback 的服务器放进了 fallback。

每次出问题就换一整份别人给的配置,看起来最省事。别人的假 IP 段,监听端口和过滤规则不一定适合你的网络环境。换配置反而会引入新的变量。新的变量一多,原来的症状还在,新的症状又来了,排查就更难了。

如果按上面顺序查完仍有问题,把你的症状归到上面四类里的一类,再回到全量配置篇对照对应参数逐项核对。归类这个动作本身就是排查的一半。症状归对了类,链路上的位置就窄了,位置窄了,改动就能一次只改一处。