全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

IP归属甄别会员请立即修改密码
查看: 8548|回复: 30
打印 上一主题 下一主题

[经验] 一个Clash的DNS泄露的bug

[复制链接]
跳转到指定楼层
1#
发表于 2024-6-8 14:12:52 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 他回精神病院了 于 2024-6-8 18:59 编辑

理论上,在fakeip模式下,只要配置合理(在匹配到对应规则之前,前面的规则不会导致产生DNS解析请求),只有直连的请求才会在本地解析DNS,所有通过服务器的以及被拦截的请求不会在本地产生DNS解析请求记录。
clash在处理UDP请求时,会尝试寻找已经存在的socket进行复用,这个时候会对所有域名在本地查DNS缓存,缓存里没有的会进行DNS解析,导致了DNS泄露。
Chrome等浏览器,默认会尝试使用QUIC。第一次请求的时候本地的缓存里是查不到这个记录的,所以会在本地发起DNS解析的请求,导致浏览器查看的网址DNS泄露。


具体导致泄露的代码在tunnel.go里的handleUDPConn函数里的"local resolve UDP dns"部分,具体代码如下(以clash开源版代码为准):
  1. ```golang
  2.         // local resolve UDP dns
  3.         if !metadata.Resolved() {
  4.                 ips, err := resolver.LookupIP(context.Background(), metadata.Host)
  5.                 if err != nil {
  6.                         packet.Drop()
  7.                         return
  8.                 } else if len(ips) == 0 {
  9.                         packet.Drop()
  10.                         return
  11.                 }
  12.                 metadata.DstIP = ips[0]
  13.         }
  14. ```
复制代码

这段代码在最开始的地方,在分流代码之前,所以会对所有请求进行DNS解析(包括通过服务器连接的、被拦截的)。

检查了一下Clash.Meta的代码,相同的代码也存在,所以Clash.Meta也有相同的问题。根据作者的提交记录(见下面),代码是从premium版本同步过来的,所以盲猜premium版本也有此问题。
  1. ```git log
  2. commit 3946d771e52fb72dfc91543dda8c785597622a9b
  3. Author: Dreamacro <[email protected]>
  4. Date:   Sat Aug 13 13:07:35 2022 +0800

  5.     Feature: sync missing resolver logic from premium, but still net.IP on opensource

  6. diff --git a/tunnel/tunnel.go b/tunnel/tunnel.go
  7. --- a/tunnel/tunnel.go
  8. +++ b/tunnel/tunnel.go
  9. @@ -183,1 +183,1 @@
  10. -               ip, err := resolver.ResolveIP(metadata.Host)
  11. +               ips, err := resolver.LookupIP(context.Background(), metadata.Host)
  12. ```
复制代码


解决方法(二选一):
第一种:在resolver中增加一个只查本地DNS缓存,不进行网络请求的查询函数来替换这里的resolver.LookupIP。由于clash已经删库了,所以只能自己进行。
第二种:没有能力自己改代码的mjj,可以在DNS的fallback-filter里指定敏感的网址只走国外的特定服务器(必须是加密的,不然也没用),这样就算本地多一次无用DNS查询,也不会导致DNS泄露给国内的DNS服务器。
第二种方法的缺点就是依然会多一次DNS请求,并且要持续维护这个列表。

P.S.我下午尝试用第一种方法修复了一下,添加只查询本地DNS缓存的方法以后依然要修改其他几个地方。
1、如果你在使用VMess协议的话,vmess.go中的ListenPacketContext函数依然会在分流前发起DNS请求,这里的代码需要处理(注销掉DNS查询代码,后续修改见后面)。
2、tunnel/connection.go函数中的handleUDPToRemote需要使用DNS解析出来的IP地址,这里要改成也可以使用域名。如果这里要可以使用域名,constant/adapters.go中的接口PacketConn需要增加支持新的传递UDP包的函数(之前复用的net.PacketConn包中的WriteTo,所以只能传递IP地址)。
3、WriteTo函数接口修改以后,需要修改所有出站协议的WriteTo实现。
推荐
发表于 2024-6-8 14:14:25 | 只看该作者
好帖,这才是loc该有的样子
推荐
发表于 2024-6-8 15:18:52 | 只看该作者
他回精神病院了 发表于 2024-6-8 14:17
见到一千元的罚款单和保证书以后就有所谓了

感谢分享。

但六扇门要是根据DNS泄露来请喝茶,那他们整天啥事都不用做了,14亿人得有一半得去一趟。。。

BTW,真在意的话,直接把浏览器里的quic关掉更简单:chrome://flags/#enable-quic
31#
发表于 2024-6-20 14:38:30 | 只看该作者
学习了。好帖啊
30#
发表于 2024-6-20 14:33:56 | 只看该作者
Clash  还有别的BUG。。。    白女票 两年了。。。
29#
 楼主| 发表于 2024-6-20 12:57:35 | 只看该作者
suichang 发表于 2024-6-16 09:35
dns远程解析,本地再根据ip分流不好用?
fakeip有啥优势?

全部通过境外DNS服务器远程解析的话主要问题是:
1、国内网站访问速度慢
2、国内的网站可能解析到国外的镜像站IP,导致一些异常
3、国外的大网站也有不同的接入点,DNS服务器和代理服务器不同会导致访问慢或者异常。

fakeIP的优势就是在收到浏览器等客户端发来的DNS解析请求的时候不需要真正的去解析,直接返回一个假的IP,只有本地直接访问的网站才在请求的时候发起DNS解析。通过代理服务器访问的网站本地不会进行真正的DNS解析请求,代理服务器上才进行真正的解析。
28#
 楼主| 发表于 2024-6-20 12:48:10 | 只看该作者
在7楼 发表于 2024-6-16 09:32
对了,方法二看起来是解决不了的,因为fallback和nameserver是并发查询的,不是先后:https://wiki.metacub ...

fallback-filter里设置的域名只查fallback的服务器的,不会查nameserver里设置的服务器。
27#
发表于 2024-6-16 09:35:38 | 只看该作者
dns远程解析,本地再根据ip分流不好用?
fakeip有啥优势?
26#
发表于 2024-6-16 09:32:34 | 只看该作者
本帖最后由 在7楼 于 2024-6-16 09:34 编辑

对了,方法二看起来是解决不了的,因为fallback和nameserver是并发查询的,不是先后:https://wiki.metacubex.one/config/dns/diagram/

所以用fallback只能保证拿到的ip是不受污染的,不能防泄露,nameserver还是发起请求了。

今天整理自己的calsh配置文件时突然发现的。这个fallback坑有点多,能不用还是尽量别用了。

也许可以改成用nameserver-policy
25#
 楼主| 发表于 2024-6-9 22:50:17 | 只看该作者
Susanoo 发表于 2024-6-9 11:43
在 debug log 里没看到走科学的 dns 请求,这个dns会被 log 吗

这里没有打log,所以log里看不到,你自建一个DNS服务器,让clash走你自建的服务器就看到了。
24#
 楼主| 发表于 2024-6-9 22:49:11 | 只看该作者
perfuse 发表于 2024-6-9 10:42
singbox呢,为什么不把DNS通过节点发送?原理上做不到?不理解

singbox不了解,没用过。原理上能做到,所以说是个bug。
23#
发表于 2024-6-9 11:43:54 | 只看该作者
在 debug log 里没看到走科学的 dns 请求,这个dns会被 log 吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2026-1-10 13:56 , Processed in 0.112745 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表