在 Clash 中 DNS 解析行为和 fallback-filter 的一点理解

最近因为需要查了一些资料,对 clash 中的 DNS 解析有了一点了解。

首先有两组上游 DNS 配置,分别是 nameserverfallback ,在 redir-host 模式下,当客户端 DNS 请求到达 clash 时,其会同时向两组中的 DNS 服务器并发请求,并以 nameserver 中最先返回的结果作为依据,按照 fallback-filter 的配置情况,决定是否需要使用 fallback 的结果作为最终的解析结果,供后续规则判断使用。

默认情况下,fallback-filter 中的 geoip = true ,其行为是当 namesever 返回结果的 geoip 为非 CN 时,使用 fallback 组的解析结果,如果后续规则判断为直连时,一定程度上可以防 DNS 污染(因为 fallback 组一般都是非国内 DNS 服务器)。

现在考虑一种情况,就是 nameserver 返回的 ip 属于保留地址,这时通常会造成直连失败,那么有没有办法避免呢?

其实除了 geoip 配置以外,还有两种情况会使用 fallback 组的结果,就是根据 fallback-filter 中的 ipcidrdomain 配置项决定的。如果 ip 或 domain 被这两个配置项命中,也会使用 fallback 结果。

所以上面提出的问题,如果追加 ipcidrdomain 设置,再配合默认的 geoip规则,很大程度上就可以避免 DNS 污染。

综上所述,就是对 clash 中 DNS 解析的个人理解。那最后我再谈谈为什么推荐使用 fake-ip 模式。

因为我们可以看到,redir-host 下无论是否走代理,都必须进行一次解析。而在 fake-ip 下,如果命中域名规则且需要走代理的话,那么 clash 端和客户端,都没有进行过实际解析(clash 直接给客户端返回 fake-ip,然后将 host 直接发送到代理端处理,中间没有解析 ip 的需要),相当于节省了一次解析,所以它更快,同时不需要考虑 DNS 污染问题。

Built with Hugo, theme is Stack, designed by Jimmy.