SOCKS5 - 连接认证

3
我正在尝试按照RFC1928实现反向SOCKS5。我有一个中继服务器, passively运行等待来自充当代理的SOCKS5客户端和想要使用隧道的客户端的连接。
图例:
服务器(10.211.55.6) = 中继 = PC 1 (发送/接收)
客户端_1 (10.211.55.10) = 代理(在我的网络中另一台电脑上运行)
客户端_2 (10.211.55.8) = 隧道(从MaxThon浏览器连接(因为它允许SOCKS5身份验证))
执行流程:
1. 客户端_1连接到服务器的9444端口
2. 服务器找到一个未使用的端口并绑定到它(假设打开了13451端口)
3. 客户端_2连接到服务器的13451端口
4. 服务器接受连接,现在在客户端_1和客户端_2之间中继流量
5. 客户端_2通过服务器中继发送SOCKS5协议(根据RFC1928),请求客户端_1
6. 客户端_1进行身份验证,并得到连接到https://dnsleaktest.com的命令,并发送status_ok响应
7. 接收网页的数据包并加载网页
问题:
8. 客户端_2想要连接到另一个网页(例如https://packetstormsecurity.com)。
问题:
客户端_1仅从客户端_2接收到一些数据包,例如\x17\x3\x3或\x17\x3\x3\x1(这些字节表示什么?)。客户端_1是否必须再次通过SOCKS5进行身份验证,或者如何处理对新网页的请求?
备注:
A) 一段时间后,客户端_2从客户端_1请求的页面在浏览器中返回ERR_TIMED_OUT,因为客户端_2没有收到任何响应。但是,如果它期望响应,则也假定我知道如何解析它发送的字节,但是我没有在RFC1928文档中看到它们的含义。
1个回答

2

Client_1只从Client_2接收到少量数据包,例如\x17\x3\x3或\x17\x3\x3\x1(这些字节代表什么?)。

Client_2正在请求与HTTPS主机的隧道。您看到的是在建立到HTTPS服务器的SOCKS隧道之后,Client_2和HTTPS服务器之间的TLS 1.2数据包:

\x17 = 内容类型(#23,应用程序数据)
\x03 = 主版本3
\x03 = 次要版本3
\x01 = 片段长度(1个字节)
...

Client_1是否必须再次通过SOCKS5身份验证

一旦建立了SOCKS隧道,通过该隧道传输的所有内容都是应用程序定义的数据。因此,SOCKS客户端没有办法在现有的TCP连接上发送新的SOCKS命令。那就意味着Client_2必须创建一个新的TCP连接到中继服务器(因此到Client_1),以便请求到不同主机的新的SOCKS隧道,并且需要进行新的SOCKS身份验证握手(即使未涉及SOCKS,Client_2也必须建立到新主机的新TCP连接)。

或者如何处理对新网页的请求?

在Client_1处理请求之前,必须等待接受来自Client_2(或任何其他客户端)的新TCP连接,以便处理请求到新的SOCKS隧道。

一段时间后,浏览器中表示Client_2请求的页面返回ERR_TIMED_OUT,因为Client_2未收到任何响应。

然后可能是HTTPS服务器未响应Client_2的HTTPS请求,或更可能的是Client_1在处理SOCKS隧道时存在逻辑错误,并且未将HTTPS服务器的响应数据中继给Client_2。

但如果它期望有响应,那么它也假定我知道如何解析它发送的字节,但我不知道它们是什么,因为我没有在RFC1928文档中看到过它们。

一旦Client_1建立了SOCKS隧道,它不应解析通过该隧道传输的任何内容(除非您协商的SOCKS身份验证方案需要封装传输的数据)。通过SOCKS隧道传输的数据是应用程序定义的,因此只有该隧道两端的客户端和目标服务器知道数据实际上是什么。Client_1必须原样中继(如果需要处理封装)它在两个方向上接收到的任何原始数据(就像您的中继服务器一样)。


1
“但是我该如何自动化这个过程” - 实际上并没有什么可以自动化的。Client_2决定何时向中继服务器建立新的TCP连接,然后中继服务器决定要将数据中转到哪个Client_1。Client_1必须基于每个TCP连接处理SOCKS协议。 - Remy Lebeau
1
当Client_2想要连接到一个新的主机时,它必须创建一个新的TCP连接,这是必须的(如果在Client_2的浏览器中打开了多个选项卡,则可以保留先前的TCP连接)。服务器套接字可以同时连接多个客户端。因此,您的Relay Server可以(并且应该)只开放1个端口供多个Client_2连接。Relay Server必须跟踪哪个Client_2连接与哪个Client_1连接相关,以便可以进行数据中继。当Client_1打开到请求的服务器的隧道时,也是同样的情况。 - Remy Lebeau
1
我的目标是尽可能地让用户使用起来更加容易。这就是为什么我要问如何做到让用户每次想连接新主机时都不必在MaxThon浏览器中配置新端口。 - user9431147
1
用户必须配置他们的浏览器以连接到SOCKS代理,无法自动化该过程。然后,浏览器将根据需要向配置的代理服务器创建新的TCP连接。用户只需将您的中继服务器指定为代理即可。如果您正确地管理连接和中继,则其余部分在浏览器和中继服务器之间,在中继服务器和Client_1之间以及在Client_1和目标服务器之间透明地处理。如果您遇到问题,听起来好像没有正确地管理连接和中继。 - Remy Lebeau
1
你最近的评论回答了我所有的问题,所以我应该在一个新线程中运行步骤2的端口,当Client_2连接到一个新主机时,它会启动一个新的连接序列。感谢您澄清了一切! - user9431147
显示剩余3条评论

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