最近因为需要查了一些资料,对 clash 中的 DNS 解析有了一点了解。
首先有两组上游 DNS 配置,分别是 nameserver 和 fallback ,在 redir-host 模式下,当客户端 DNS 请求到达 clash 时,其会同时向两组中的 DNS 服务器并发请求,并以 nameserver 中最先返回的结果作为依据,按照 fallback-filter 的配置情况,决定是否需要使用 fallback 的结果作为最终的解析结果,供后续规则判断使用。
现在考虑一种情况,就是 nameserver 返回的 ip 属于保留地址,这时通常会造成直连失败,那么有没有办法避免呢?
如果 ip 或 domain 被这两个配置项命中,也会使用 fallback 结果。
所以上面提出的问题,如果追加 ipcidr 和 domain 设置,再配合默认的 geoip规则,很大程度上就可以避免 DNS 污染。
综上所述,就是对 clash 中 DNS 解析的个人理解。那最后我再谈谈为什么推荐使用 fake-ip 模式。
因为我们可以看到,redir-host 下无论是否走代理,都必须进行一次解析。而在 fake-ip 下,如果命中域名规则且需要走代理的话,那么 clash 端和客户端,都没有进行过实际解析(clash 直接给客户端返回 fake-ip,然后将 host 直接发送到代理端处理,中间没有解析 ip 的需要),相当于节省了一次解析,所以它更快,同时不需要考虑 DNS 污染问题。