SSH 隧道,HTTP 正确响应到正确的客户端

SSH 隧道,HTTP 正确响应到正确的客户端

我使用 SSH 端口转发将 HTTP 流量从受信任的远程客户端的个人计算机中继到运行在我公司代理后面的计算机上的本地主机服务器。远程客户端无法直接访问公司代理后面的这台计算机。

设置如下:我设置了一个 Linux VM,它有一个公共 IP 地址,并且只为 SSH 开放一个端口。为了安全起见,我禁用了 root 登录和密码登录。远程客户端向我发送他们的公共 SSH 密钥,然后我将它们添加到 Linux VM 上的“authorized_keys”文件中。

现在我要求客户使用 SSH 本地端口转发将其本地端口之一(例如 453)转发到 Linux VM 上的端口(例如 345)。因此,他们基本上将所有流向其本地端口 453 的流量“上传”到 Linux VM 的端口 345。在公司 PC 上,我使用 SSH 远程端口转发将所有流量从 Linux VM 的端口 345“下载”到本地主机服务器端口(例如 9999)。

这样,我就可以安全地中继他们的 HTTP 流量,而无需让他们访问我的公司电脑。我已经测试过这种方法,效果很好。我可以从远程客户端获取 HTTP 请求,客户端也会收到响应。

但我考虑的是来自不同计算机的多个远程客户端的情况。每个客户端将有一个到 Linux VM 同一端口的 SSH 隧道。它们每个都将从其本地端口 453“上传”HTTP 流量到 Linux VM 的端口 345。因此,在返回响应(从公司 PC 上的本地主机服务器)时,是否可以保证特定请求的响应返回到发送请求的正确客户端?

我读了一些关于 HTTP 的内容这里。但我不确定对于来自不同客户端的多个隧道的 SSH 情况是否也正确。

有人能否评论一下来自不同客户端的流量是否被扰乱,以便原本应该发送给客户端 A 的响应实际上发送给了客户端 B?

如果是,我该如何避免这种情况?

答案1

到隧道一端的多个连接将生成来自隧道另一端的多个连接。这些连接不会混合。

当客户端连接到隧道的终端时,该终端的 IP 地址和端口是固定的,浏览器的 IP 地址也是如此。但是他们的浏览器可以(并且将)绑定到不同的端口。这样,这些连接将完全彼此区分。请参阅这个答案

该过程在虚拟机上重复。不同的连接(来自相同或不同的客户端,无关紧要)将以隧道远程端的相同 IP 地址和端口为目标,这些连接来自同一台机器(所述虚拟机),因此可能来自相同的 IP 地址;但即便如此,它们至少可以通过绑定到的端口来区分。

并且再次在隧道的本地端,将与具有固定 IP 地址和端口的 HTTP 服务器建立不同的连接,但它们将在其“源”端使用不同的端口。

因此,在将一个客户端连接到相关 HTTP 服务器的过程中,相同的机制会独立工作三次。每次都是相应的操作系统负责分配一个没用过港口对于想要启动连接的进程。(启动连接的工具可以请求特定端口,有时也可以获得该端口;但在这种情况下没有意义,各个工具很可能甚至不会尝试,它们会接受操作系统分配给它们的任何“随机”端口。)

来自(或发往)不同客户端的流量不可能被扰乱。坦率地说,扰乱它不是一件容易的事一经请求

仅通过端口号进行区分会限制任何给定时间可以处理的连接数。但即使达到限制,新连接也将被拒绝,而不是与现有连接混合。不再使用的端口可以重复使用,因此终止的连接将为新连接腾出空间。


附注:一般来说,HTTP 服务器可能会拒绝它认为不是自己的 URL。如果这是个问题,并且您无法重新配置 HTTP 服务器,则任何有问题的客户端都应使用正确的 URL,并确保流量无论如何都能到达本地计算机上的隧道末端。

相关内容