最近因为需要查了一些资料,对 clash 中的 DNS 解析有了一点了解。
首先有两组上游 DNS 配置,分别是 nameserver 和 fallback ,在 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 中的 ipcidr
和 domain
配置项决定的。如果 ip 或 domain 被这两个配置项命中,也会使用 fallback 结果。
所以上面提出的问题,如果追加 ipcidr
和 domain
设置,再配合默认的 geoip
规则,很大程度上就可以避免 DNS 污染。
综上所述,就是对 clash 中 DNS 解析的个人理解。那最后我再谈谈为什么推荐使用 fake-ip 模式。
因为我们可以看到,redir-host 下无论是否走代理,都必须进行一次解析。而在 fake-ip 下,如果命中域名规则且需要走代理的话,那么 clash 端和客户端,都没有进行过实际解析(clash 直接给客户端返回 fake-ip,然后将 host 直接发送到代理端处理,中间没有解析 ip 的需要),相当于节省了一次解析,所以它更快,同时不需要考虑 DNS 污染问题。