两个防火墙之间的服务器的 Websocket 和 HTTP 代理

两个防火墙之间的服务器的 Websocket 和 HTTP 代理

我有一台服务器(“A”)在防火墙后面运行,它提供 HTTP 和 websocket 服务。我无法控制防火墙,但有一个外部服务器(“B”),内部服务器可以连接到它(请注意,由于防火墙的存在,从 B 到 A 的反向连接是不可能的)。我如何在 B 上设置某种代理,以便 Internet 客户端(“C”)可以访问 A 上的资源?

我更喜欢轻量级的东西 - 即使是 Python 程序或 SSH 隧道(我尝试过但没有成功) - 而不是更重量级但强大的东西。

答案1

你有两个问题。首先,你需要绕过防火墙。其次,你必须反向代理 websocket。

第一个问题比较简单。我会先在 B 上安装 openvpn-server,然后让 A 连接到它。您可以选择防火墙允许的任何端口。我发现它在维护远程连接方面非常出色,而且您还可以获得加密。

第二个问题是反向代理 http 和 websockets。Websockets 很复杂,但一旦安装了 openvpn,您就可以使用任何常规方法来实现这一点,而不必担心防火墙。我会尝试使用较新版本的 nginx 的 websocket 代理功能:http://nginx.org/en/docs/http/websocket.html

答案2

我使用带有 ssh 隧道的 nginx webproxy 解决了这个问题。假设我在 A 上的服务在端口 3000 上运行,从 A 开始,我执行了以下操作:

ssh -R 3000:localhost:3000 me@B

建立从B的3000端口到A的3000端口的反向连接。

然后,我设置了一个 nginx 代理,将 websocket 和常规流量转发到 ssh 端口,配置如下:

events {
  worker_connections 100;  #I'm not expecting many connections
}

http {
  server {
      listen 3001;

      # host name to respond to
      #server_name ws.example.com;

      location / {
          # switch off logging
          access_log off;

          # redirect all HTTP traffic to localhost:3000
          proxy_pass http://localhost:3000;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

          # WebSocket support (nginx 1.4)
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
      }
  }
}

现在,我可以连接到 Chttp://B:3001并且所有内容都透明地转发到http://A:3000

唯一剩下的问题是初始连接有点慢,但这可能是由于 ssh 连接。我打算尝试向 nginx 代理添加 gzip 压缩。

相关内容