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

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

28827 次点击
所在节点    宽带症候群
96 条回复
xwhxbg
324 天前
所谓的全局+系统代理看起来说的应该是隧道模式,也就是所有流量不管是不是要走 direct 都按照虚拟网卡( tun )=>tun2socks=>lwip/gvisor=>clash=>rule match=>remote 这个形式
这种模式下某些 clash 客户端做的是直接把你发往 53 端口的 udp packet 全都通过软路由或者 hard coding 丢进 clash 启动的 dns 服务器,这里再根据你的配置是否走 fake ip 还是 resolve ,开源版本是直接 dial 出去了,但是这个 dial 又会走进刚才那一套重新看 match 哪个 rule ,因为这个 dial 没有 mark socket ,然后如果你写的是 MATCH,US 也就是全局走 US ,那么 dns 的请求就会 match 到这个,dial 的时候就会走 US 的服务器
所以你如果想要的是非全局模式下也能让 dns 走 remote 再出去,可以直接写一条针对你 dns 服务器的规则就行了,因为比如 trojan 的协议是 tls 的,dns 请求虽然是明文的但是走了 trojan 再出去就不是了
clash 的 dns 配置开源版本是支持 https ,tls ,tcp 和普通的 udp 的,但是 tcp 和 https 的 bug 太特么多了,要是不想改代码不建议直接用
RageBubble
324 天前
@xwhxbg 我这里说的就是系统代理,没有涉及 tun 模式
wzhpro
324 天前
你们应该再担心下 ipv6 泄露
Jirajine
324 天前
如果你的使用场景涉及不想让其他实体知道你访问的网站,那么你就不是 clash 的目标用户。你有空抓包不如去看看代码,看了你就会知道你现在所做的这些就如同用筛子装水,漏洞百出。
ochatokori
324 天前
https://github.com/vernesong/OpenClash/issues/3843#issuecomment-2054031364
用的这个配置,在你发的这个检测网站测不出来。

但是把,只要用分流模式就很难避免泄漏,只要同时请求你分流的不同区域查询 ip 服务,只要不一致那肯定有一边开了代理
jackOff
324 天前
dns 分流应该是其他软件的职责,clash 的职责撑死就应该只是代理加一个 fakeip ,过多的 one for all 导致的结果就是普通设备跑 clash 的速度都很不理想
zbowen66
324 天前
我不专业,我用 MosDNS 作为 Clash 的 DNS 上游,没有出现泄露
mschultz
324 天前
@SenLief #20 我以为明文的 8.8.8.8 已经几乎等价于设置为运营商 DNS 了。
先不说有没有境内 Anycast 以及延迟问题,反正查询一定会被监听,被污染的域名也一定会被抢答… 所以在中国大陆环境下设置 DNS 为明文的 8.8.8.8 应该没有任何意义吧。
jqtmviyu
324 天前
所以这样的设置有问题吗?(实在有点难看懂)
dns:
enable: true
ipv6: true
listen: '0.0.0.0:53' # 监听所有 53 端口
use-hosts: true
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- '*.lan'
default-nameserver: # 解析 nameserver
- 223.5.5.5
- 119.29.29.29
nameserver:
- https://223.5.5.5/dns-query # 阿里
- https://120.53.53.53/dns-query # 腾讯
fallback:
- https://1.1.1.2/dns-query # cloudflare (过滤恶意网站)
- https://1.0.0.2/dns-query # cloudflare (过滤恶意网站)
- https://208.67.222.222/dns-query # OpenDNS
- https://208.67.220.220/dns-query
- https://9.9.9.9/dns-query # IBM Quad9 (过滤恶意网站)
fallback-filter: # 满足条件的将使用 fallback
geoip: true
geoip-code: CN # 除了配置的国家 IP, 其他的 IP 结果会被视为污染
geosite: # 列表的内容被视为已污染
- gfw
ipcidr: # 这些网段的结果会被视为污染
- 240.0.0.0/4
Blankspacee
324 天前
鉴定完毕,看不良林看多了。
danbai
324 天前
直接用 warp
RageBubble
324 天前
@Blankspacee 并不认识
xwhxbg
324 天前
@RageBubble 指向不明,系统代理说的如果是网络设置里面的 http https 代理,那个不可能代理 udp 流量,所以试图用这个来代理普通 dns 怕是不行
zhy0216
324 天前
想不明白 ipleak 是怎么知道你用哪个 dns 解析的?
RageBubble
324 天前
@xwhxbg 据我所知,clash 内置的 dns 模块本身就会劫持和处理 dns 请求,然后再决定是否本机发出解析请求还是让远程代理服务器解析。
和 clash 是否使用的是 http 还是 socks5 代理没有关系,这应该是两个不同的部分。
icy37785
324 天前
所谓应对 dns 泄漏没有任何意义。互联网民科特别喜欢跟 dns 过不去,不是做无用功就是反方向做功。坏就就坏在互联网民科的经验分享充满了整个互联网,把你这样的青春少年都带偏了。
RageBubble
324 天前
@icy37785 如果不忍心看着我们被带偏,那就好心给我们科普一下,为什么应对 dns 泄漏没有任何意义。怎么界定互联网民科,为什么互联网民科不是做无用功就是反方向做功?你有什么好的上网隐私保护建议?
vocaloid
324 天前
你把主流国外网站列出来放到配置里强制走远端代理就好了,doh 的话解析速度太慢了,实在受不了
RageBubble
324 天前
@xwhxbg #33 遵循系统代理的软件把 dns 请求发到了 clash 上,这个过程确实没有“代理”dns
RageBubble
324 天前
@jqtmviyu ipcidr 和 fake-ip-filter 还可以继续完善补充,但这样的设置对普通人上网来说已经可以了。

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

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

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

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

© 2021 V2EX