通过SOCKS代理发送UDP数据包

3
我正在构建一个简单的应用程序,该应用程序应通过socks4/5代理发送UDP数据包。我使用UDP协议,这样就不必保持连接打开。

然而,这并不像我想象的那么简单。根据这个架构图,我得出结论,在与代理服务器建立TCP连接之前,我无法通过代理发送UDP数据。

enter image description here

尽管如此,我还是找不到任何适合在CPP中构建这种连接的示例。如果您有任何资源,请告诉我 :)

2个回答

5

这是可能的。根据wikipedia SOCKS5协议的描述,您需要在客户端连接请求的字段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

正如Hasturkun指出的那样

你的代码无法工作,因为你根本没有发送连接请求。你必须发送一个UDP ASSOCIATE请求(在TCP连接上),并且你需要使用响应中的端口和地址来转发你的数据报。

你真的应该看一下Socks5 RFC


你好。当你说“可能”时,是在暗示我可以在没有先建立TCP SOCKS5连接的情况下通过UDP发送数据包吗?我已经成功通过SOCK_STREAM握手,但是通过SOCK_DGRAM却没有。我使用recvfrom()监听时根本没有收到任何东西。也许我做错了什么或者我不应该接收任何东西。我认为我应该在与代理服务器连接的相同端口上进行绑定? - Mike
你说得对。使用UDP会限制我只能使用SOCKS5,因为版本4不支持它。我的应用程序应该根据给定主机列表检查代理可用性。我认为通过使用UDP方法,我将不必同时打开大量连接,而只需发送单个数据包并等待响应,但也许这是不常见的做法。 - Mike
1
你可能会做到,所谓的多播。维基百科说:使用多播寻址的最常见传输层协议是用户数据报协议(UDP)。 - 4pie0
提前致谢。我使用tcpdump进行了一些详细检查,http://pastebin.com/raw.php?i=5YqznCpu 代理运行在tcp/udp端口4141上(dante服务器,1.4-pre2 - 最新版本)。当我使用netcat(命令:echo test | nc -u proxy_ip 4141)确保client_ip正在4141上侦听时,它似乎可以工作。然而,但丹特说了不同的话。看起来它无法响应client_ip。代理本身正在工作(使用FireFox SOCKS进行检查,尝试访问随机网站)。此外,我不确定为什么它显示IMCP PROXYSERVER_IP - Mike
1
你的代码无法工作,因为你根本没有发送连接请求。你必须发送一个UDP ASSOCIATE请求(在TCP连接上),并且需要使用响应中的端口和地址来中继你的数据报。我强烈建议你阅读SOCKS5 RFC,因为它还定义了如何执行封装(否则你将得不到任何中继)。 - Hasturkun
显示剩余3条评论

3
Mike,你的代码无法运行是因为你试图通过UDP数据报发送UDP关联命令。SOCKS5握手必须通过TCP控制连接完成。
服务器可能需要为每个客户端保持一个打开的TCP连接,但每个客户端不需要打开多个TCP连接 - 一个TCP连接可以处理任何数量的UDP关联命令。
如果你的唯一目的是在服务器端完全不使用TCP,那么它将无法实现你想要的功能。TCP连接是必需的,以便SOCKS代理知道何时取消关联UDP端口(即当TCP连接断开时)。
然而,你的服务器应用程序根本不需要担心这个问题。TCP控制连接在SOCKS服务器处终止,就像你的图表所示。
我建议阅读RFC。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接