为什么SOCKS5需要通过UDP中继UDP?

时间:2017-01-31 20:48:38

标签: networking tcp udp socks rfc

SOCKS5描述的RFC1928协议提供对UDP的支持。

总而言之,希望通过SOCKS5服务器中继UDP数据包的客户端必须至少:

  • 打开与SOCKS5服务器的TCP连接;
  • 发送UDP ASSOCIATE请求(cf section 4);
  • 从服务器接收必须发送UDP数据包的地址和端口;
  • 将数据报(UDP)发送到该地址,并使用一些标头封装(cf section 7)。

以下是一些相关引文,来自section 6

  

当UDP ASSOCIATE请求到达的TCP连接终止时,UDP关联终止。

     

在对UDP ASSOCIATE请求的回复中,BND.PORT和BND.ADDR字段指示客户端必须发送要中继的UDP请求消息的端口号/地址。

section 7

  

基于UDP的客户端必须在回复UDP ASSOCIATE请求时将其数据报发送到BND.PORT指示的UDP端口的UDP中继服务器。

为什么这么复杂? 为什么不在预先存在的TCP连接中发送UDP数据包?

编辑:对于clarify,我希望SOCKS代理通过TCP流接收UDP数据包,然后使用实际的UDP将它们传输到目标。然后从目标接收UDP数据包并将其发送回TCP流。

以下是一些背景信息。

我的目标是实施反向网络共享,以便Android设备可以使用其插入的计算机的互联网连接,而无需在设备和计算机上访问 root ({{ 3}}有效但需要在计算机上进行 root 访问。)

我的第一个想法是在计算机上启动一个带ssh -D的简单SOCKS5服务器,这样我只需要实现客户端。由于adb提供的远程端口转发,数据包将通过adb reverse从设备传输到计算机......

不幸的是, OpenSSH SOCKS服务器SimpleRT。但这只是实现的限制,我本可以使用另一个SOCKS服务器。

但是,adb reverse也不支持UDP转发。

因此我的问题是关于SOCKS5协议。

我目前正在编写一个PoC,通过TCP实现我自己的(简单)协议,它能够中继UDP数据包,但我很失望不能使用标准协议(并从现有实现中获益)。

1 个答案:

答案 0 :(得分:2)

我正在回答我自己的问题:它可能是为了避免TCP机制(数据包重传,head-of-line blocking ...)。

对于本地反向网络共享工具,它不是问题,因此我在不使用SOCKS的情况下通过TCP实现了UDP。