dyhkwong / Exclave

A fork of SagerNet powered by V2Ray and its derivatives
https://t.me/exclavian
Other
591 stars 36 forks source link

packet-encoding特性会与覆盖目标地址设置冲突 #66

Closed himan85 closed 3 months ago

himan85 commented 3 months ago

描述问题

起因是使用chatgpt的app需要开启覆盖目标地址设置才能正常访问,折腾一轮发现节点只要开启packet-encoding特性,覆盖目标地址就会失效,服务端看到的是目标ip而不是域名,目前不知道是exclave的bug还是v2ray的bug,该问题在使用singbox的nekobox不存在

如何复现

复现步骤:

只要同时打开上述两个设定就会复现

调试信息

暂无

预期行为

上述两项设定应不冲突

屏幕截图

暂无

设备信息

dyhkwong commented 3 months ago

packetEncoding: packet 在协议上目的地址只支持 IP,不支持域名,所以只能将域名解析为 IP 再发出。sing-box 自然也是不支持的,你确定 nekobox 在使用 packetaddr 时能将域名发送到远端吗?

dyhkwong commented 3 months ago

看了下 sing-box packetaddr 是 TCP 是正常发送域名,UDP 是直接报错不支持域名。一定要用 packetaddr 的话也许也可以改成这样。或者改成不对目的地址是域名 UDP 应用 packetaddr。

dyhkwong commented 3 months ago

测试下 12e93aa。已修改成只对目的地址是 IP 的 UDP 应用 packetaddr、不对目的地址是域名的 UDP 应用 packetaddr,并且不解析域名为 IP。由于协议限制,对于需要传递域名到服务端的场景不建议使用 packetEncoding: packet

himan85 commented 3 months ago

测试下 12e93aa。已修改成只对目的地址是 IP 的 UDP 应用 packetaddr、不对目的地址是域名的 UDP 应用 packetaddr,并且不解析域名为 IP。由于协议限制,对于需要传递域名到服务端的场景不建议使用 packetEncoding: packet

再测试下0.11.4,发现packetEncoding跟fakedns也会有冲突,无论tcp还是udp服务端会显示198.18开头的地址,不过应该指向的是同一个问题。

跟踪了下v2ray的dns过程,他只在freedom的dial时候会解析域名,所以v5版的v2ray通过覆盖目标地址实现fullcone并不是一个理想的做法,会导致更多奇怪的问题,如果开启fakedns或者域名覆盖目标地址同时又启用packetEncoding: packet的时候,会造成stun或者quic这类协议无法正常工作。

但是还是建议把域名传递到服务端,用stun测试后发现v2ray只会提示‘unknown address type: 3’错误而不会导致其他问题,但某些改善这个问题的第三方vmess实现可以正常工作。

dyhkwong commented 3 months ago

12e93aa 已经牺牲 full cone 把域名传到服务端了。在协议不支持的情况下不太可能在不扩展原有协议的情况下改善。