我正在尝试开发一个透明代理,它将来自客户端的不安全 http 流量作为安全的 https 流量转发到服务器,然后再返回。为了更好地说明我的观点,请看下图。
假设由于各种原因客户端将仅使用 HTTP,它们不能将端口 443 用于 HTTPS。由于某些服务器不接受来自端口 80 的流量,因此我的代理需要将它们重新路由到端口 443。这是一种可能的情况:
- 从客户端接收数据,这些数据指向 www.google.com 的端口 80
- 初始化与https://www.google.com到端口 443 的连接(握手等)
- 加密来自客户端的数据并将它们发送到https://www.google.com到端口 443。
- 从https://www.google.com接收响应,解密它们并将它们发送回客户端到端口 80。
由于这是一个透明代理,因此客户端(在我的情况下是很多客户端)不需要任何额外的配置。网络已经配置好,以便他们的流量通过我的节点。目前,我的节点只是重新路由数据并阻止一些数据(如果它们包含病毒)。这是使用WinPcap访问低网络层完成的,但如果使用原始数据包(主要关注握手)太难完成,我愿意改变我的方法。
我试过的: 注意:www.google.com 可以是网络上的任何站点。它仅用作示例。
- 铱星的建议。这不起作用,因为 TcpListener 仅在另一个应用程序使用 TcpClient 连接到它时才接受新连接。由于这是一个透明代理,它不起作用。
- 改为使用 HttpListener。但是,这似乎不起作用,因为它只接受到我自己的 IP(而不是 www.google.com)的连接。
- 像以前一样使用 HttpListener 但这次我将数据包转发到我自己的 IP,以便 HttpListener 接受连接。由于某种原因,这似乎不起作用(通过wireshark和TCP SYN数据包检查不断重新发送,不知道为什么或如何修复它)。
- 使用 SslStream 连接到https://www.google.com,然后从客户端收到的原始数据包中获取内容并将它们写入流。这不起作用,因为 SslStream 自己处理 TCP 数据包(如 ACK 或 SYN)。流只需要 Http 请求。它不起作用的另一个原因是因为我无法从流中读取 TCP 数据包的内容,只能读取 HTTP 响应的内容(因此客户端坐在那里等待 ACK)。
- 将 TCP 数据包从客户端原样转发到端口 443,从服务器转发到端口 80(因为只有 HTTP 请求和响应使用 SSL 加密,所以没有区别)并使用 HttpRequest 类发出所有 http 请求和响应(因为类自己处理握手)。这不起作用,因为双方的 ACK 都是错误的。
开发这种代理的最佳方法是什么?
编辑:有什么方法可以让 TcpListener 或 HttpListener 充当透明代理?(无需在客户计算机上进行配置)。HttpListener 究竟何时能够识别出客户端正在尝试连接?