我有一台服务器(“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 压缩。