** 本人使用的是 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 服务器发出解析请求,使用最早响应的那个结果。
言归正传,为了搞清楚这背后的原理,我做了很多测试,用到了 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 未命中是什么意思,该如何理解,希望有大佬解释一下。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.