WebSocket服务器和防火墙

时间:2013-02-18 08:00:00

标签: proxy websocket firewall url-redirection

我有两个WebSocket服务器都运行在80和443以外的不同端口上。这两个服务器在防火墙后面运行,只有端口80和443打开。

WebSocket Server A:800 |
                       |-----|FireWall:80 & 443|-----> INTERNET
WebSocket Server B:801 |

我正在寻找的是我的客户在不知道他们的端口的情况下连接到WebSocket服务器的方式,而且没有为任何其他端口而不是80和443打开防火墙。

所以我想可能我的防火墙和WebSocket服务器之间的中间服务器(或代理服务器)可以配置为当客户端在端口80或443(要通过防火墙)上请求www.mywebsite.com/a时中间服务器将客户端连接到WebSocket服务器A.当客户端在端口80或443上请求www.mywebsite.com/b时,中间服务器将他连接到WebSocket服务器B.这可能吗?如果有的话,是否有任何你知道的服务器实现了这个功能?

在另一个注释(可能没有太大差异)上,TCP hole punch与我上面解释的方法之间会有什么不同?

2 个答案:

答案 0 :(得分:2)

这称为“WebSockets反向代理”。您需要在防火墙和WebSocket服务器之间使用另一个逻辑或物理节点。您可能在同一系统上运行所有三个节点,这就是我提到“逻辑”的原因。

这个空间正在迅速变化,解决方案相当不成熟。您的案例的最佳选择可能是使用HAProxy for WebSocket reverse proxy。搜索“WebSocket反向代理”以获取更多信息。 This article有点旧,但应该给你一个合理的选项概述。

更新:看起来昨天刚刚登陆Nginx的WebSocket代理支持:press releasecommit with example

答案 1 :(得分:1)

由于答案中提供了link @kanaka,我设法将HAProxy配置为根据URI重定向我的请求。所以这就是我所做的:

make HAProxy后,您可以在usr/local/sbin下找到haproxy。该脚本以-f标志运行,用于配置文件。查看/etc/,如果您没有任何haproxy.cfg,只需mkdir -p /etc/haproxy,然后vi /etc/haproxy.cfg并粘贴您的配置。 1.5版的配置文件描述为here,其中包含可以使用的所有参数。这就是我的haproxy.cfg文件的样子:

global
    log  127.0.0.1 local0
    log  127.0.0.1  local1 notice
    maxconn  4096
    uid  99
    gid  99
    daemon

defaults
    log global
    mode  http
    option  httplog
    option  dontlognull
    retries  3
    option  redispatch
    option  http-server-close
    maxconn  2000
    contimeout  5000
    clitimeout  50000
    srvtimeout  50000

frontend public
    bind *:80
    acl is_websocket1 path_beg -i /a # if the path starts with /a
    acl is_websocket2 path_beg -i /b # if the path starts with /b
    use_backend ws1 if is_websocket1
    use_backend ws2 if is_websocket2
    default_backend www

backend www
    timeout server 30s
    server www1 127.0.0.1:8001 # the port we have our webserver running on

backend ws1
    timeout server 600s
    server ws1 127.0.0.1:800 # the port we have our websocket server 1 running on

backend ws2
    timeout server 600s
    server ws2 127.0.0.1:801 # the port we have our websocket server 2 running on