为什么 SOCKS5 需要通过 UDP 中继 UDP?
Why does SOCKS5 require to relay UDP over UDP?
SOCKS5 protocol, described by RFC1928 提供对 UDP 的支持。
总而言之,希望通过 SOCKS5 服务器中继 UDP 数据包的客户端至少必须:
- 打开到 SOCKS5 服务器的 TCP 连接;
- 发送一个
UDP ASSOCIATE
请求(cf section 4);
- 从服务器接收它必须发送要中继的 UDP 数据包的地址和端口;
- 发送数据报 (UDP) 到那个地址,封装一些 headers (cf section 7).
这里有一些相关的引述,来自section 6:
A UDP association terminates when the TCP connection that the UDP ASSOCIATE request arrived on terminates.
In the reply to a UDP ASSOCIATE request, the BND.PORT and BND.ADDR fields indicate the port number/address where the client MUST send UDP request messages to be relayed.
A UDP-based client MUST send its datagrams to the UDP relay server at the UDP port indicated by BND.PORT in the reply to the UDP ASSOCIATE request.
为什么这么复杂? 为什么不直接在 pre-existing TCP 连接中发送 UDP 数据包?
编辑: 对于 ,我期望 SOCKS 代理通过 TCP 流接收 UDP 数据包,然后使用实际 UDP 将它们传输到目标。然后从目标接收 UDP 数据包并将它们发送回 TCP 流。
这里是一些上下文。
我的目标是实现反向网络共享,以便 Android 设备可以使用它所插入的计算机的互联网连接,而不需要 root 访问两者在设备和计算机上(SimpleRT 可以工作,但需要在计算机上具有 root 访问权限。
我的第一个想法是在电脑上用ssh -D
启动一个简单的SOCKS5服务器,这样我只需要实现客户端即可。由于 adb reverse
…
提供的 远程端口转发 ,数据包将通过 adb
从设备传输到计算机
不幸的是,OpenSSH SOCKS 服务器 does not support UDP。但这只是实现的一个限制,我可以改用另一个 SOCKS 服务器。
但是adb reverse
也不支持UDP转发
因此我提出了关于 SOCKS5 协议的问题。
我目前正在编写一个通过 TCP 实现我自己的(简单)协议的 PoC,它能够中继 UDP 数据包,但我很失望不能使用标准协议(并从现有实现中受益)。
我在回答我自己的问题:可能是为了避免TCP机制(数据包重传,head-of-line blocking…)。
对于本地反向网络共享工具,这不是问题,所以我在不使用 SOCKS 的情况下通过 TCP 实现了 UDP。
SOCKS5 protocol, described by RFC1928 提供对 UDP 的支持。
总而言之,希望通过 SOCKS5 服务器中继 UDP 数据包的客户端至少必须:
- 打开到 SOCKS5 服务器的 TCP 连接;
- 发送一个
UDP ASSOCIATE
请求(cf section 4); - 从服务器接收它必须发送要中继的 UDP 数据包的地址和端口;
- 发送数据报 (UDP) 到那个地址,封装一些 headers (cf section 7).
这里有一些相关的引述,来自section 6:
A UDP association terminates when the TCP connection that the UDP ASSOCIATE request arrived on terminates.
In the reply to a UDP ASSOCIATE request, the BND.PORT and BND.ADDR fields indicate the port number/address where the client MUST send UDP request messages to be relayed.
A UDP-based client MUST send its datagrams to the UDP relay server at the UDP port indicated by BND.PORT in the reply to the UDP ASSOCIATE request.
为什么这么复杂? 为什么不直接在 pre-existing TCP 连接中发送 UDP 数据包?
编辑: 对于
这里是一些上下文。
我的目标是实现反向网络共享,以便 Android 设备可以使用它所插入的计算机的互联网连接,而不需要 root 访问两者在设备和计算机上(SimpleRT 可以工作,但需要在计算机上具有 root 访问权限。
我的第一个想法是在电脑上用ssh -D
启动一个简单的SOCKS5服务器,这样我只需要实现客户端即可。由于 adb reverse
…
adb
从设备传输到计算机
不幸的是,OpenSSH SOCKS 服务器 does not support UDP。但这只是实现的一个限制,我可以改用另一个 SOCKS 服务器。
但是adb reverse
也不支持UDP转发
因此我提出了关于 SOCKS5 协议的问题。
我目前正在编写一个通过 TCP 实现我自己的(简单)协议的 PoC,它能够中继 UDP 数据包,但我很失望不能使用标准协议(并从现有实现中受益)。
我在回答我自己的问题:可能是为了避免TCP机制(数据包重传,head-of-line blocking…)。
对于本地反向网络共享工具,这不是问题,所以我在不使用 SOCKS 的情况下通过 TCP 实现了 UDP。