通过 SOCKS 代理发送 UDP 数据包

Posted

技术标签:

【中文标题】通过 SOCKS 代理发送 UDP 数据包【英文标题】:Sending UDP packets through SOCKS proxy 【发布时间】:2013-08-25 11:27:40 【问题描述】:

我正在构建一个简单的应用程序,它应该通过 socks4/5 代理发送 UDP 数据报包。我使用 UDP 方法,所以我不必保持连接打开。

然而,这并不像我想象的那么容易。根据这个模式,我得出结论,如果不先与代理服务器建立 TCP 连接,我就无法通过代理发送 UDP 数据。

尽管如此,我还是找不到在 CPP 中建立这种连接的任何合适示例。我会感谢任何资源:)

【问题讨论】:

【参考方案1】:

这是可能的。您必须根据 SOCKS5 协议的wikipedia 描述在客户端连接请求的字段 2 中指定值 0x03。

The client's connection request is
field 1: SOCKS version number, 1 byte (must be 0x05 for this version)
field 2: command code, 1 byte:
0x01 = establish a TCP/IP stream connection
0x02 = establish a TCP/IP port binding
0x03 = associate a UDP port
field 3: reserved, must be 0x00
field 4: address type, 1 byte:
0x01 = IPv4 address
0x03 = Domain name
0x04 = IPv6 address
field 5: destination address of
4 bytes for IPv4 address
1 byte of name length followed by the name for Domain name
16 bytes for IPv6 address
field 6: port number in a network byte order, 2 bytes

正如哈斯图尔昆指出的那样

您的代码不起作用,因为您没有发送连接请求 一点也不。您必须发送一个 UDP ASSOCIATE 请求(在 TCP 连接上), 并且您需要使用响应中的端口和地址来获取您的 中继的数据报。

你真的应该看看Socks5 RFC

【讨论】:

嗨。通过说“有可能”,您是否暗示我可以通过 UDP 发送数据报包,而无需先建立 TCP SOCKS5 连接?我通过 SOCK_STREAM 成功握手,但没有通过 SOCK_DGRAM。使用 recvfrom() 收听时,我根本没有收到任何东西。也许我做错了,或者我不应该收到任何东西。我假设我应该在连接到代理服务器的同一端口上绑定? 你是对的。使用 UDP 将我限制为 SOCKS5,因为版本 4 不支持它。我的应用程序应根据给定主机的列表检查代理可用性。我认为通过使用 UDP 方法,我不必同时打开很多连接,只需发送单个数据包并等待响应,但也许这是不常见的做法。 你可能会这样做,所谓的多播。 Wikipedia says:使用多播寻址的最常见传输层协议是用户数据报协议 (UDP)。 谢谢。如果这不是太多,你能看看我的sn-p吗?我可以通过 TCP 成功建立连接(我收到 0x05 0x00 作为预期)但使用 UDP 我什么也没收到(程序等待发送一些数据)pastebin.com/SnP6drFX 您的代码不起作用,因为您根本没有发送连接请求。您必须发送一个 UDP ASSOCIATE 请求(在 TCP 连接上),并且您需要使用响应中的端口和地址来中继您的数据报。我强烈建议您阅读SOCKS5 RFC,因为它还定义了封装的执行方式(没有它,您将不会得到任何中继)【参考方案2】:

Mike,您的代码不起作用,因为您正试图通过 UDP 数据报发送 UDP 关联命令。 SOCKS5 握手必须通过 TCP 控制连接。

您的服务器可能需要为每个客户端保持一个打开的 TCP 连接,但每个客户端不需要打开多个 TCP 连接 - 一个 TCP 连接可以处理任意数量的 UDP 关联命令。

如果您的唯一目的是在服务器端根本不使用 TCP,那么它不会达到您想要的效果。需要 TCP 连接,以便 SOCKS 代理知道何时解除 UDP 端口的关联(即 TCP 连接断开时)。

但是,您的服务器应用程序根本不需要担心这一点。正如您的图表所示,TCP 控制连接在 SOCKS 服务器处终止。

我建议阅读 RFC。

【讨论】:

以上是关于通过 SOCKS 代理发送 UDP 数据包的主要内容,如果未能解决你的问题,请参考以下文章

socks5udp转发不通过

为啥 SOCKS5 需要通过 UDP 中继 UDP?

Socks5 udp代理

socks5代理的工作原理

如何通过袜子发送TCP数据包?

为啥 HTTP/HTTPS 代理和 Socks 代理可以在一个端口上工作?