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

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

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

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

第一个问题比较容易。 我将开始在B上安装openvpn-server并将A连接到它。 您可以select防火墙允许的任何端口。 我发现它在维护远程连接方面非常出色,并且您可以使用encryption来启动。

第二个问题是反向代理http和websockets。 Websockets是复杂的,但一旦安装openvpn,您可以使用任何传统的方法来做到这一点,而不用担心防火墙。 我将尝试使用更新版本的nginx的websocket代理function: http : //nginx.org/en/docs/http/websocket.html

我用一个带有ssh隧道的nginx webproxy解决了这个问题。 假设我在A上的服务在A端口上运行,那么我做了:

ssh -R 3000:localhost:3000 me@B 

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

然后,我build立了一个nginx代理,将websocket和常规stream量转发到ssh端口,具有以下configuration:

 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"; } } } 

现在,我可以连接到C http://B:3001 ,一切都透明地转发到http://A:3000

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