总而言之,希望通过SOCKS5服务器中继UDP数据包的客户端必须至少:
UDP ASSOCIATE
请求(cf section 4); 以下是一些相关引文,来自section 6:
当UDP ASSOCIATE请求到达的TCP连接终止时,UDP关联终止。
在对UDP ASSOCIATE请求的回复中,BND.PORT和BND.ADDR字段指示客户端必须发送要中继的UDP请求消息的端口号/地址。
基于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数据包,但我很失望不能使用标准协议(并从现有实现中获益)。
答案 0 :(得分:2)
我正在回答我自己的问题:它可能是为了避免TCP机制(数据包重传,head-of-line blocking ...)。
对于本地反向网络共享工具,它不是问题,因此我在不使用SOCKS的情况下通过TCP实现了UDP。