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

65 天前
 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 未命中是什么意思,该如何理解,希望有大佬解释一下。

13775 次点击
所在节点    宽带症候群
86 条回复
RageBubble
65 天前
我理解的是 fakeip-Direct 是指那些位于 fakeip-filter 中的域名和网址,也就是那些不使用 fake-ip 的网络连接。但是当我连接 fakeip-filter 中的域名时,查看 wireshark ,clash 还是向 nameserver/fallback 查询了该域名。

fakeip 未命中也不太理解,如果是“当一个应用程序或设备第一次请求一个域名时,如果这个域名还没有在 Clash 的内部 FakeIP 映射表中,那么它就会是一个“未命中”的情况。”,那么是否意味着所有的第一次发起的域名解析都属于 fakeip 未命中,然后使用代理解析域名?但我在 wireshark 中测试,clash 同样还是向 nameserver 查询了该域名。
M5tuA
65 天前
你可以进 verge rev 的 TG 群组,没记错 meta 内核的开发者也在其中,可以跟他交流下
Puteulanus
65 天前
我理解的要彻底防止 DNS 泄漏的话,国内 DOH 也得走代理,然后用 EDNS 告诉它一个你所在地的 IP
MeikoZh
65 天前
说了这么多,我咋感觉是 ai 说的,而不是你说的?
RageBubble
65 天前
@Puteulanus 如果提供一个自己实际地理位置的虚假 ip ,还是有可能泄漏位置信息吧
Puteulanus
65 天前
@RageBubble 这个已经很宽泛了,而且它也不能确定你提供的就一定是你所在地的 IP
想要 CDN 解析得准 DNS 肯定还是得知道你大致在什么方位
heganyuliang
65 天前
就单纯隐藏翻墙行为而言,使用 clash 时防止 dns 泄漏意义有,但不大

假设有以下三个域名:
a.net 非法国外域名
b.net 合法国外域名
c.cn 合法国内域名

只要 clash 配置文件是正常的,而非有且仅有两行:
- GEOIP,CN,DIRECT
- FINAL,PROXY
这种,a.net 都会优先匹配到域名规则,发送到代理端解析; c.cn 也会匹配到域名规则,走 nameserver 解析(顺便说一句,nameserver 用国外 DNS 会非常影响体验,国内服务可能解析到国外 CDN ,国外服务也可能解析到远离代理端的 CDN )

真正会因为 IP 规则而向 nameserver 发起解析的,只有 b.net (各类 dns 泄漏检测就属于这种)。至于这部分域名能不能向(有污染的) nameserver 暴露,就见仁见智了。至少我认为在大部分情况下,ISP 和墙并不在意你访问这些网站。只要 ISP 没有 DNS 劫持打广告之类的行为(现在应该少见了),即使完全不配置 dns 字段、全部用 ISP 的 DNS 也没什么问题
Puteulanus
65 天前
@heganyuliang 主要是怕 a 的列表更新得没那么及时/没那么全,比如虚拟货币,或者在网上逛到了什么诈骗网站,可能遇到不在 GFWList 里但在 ISP 那边看起来又很严重的
mschultz
65 天前
@heganyuliang 赞同。
个人简短总结:在较为靠前的位置(在所有 IP 类规则之前)将主流被墙域名分流至代理,例如

RULE-SET, gfwlist, PROXY

剩下的就随他去吧。
Cooky
65 天前
chrome 自身设置全局走 cf 的 doh 再走 clash
vx007
65 天前
@heganyuliang 有意义啊,光靠域名规则不可能囊括所有 a.net 啊,这必然导致某些"非法"网站 dns 泄露
RageBubble
65 天前
@Puteulanus #8 确实,如果自己的配置中恰好 a.net 非法国外域名没有优先匹配到域名规则,而是先碰到了 IP 规则(没有 no-resolve ),nameserver 又是国内明文 dns 的话,就会暴露。
RageBubble
65 天前
@RageBubble #12 当然这里的暴露是说向 isp 暴露,nameserver 使用国内加密 dns ,内容也会向加密的国内 dns 厂商暴露。
RageBubble
65 天前
@RageBubble #12 所以还是有必要设置 fallback-filter 中的 geosite 和 geoip ,这样即使遇到了这种情况,也只会向 fallback 中设置的国外加密 dns 发送请求,而不会向 nameserver 中的国内加密 dns 发送请求。

虽然这依赖于 geosite 的数据库,可能还是会有漏网之鱼,但对于普通上网的人来说足够了。
RageBubble
65 天前
dns 设置推荐:

default-nameserver 国内明文 dns
nameserver 国内加密 dns
fallback 国外加密 dns
vx007
65 天前
我认为系统代理或全局代理防止 dns 泄漏很有必要,但只是聊胜于无,避免不了国产软件或系统的主动探测,这个软件可能同时走直连和代理,这相当于代理节点实名了。
所以我最好不要用系统代理和全局代理,而是直接在单个软件内设置代理为佳。
BlackEagles
65 天前
youtube 的不良林有做过系列视频讲解 dns 泄露问题
主要是规则里面的涉及 ip 的规则,如果不加 no-resolve 的话 clash 就会直接发起 dns 请求然后判断是否符合规则。
RageBubble
65 天前
@M5tuA 已经加过了,但是 tg 群组(包括所有社交软件的群组)其实都不太适合严肃讨论,倒是可以在 github 上问一下
RageBubble
65 天前
@vx007 #16 确实是这样,但是对于绝大部分的普通人来说,他们的需求只是尽量降低隐私泄露,用最小代价实现最大的隐私保护,本质上是效能问题。
SenLief
65 天前
解决的最佳手段就是所有的 dns 请求 8.8.8.8

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

https://www.v2ex.com/t/1034325

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

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

© 2021 V2EX