gpt4 book ai didi

sockets - 如何将 HTTPS 流量从 SOCKS 代理转发到 HTTP 代理

转载 作者:可可西里 更新时间:2023-11-01 16:49:55 27 4
gpt4 key购买 nike

我已经编写了一个 SOCKS 代理,如果关闭链接,它可以同时处理 HTTP 和 HTTPS 流量。

如果打开链接并且转发主机和端口属于过滤 HTTP 代理,则只有 HTTP 流量可以流动。 HTTPS 流量不流动并报告 SSL 错误。

请注意,当请求直接来自浏览器而不是来自 SOCKS 服务器时,HTTP 代理会处理 HTTPS 流量。

例如,如果我向 https://www.google.com 发出请求发生以下情况:

1) 客户端发送 SOCKS 5 问候语让我们知道哪些身份验证方法是可以接受的。

2) 服务器响应NO_AUTH

3) 客户端发送连接请求(包括预期的目标主机和端口)。

4) 服务器创建套接字并将其连接到 HTTP 代理服务器,并以 GRANTED 响应客户端

5) 然后 SOCKS 服务器收到以下请求(不可见/控制字符已全部替换为它们的字符代码,因此您可以看到发生了什么):

\u0016\u0003\u0001\u0000Ñ\u0001\u0000\u0000Í\u0003\u0003áp¥@Ia¹\u0001„Ä\u0006 É;š‰‰4\u001dýà•J>Ü6¢Þ\fö\u001c%\u0000\u0000(À+À/\u0000žÌ\u0014Ì\u0013À\nÀ\tÀ\u0013À\u0014À\u0007À\u0011\u00003\u00002\u00009\u0000œ\u0000/\u00005\u0000\n\u0000\u0005\u0000\u0004\u0001\u0000\u0000|\u0000\u0000\u0000\u0013\u0000\u0011\u0000\u0000\u000ewww.google.comÿ\u0001\u0000\u0001\u0000\u0000\n\u0000\b\u0000\u0006\u0000\u0017\u0000\u0018\u0000\u0019\u0000\u000b\u0000\u0002\u0001\u0000\u0000#\u0000\u00003t\u0000\u0000\u0000\u0010\u0000\u001b\u0000\u0019\u0006spdy/3\bspdy/3.1\bhttp/1.1uP\u0000\u0000\u0000\u0005\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0000\u0012\u0000\u0000\u0000\r\u0000\u0012\u0000\u0010\u0004\u0001\u0005\u0001\u0002\u0001\u0004\u0003\u0005\u0003\u0002\u0003\u0004\u0002\u0002\u0002

如您所见,它完全不可读,但我们已经知道用户打算从初始 SOCKS 连接消息(第 3 步)转到哪里,因此我们可以创建并发出以下连接请求:

CONNECT www.google.com:443 HTTP/1.1\r\nUser-Agent: MySocksServer\r\nProxy-Connection: keep-alive\r\nHost: www.google.com\r\n\r\n

6) 这个新构造的 CONNECT 被发送到我们链接到的 HTTP 代理,这个代理检查它的过滤规则并响应:

HTTP/1.1 200 Connection Established\r\nVia: 1.1 HTTPserverName\r\nX-WebMarshal-RequestID: AN_ID_STRING\r\n\r\n

7) 这在我们的 SOCKS 服务器中接收并转发(未修改)到客户端。在我的调试中,我在发送请求之前直接监视套接字,可以看到客户端套接字已连接。

8) 引发的下一个事件是错误,错误为 SOCKET_NOT_CONNECTED,对套接字运行另一次检查确认客户端套接字确实不再连接。

为什么我的套接字会在此处的第 7 步和第 8 步之间关闭?我没有正确遵循协议(protocol)吗?我看不到我错过了什么。我想我在某种程度上错误地处理了 CONNECT 方法?

如果我不修改 SOCKS 服务器收到的请求(即将其转换为 CONNECT 请求),而是将不可读的数据直接转发到 HTTP 代理,那么 HTTP 代理的日志显示:

Badly formated request: \u0016\u0003\u001
Bad request received.

Failed to read request: Client closed connection. (0)
1Request took 0 ms + 23 ms idle time

最佳答案

正确的顺序是:

  1. 客户端连接到 SOCKS 代理,根据需要进行身份验证。

  2. 客户端发送 SOCKS 连接请求以创建到 www.google.com:443 的隧道。

  3. SOCKS 代理连接到 HTTP 代理

  4. SOCKS 代理发送 HTTP CONNECT 请求以创建到 www.google.com:443 的隧道。

  5. SOCKS 代理接收来自 HTTP 代理的回复。

  6. SOCKS 代理向客户端发送适当的 SOCKS 回复。

  7. 如果 HTTP 代理成功,则在客户端和 HTTP 代理之间传递未修改的数据,直到其中一个断开连接。

  8. 关闭客户端连接和 HTTP 代理连接。

当您链接代理时,您必须先协商隧道,然后才能开始通过它们传递应用程序数据。在下一个代理首先回复其隧道状态之前,不要向客户端发送隧道回复。

关于sockets - 如何将 HTTPS 流量从 SOCKS 代理转发到 HTTP 代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25188595/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com