使用“反向”代理穿过防火墙

使用“反向”代理穿过防火墙

我必须在防火墙环境中进行研讨会,这阻止我展示我想要的所有内容,因此我正在寻找解决方法。

我将演示一款在 Windows 上运行的软件。在研讨会期间,参与者需要使用浏览器从手机连接到该软件。

    Windows                        Phone           
+-------------------+          +------------------+
|                   |          |                  |
|  Demo software    |          |                  |
|                   |          |                  |
|                   |          |                  |
|             :8080 | <--------+  Browser         |
|                   |          |                  |
|                   |          |                  |
+-------------------+          +------------------+

问题是所有车间机器都装有防火墙,并且不可能(由于我所在车间的组织非常严格)在防火墙上打开一个漏洞。

因此,我考虑在每台车间机器上运行某种代理(幸运的是,这是允许的)。该代理将连接到外部的某种服务器,使用某个自动生成的 ID 注册自身并开始等待数据。

然后,手机将连接到服务器http://server.xxx/proxyid,服务器将根据代理 ID 将其请求路由到适当的代理(通过已建立的连接,因此数据将能够通过防火墙)。然后,代理将联系演示软件中的 Web 服务器,获取响应并将其传回服务器,服务器将响应转发给手机。

                       Firewall                                       
                           +                                          
                           |                                          
   Windows                 |                                          
+---------------------+    |                                          
|                     |    |                                          
|   +-------------+   |    |        server.xxx                        
|   | Demo SW     |   |    |     +------------------------+           
|   |             |   |    |     |                        |           
|   |       :8080 |   |    |     |                        |           
|   +--------+----+   |    |     |                        |           
|            ^        |    |     |                        |           
|            |        |    |     |                        |           
|   +--------+----+   |    |     |                        |           
|   | Proxy       |   |    |     |                        |           
|   |             +------------> |:80                     |           
|   |         ID  |   |    |     |                        |           
|   +-------------+   |    |     +------------------------+           
|                     |    |                      ^                   
+---------------------+    |                      |                   
                           |                      |                   
                           |                      |                   
                           +                      |                   
                                    Phone         |                   
                                 +-----------------------------------+
                                 |    Browser     |                  |
                                 | +--------------+----------------+ |
                                 | | http:://server.xxx/ID         | |
                                 | |                               | |
                                 | +-------------------------------+ |
                                 +-----------------------------------+

是否有任何构建模块可以让我把这个解决方案组合在一起,这样我就不必对其进行编程了?最好服务器部分也可以在 Windows 上运行(某种 Linux 也可以)。

答案1

这并不是你所追求的,也许我还会想到其他的东西,但这是你应该知道的。

SSH 端口转发

你需要在计算机 B 上安装一个 SSH 服务器。因此你可以在计算机 A 上执行

SSH 类似于 telnet,但更安全,并具有 TCP 端口转发功能。您可以忽略它的 telnet 方面

ssh 是系统管理员熟悉的工具,但一般技术人员也熟悉。

您可以在Windows中通过cygwin安装ssh。

A$ssh user@compB

假设你可以做到这一点。

A 位于防火墙后面。B 没问题。

答-----------B

虽然防火墙后面可以建立传出连接

从 A 运行

A$ssh -R 1234:127.0.0.1:5678 -R 2345:127.0.0.1:5642 user@compB

可以作为一个命令完成,也可以分解为两个单独的命令 A$ssh -R 1234:127.0.0.1:5678 user@compB

A$ssh -R 2345:127.0.0.1:5642 user@compB

-R 1234:127.0.0.1:5678

-R 表示在目标公司(公司 B)上打开端口,并且可以在端口 5678 处连接到公司 B,然后它将转到公司 A,并转发到端口 1234(仍在公司 A 上)

所以你可能想做

-R 80:127.0.0.1:8080

问题是,你想要一个有 ID 的东西,而我对此不确定

不过我可以说的是你可以在 CompB 上打开多个端口

所以不仅仅是端口 80

端口 81、端口 82

因此 CompB 上的端口 81 可以转发到 CompA 上的端口 1234

CompB 上的端口 82 可以转发到 CompA 上的端口 4252

ETC

您可能想要说 -gR 或 -R *:80.... 因为如果没有 -g,在 CompB 上打开的端口将只允许来自 CompB 的连接,即它只会监听 127.0.0.1,所以在您的情况下使用 -g,因为您想要另一台计算机['电话'计算机] 的客户端连接到 CompB..即 -g 是因为您想要另一台计算机的客户端程序连接到 CompB(并转发到 CompA),而不是 CompB 上的客户端程序连接到 CompB(并转发到 CompA)。

但有一点...您将 ssh.exe 从防火墙后面的计算机(CompA)连接到计算机 B。

CompB 上打开一个端口...用于新的 tcp 连接。您的 http 或任何客户端连接到 CompB,然后到达您从中运行 ssh.exe 的 CompA。然后您可以转发到您想要的任何计算机

当你写 -R 1234:127.0.0.1:5678 时,127.0.0.1 可能会更改为其他计算机。这样客户端的请求就会转发到其他计算机

-R 与 -L 相反,尽管您不需要 -L。

SSH-D

问题是......从表面上看,您的最终目的地似乎是一个网络服务器。

由于您只想转发一个特定的网站,因此可以使用 -R

但是你也应该知道一个 -D 选项,它使得 SOCKS 代理能够处理 HTTP

稍微有点障碍是 -D 是局部的......即从这个意义上讲它有点像 -L。

但你可以在 CompA 上设置 SOCKS 代理,

然后从 A 向 compB 执行 ssh -R。因此,任何连接到 B 的人都会被转发到 A 上的 SOCKS 代理,然后可以访问他们想要的任何 Web 服务器。

此链接的答案试图 SSH 反向袜子隧道但(截至撰写本文时),将 socks 代理放在了错误的计算机上。此答案是正确的。
https://stackoverflow.com/questions/842021/ssh-d-port-usernameserver-com-but-in-reverse

但这样一来,您就无法为不同的人提供不同的网络服务器了。

为此,请坚持 -R

在你的情况下,将 -R 与 -D 结合起来可能是不必要的,除非你真的想访问其他网站,在这种情况下你需要 SOCKS 代理(-D)和 -R

无论哪种方式,这些都不需要 ID,而是需要不同的端口,端口决定了一旦到达运行 ssh.exe 的防火墙后面的计算机 [计算机],要转发到哪个 IP:PORT。

答案2

对于此类问题,我们总是会选择使用 Microsoft 远程桌面方式进行演示。演示环境运行在您办公室的一台连接到互联网的 PC 上,所有必需的端口均已打开。这意味着人们可以在任何设备上使用他们的 Web 浏览器导航到您的服务器的 Web 前端。

为了展示演示,您可以使用 RDP 客户端(每个操作系统至少有一个)连接并登录到您的演示 PC/服务器并查看服务器的 Windows 后端。

通常他们甚至不需要在防火墙上打开端口,除非他们的防火墙非常严格(只为传出流量打开几个端口,例如端口 80 和 443)。但 RDP(3389)通常是少数已打开的端口之一。

相关内容