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

2024 年 4 月 21 日
 RageBubble

** 本人使用的是 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 未命中是什么意思,该如何理解,希望有大佬解释一下。

50283 次点击
所在节点    宽带症候群
99 条回复
vcn8yjOogEL
2024 年 4 月 21 日
解决方法就是不要用 Clash 解析, 它始终并发查询全部 DNS, 规则是用来筛选结果的
lxcopenwrt
2024 年 4 月 21 日
像楼上说的用其他支持加载域名列表的 DNS 分流然后作为 clash 的 DNS 上游就行了,例如 mosdns 就能完美解决 DNS 泄露问题只是要花点时间研究
RageBubble
2024 年 4 月 21 日
@lxcopenwrt 第一次听说 mosdns ,有空去看看
LuvF
2024 年 4 月 21 日
@RageBubble
我现在是
default-nameserver 国内明文 dns
nameserver 国内加密 dns
nameserver-policy
geosite:private,cn 国内加密 dns
geosite:geolocation-!cn 国外加密 dns
fallback 空
LuvF
2024 年 4 月 21 日
@LuvF 用 ipleak 测了一下 没有本地 isp 的 dns
9H93q6EKnTVFQDRq
2024 年 4 月 21 日
还是 v2ray 简单,可惜没有路由插件
heganyuliang
2024 年 4 月 21 日
@Puteulanus #8
@vx007 #11
理论上确实是有可能的,但是目前热门的规则集之类更新得还是挺频繁,并且现实中我自己 FINAL 用的是直连,从来没遇到过被墙的网站走到了 FINAL ,只有主动屏蔽大陆访问的要临时切换成代理
fightkirito
2024 年 4 月 21 日
我可以证明楼主,我用联通 wifi 链接 clash 规则模式有的外网会被自动跳转到 js96110 。5g 网则不会。太怪了,再这样我都不太敢用 clash 了。然后今天就看到楼主发了帖子。
fightkirito
2024 年 4 月 21 日
@fightkirito 我是看这个网站被跳转的。1000novel.com
RageBubble
2024 年 4 月 21 日
补充下,我使用 clash verge rev ,mihomo 内核,windows11 系统,不用系统代理而是开启 tun 模式,哪怕我的 nameserver 和 fallback 都是加密 dns ,不论是使用规则还是全局都会泄露。也就是绕过了 clash ,直接让操作系统里设置的 dns 向测试域名发送解析请求。

我猜测可能是内核 tun 和 windows11 的适配有关,因为在另一台 windows10 电脑上就不会有泄露。
RageBubble
2024 年 4 月 21 日
@zhy0216
在 DNS 泄露检测服务中,通过创建专门的测试域名和设置这些测试域名的 NS 记录(指明哪些 DNS 服务器是负责处理特定域名的查询)指向检测服务控制的 DNS 服务器,检测服务可以追踪所有对这个子域名的查询。当设备尝试解析这些测试域名时,所有的 DNS 请求将被发送到有检测服务的服务器,允许服务检测是否有任何非预期的 DNS 服务器在处理这些查询。
bluaze
2024 年 4 月 21 日
ip 规则都 no-resolve 的话,除非能保证这些 ip 都是直接通过 ip 访问的,不然这些 ip 规则就是废了
Puteulanus
2024 年 4 月 21 日
@heganyuliang 被墙的我相信大部分应该是没问题的,但是像诈骗的跟这一套天然冲突,他们肯定会勤换域名,尽量保证自己不在屏蔽名单上,毕竟被屏蔽了还怎么骗人;各种规则的作者也不一定有动力去收录这种网站,毕竟根本不是正常用户想要去访问的

蛋疼点在于现在国内反诈搞得如火如荼,经常能看到这种帖子 /t/1032543 ,你不小心点了个诈骗网站说不定优先级比上了被墙网站都高

至于说为什么要去开诈骗网站,我觉得经常搜东西的应该都见过他们那种黑帽 SEO ,真的很难保证自己永远一个都不点到。。
bluaze
2024 年 4 月 21 日
@i571 有 v2rayA
Internet0User
2024 年 4 月 21 日
@wzhpro 终于看见有人提 IPv6 泄漏 DNS 了
HackerTerry
2024 年 4 月 21 日
借楼问一下,openwrt 软路由的 passwall2 插件怎么避免 dns 泄露啊?用了 mosdns 作为上游 dns 服务器,劫持了软路由的 dns 请求并分流
Fish1024
2024 年 4 月 22 日
的确是这样。
我只在需要代理的时候在应用中设置代理,不用系统代理和 tun 模式。
xclrr
2024 年 4 月 22 日
之前专门研究过这个问题,很简单,泄漏的原因就是你本地运行 clash 的机器向你配置的 nameserver 发起了查询,默认是本地和远程同时去查,dns 泄漏就是在你本地去查的时候发生的,clash meta 可以配置这个查询只由远程去做,nameserver 后面加#group 就可以了
yyysuo
2024 年 4 月 22 日
说得很好,研究也挺有意思的,不过你这种结论,完全可以通过阅读文档或看看不良林的视频就解决了。
sapphire
2024 年 4 月 22 日
Sukka (@isukkaw) 最近写了一篇 blog 更全面的论述了这个问题,用的 Surge ,Clash 很类似的。
https://blog.skk.moe/post/i-have-my-unique-surge-setup/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/1034325

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX