3

使用 clash 上网时应对 dns 泄露的心得

 3 weeks ago
source link: https://www.v2ex.com/t/1034325
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  宽带症候群

使用 clash 上网时应对 dns 泄露的心得

  RageBubble · 12 小时 9 分钟前 · 4110 次点击

** 本人使用的是 clash verge rev 客户端,内核为 clash-meta ( mihomo ),windows 系统。

最近我对上网隐私有些关注,虽然 vpn 可以有效保护隐私,但根据大家都知道的原因,vpn 上网在国内非常不方便,一个是无法根据域名和 ip 分流,另一个是 vpn 协议太容易被检测。所以我就在想,使用 clash 这类更符合国情的代理软件,怎么才能保证基本的隐私和信息安全呢?

当然我只是追求基本的隐私保护,对于更高的安全需求,当然可以使用 tor 网络和虚拟机等,这些不在此次讨论范围,我主要以 ipleak.net 这类网站的结果作为判断标准。

ipleak.net 这类网站对泄露的检测可以分为三类:dns 泄露,ip 泄露,webrtc 泄露。

只要使用 clash 上网,ip 泄露和 webrtc 泄露检测的结果都是代理服务器的 ip ,这两个没什么问题。但是对于 dns 泄露,我总是发现检测到的服务器列表里,除了国外的服务器,竟然还有很多是国内的 dns 服务器(包括本地 isp 运营商的),而在我的 clash 中(系统代理+规则模式),dns 字段里 nameserver 设置的是 8.8.8.8 ,fallback 设置的是国外加密 dns 。这有些不对劲,因国内的 dns 服务器不应该出现。

这里说明一下,clash 的 dns 字段里,nameserver 就是主要使用的 dns 服务器,default-nameserver 是用来解析 nameserver 中的加密 dns (如果有加密 dns 的话),fallback 是备用的 dns 服务器,当 clash 要发出 dns 请求时,如果 fallback-filter 没有特别设置,会并发的向 nameserver 和 fallback 中的 dns 服务器发出解析请求,使用最早响应的那个结果。

mihomo 的 dns 解析流程

言归正传,为了搞清楚这背后的原理,我做了很多测试,用到了 wireshark 抓包 53 端口的 dns 请求。发现 wireshark 中,电脑是按照 clash 配置正确地,并发地向 nameserver 和 fallback 中的 dns 服务器发出了域名解析请求( ipleak 提供的测试域名),也收到了发回的响应,所以不太可能是 clash 或者 windows 系统的问题。

我推测会不会是因为 nameserver 使用了明文 dns ,导致 dns 泄露,使得 isp 运营商的 dns 服务器也向测试域名发出了解析请求。于是我把配置里 nameserver 中的 dns 服务器全部替换成加密 dns ( DOH ),果然,再次检测后就再也没有中国 dns 服务器的踪迹了。

需要说明的是,当 clash 使用系统代理+全局模式时,dns 请求会被 clash 加密并全部发往代理服务器,是让代理服务器的 dns 去解析域名,所以也不会出现国内 dns 服务器的踪迹。

在解决了上面的 dns 泄露问题后,我又有了新的疑惑。

clash 系统代理下的规则模式打开,通过 ipleak 网站测试,我发现明明 clash 日志中这些 ipleak 的测试域名最后都是命中了我规则中最后一行的 final ( final 的作用是兜底,当前面的所有规则都没有命中时,域名最后会命中 final 规则,我设置的是命中 final 规则后使用代理服务器).本应该是通过代理服务器去解析域名,但得到的结果和全局模式下检测到的 dns 服务器不同,而且 wireshark 中会发现 clash 在通过 nameserver 和 fallback 发送域名解析请求.

因为根据那张流程图,域名命中代理规则后应该直接让代理服务器去解析域名,电脑上的 clash 是不该发出这些请求的。这是为什么呢?原因只能是这些测试域名既通过了代理服务器解析域名,又通过 clash 的 dns 去解析域名。

我又折腾了一下,到处上网查阅,仔细查看那张 dns 解析流程图,我注意到了“匹配到基于 ip 的规则”这几个字,瞬间恍然大悟。原来这是因为 clash 通过从上往下的方式一条条匹配规则,直到命中规则停止。这些测试域名的确命中了 final 规则,通过代理服务器的 dns 解析了域名。

但是,在此之前,由于我的配置中有基于 ip 的规则存在,位置比 final 规则更靠前,并且没有加上 no- resolve 这个参数( no-resolve 告诉 clash 在遇到基于 ip 的规则时,不要去单独解析域名),导致在遇到这些靠前的 ip 规则时,clash 会先通过 nameserver 和 fallback 中的服务器并发请求,以查看该域名是否符合该 ip 规则,不符合则继续往下匹配规则,最后命中了 final 规则。

所以这就是为什么在我的电脑上,这些 ipleak 的测试域名既会先被 clash 上的 dns 解析,还会被代理服务器上的 dns 解析。而在全局模式下,因为不需要判断规则,这些自定义测试域名只会被代理服务器解析。

说了这么多,我总结出来的经验是,要想避免 dns 泄漏,一个方法是在 nameserver 中使用加密 dns ,另一个是给配置中的 ip 规则后面加上 no- resolve ,告诉 clash 直接跳过,不要去解析域名。最后是 fallback-filter 中设置 geosite 为“!CN”等,这样在遇到国外的网站域名时,clash 不会再并发请求,只会使用 fallback 的 dns 服务器而不会使用 nameserver 中的服务器。可以看出,最后两个方法的思路都是不让 clash 向 nameserver 发送国外网站的 dns 请求。为了防止 dns 泄露,这三个方法我建议最好同时使用。

上面就是最近这段时间我自己折腾后整理出来的心得,希望能帮助知道如何处理出现的 dns 泄露。不知道文中有没有什么错误,欢迎大家反馈。另外,我到现在也不太清楚图片中的 fake-ip 未命中和 fakeip-Direct 未命中是什么意思,该如何理解,希望有大佬解释一下。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK