XTLS / Xray-core

Xray, Penetrates Everything. Also the best v2ray-core, with XTLS support. Fully compatible configuration.
https://t.me/projectXray
Mozilla Public License 2.0
24.51k stars 3.84k forks source link

1.6.2之后无法代理MySQL流量 #1376

Closed latifrons closed 1 year ago

latifrons commented 1 year ago

1.6.2及以后版本(测到1.6.4),dbeaver设置socks5 proxy,或通过Proxifier直接接管dbeaver/mysql-client流量,均无法通过Xray连接到远程数据库,表现为进出字节均为0。 image

Redis 客户端、MongoDB客户端均没有问题; 远端服务器mysql-client直连数据库没问题;

direct和vision均在1.6.2后出现问题,direct在1.6.1时没有问题。

Windows 11, v2rayN v5.38

xqzr commented 1 year ago

dokodemo-door

latifrons commented 1 year ago

1347 May be related.

yuhan6665 commented 1 year ago

请试用 1.6.5 如果有问题再打开

latifrons commented 1 year ago

Reopen. 服务端/客户端均已升级到v1.6.5,仍有问题 经测试,vless+grpc+tls一样有问题 @yuhan6665 请重新打开。

lns103 commented 1 year ago

试试http代理?我更新到1.6.5之后使用http代理在Windows上可以连接ssh了,sock5还是不行,1.6.1使用http和sock5都可以

latifrons commented 1 year ago

试试http代理?我更新到1.6.5之后使用http代理在Windows上可以连接ssh了,sock5还是不行,1.6.1使用http和sock5都可以

我1.6.5 http 和socks5都可以连接ssh,都不能连接mysql(send/receive都是0 byte),提示

Classic protocol error: MySQL Error 2013 (HY000): Lost connection to MySQL server at 'waiting for initial communication packet', system error: 10060

xsm1997 commented 1 year ago

这里给出一个我的环境下可以稳定复现类似问题的方法。

我也遇到了ssh无法通过代理连接的问题(使用xshell+xray-core 1.6.4),但是重新添加xshell的ssh配置之后神奇的好了,之后也没有遇到ssh的问题。当时测试的是,客户端使用1.6.2 1.6.3 1.6.4,服务端使用1.6.4,无论是使用xtls-rprx-vision还是只使用tls,都无法连接。但客户端使用1.6.1和tls,即使服务端使用1.6.4,也可以连接。具体表现和@latifrons 的相同,tcp连接无流量,且服务端无log。

之后我在玩一个游戏(PSO2NGS)的时候,也发生了无法连接服务器的问题。表现和ssh的一样,而且可以稳定复现。

游戏的服务器为202.234.45.89:12599,裸tcp连接,我这里使用的是windows的telnet命令。注意此游戏的服务器可能屏蔽中国大陆和美国一些ISP的IP访问,如在服务器上也telnet不通,建议使用日本的IP。使用1.6.1版本客户端+1.6.5版本服务端,可看到如下返回。

image

但是用1.6.5版本的客户端,无论是否启用xtls-rprx-vision,均会直接卡住,看不到回复。

但如果在telnet客户端里按一个键,随便发送一个字符,则可以看到回复,同时服务端立即出现相关log。

@yuhan6665 能麻烦您测试一下吗?

xsm1997 commented 1 year ago

搭建了一个最小测试环境,即在服务器运行nc -l -p 6666监听tcp连接,客户端使用telnet server-ip 6666通过代理连接服务器。(我使用了透明代理环境)

具体测试流程:

  1. 先开启服务器nc
  2. 使用客户端telnet连接,但是不要输入,只建立tcp连接
  3. 在服务器nc输入一些字符+回车
  4. 客户端telnet不会有显示
  5. 在客户端telnet输入一个字符+回车
  6. 服务端nc有显示,同时客户端也会收到之前服务端发来的字符

以上流程在1.6.5版本客户端复现。在1.6.1版本客户端中,第4步时客户端telnet就可以显示。在不通过代理连接服务器时,表现和1.6.1版本相同。

推测为建立代理连接,但客户端不发送数据时,接收不到服务端发来的数据。已知ssh是这样的逻辑,即建立tcp连接后,要等待服务端返回ssh服务器名称和版本号后,再进行后续的握手。(有一些客户端同时也会发送自身的信息,不等待,如putty,所以这正好可以解释为什么有的人有问题有的人没问题。xshell新版本和putty逻辑相同,旧版本要先等待,而我最近更新了版本,所以也可以解释我遇到的问题。)推测MySQL协议也是这样的逻辑。

yuhan6665 commented 1 year ago

@xsm1997 感谢大佬的详尽分析 应该修好了https://github.com/XTLS/Xray-core/pull/1425 https://github.com/XTLS/Xray-core/actions/runs/3667339817

xsm1997 commented 1 year ago

我的问题已经修复,感谢大佬!

latifrons commented 1 year ago

感谢两位大佬 @xsm1997 的分析和 @yuhan6665 的修复,MySQL的问题经测试也已经解决。