WebSocket 端口 80 / 443 EC2 和 Erlang 的牛仔
WebSocket Port 80 / 443 EC2 and Erlang's Cowboy
WebSocket 端口 80 / 443 EC2 和 Erlang 的牛仔
我的生产环境是 EC2 实例上的 CentOS 6.0,这几天我正在编写一个视频通信应用程序,我决定使用 Erlang,因为它是基于通信的应用程序的最佳语言。
我正在使用 Cowboy 的 WebSocket 进行实时通信,我决定使用端口 80,因为它在公司网络上具有高可用性,几天前它工作没有任何问题,但最近它停止工作了。
当我将它切换到 80 / 443 / 21 或 22 以外的任何其他端口时,它就像魅力一样工作但不是在这些标准端口上,我禁用了所有防火墙并允许来自亚马逊安全组的所有类型的流量但是对我没有任何作用。
但是这个问题只发生在 WebSocket 上,我安装并使用了 apache,它在端口 80 上工作正常,我尝试的另一件事是我在端口 80 上安装了 haproxy 列表,并为 WebSocket 请求设置了转发一个不同的端口,在这种情况下是 8088 我注意到我在套接字服务器上收到了请求,但是一旦收到它就会自动断开连接。
请帮忙。
我把我的想法作为一个答案,而不是写一系列的评论,所以主要思想会更加清晰和扎实。
最初的假设是在您和您的服务器之间有一些 "transparent proxy" 的地方(如果您在工作,可能在 ISP 或公司的网关上)。 "transparent" 这里的意思是它甚至不问你就拦截你的网络流量。通常,ISP 使用此类透明代理来缓存客户端流量,因此使用较少的网络带宽。您可以 google 关键字 "squid transparent proxy" 了解更多技术细节。
现在,如果代理配置不当,它只会破坏 WebSockets 协议,使您的应用程序无法按预期运行。这里的关键时刻是,这是一个 HTTP 代理,所以它只拦截与 HTTP 协议相关的流量(默认情况下,它是端口 80)并且它不拦截流量在其他端口上,- 这就是您的应用程序在其他端口上运行良好的原因。
不幸的是,除了使用不同的端口之外,没有解决这个问题的可靠方法。
就我个人而言,我建议您只使用 TLS/SSL 连接。 WebSockets 确实支持 TLS(因为 WS 在 HTTP/HTTPS 内部工作)。透明代理通常未配置为拦截 TLS 流量:您写道您的应用程序通过端口 443 运行良好,因此这意味着该端口上没有透明代理。如果您不想(或不能)使用 TLS 连接(用于 websockets 的 wss://),您可以像使用未加密连接一样使用该应用程序,但只使用端口 443——这在应用程序体系结构意义上是不正确的,但在您的情况下,它是可以接受的并且可能是安全的。
更新
关于 8080 等替代 HTTP 端口,如果有透明代理拦截端口 80 上的流量,那么这些人很可能也想拦截 8080 或 81 或 8081 等替代 HTTP 端口。因此,即使应用程序通过 8080 运行正常,也无法保证它明天会继续运行,因此如果发生这种情况,您将需要再次更改端口。
在我看来,让它通过 TLS 工作(因此默认情况下它将通过端口 443 工作)是最正确的想法。或者,如果您不能引入 TLS,只需让它通过 443 工作而不加密(因为它是) - 这个选项,同样,实际上并不正确,但它会工作并且几乎不会被代理破坏。
WebSocket 端口 80 / 443 EC2 和 Erlang 的牛仔
我的生产环境是 EC2 实例上的 CentOS 6.0,这几天我正在编写一个视频通信应用程序,我决定使用 Erlang,因为它是基于通信的应用程序的最佳语言。
我正在使用 Cowboy 的 WebSocket 进行实时通信,我决定使用端口 80,因为它在公司网络上具有高可用性,几天前它工作没有任何问题,但最近它停止工作了。
当我将它切换到 80 / 443 / 21 或 22 以外的任何其他端口时,它就像魅力一样工作但不是在这些标准端口上,我禁用了所有防火墙并允许来自亚马逊安全组的所有类型的流量但是对我没有任何作用。
但是这个问题只发生在 WebSocket 上,我安装并使用了 apache,它在端口 80 上工作正常,我尝试的另一件事是我在端口 80 上安装了 haproxy 列表,并为 WebSocket 请求设置了转发一个不同的端口,在这种情况下是 8088 我注意到我在套接字服务器上收到了请求,但是一旦收到它就会自动断开连接。
请帮忙。
我把我的想法作为一个答案,而不是写一系列的评论,所以主要思想会更加清晰和扎实。
最初的假设是在您和您的服务器之间有一些 "transparent proxy" 的地方(如果您在工作,可能在 ISP 或公司的网关上)。 "transparent" 这里的意思是它甚至不问你就拦截你的网络流量。通常,ISP 使用此类透明代理来缓存客户端流量,因此使用较少的网络带宽。您可以 google 关键字 "squid transparent proxy" 了解更多技术细节。
现在,如果代理配置不当,它只会破坏 WebSockets 协议,使您的应用程序无法按预期运行。这里的关键时刻是,这是一个 HTTP 代理,所以它只拦截与 HTTP 协议相关的流量(默认情况下,它是端口 80)并且它不拦截流量在其他端口上,- 这就是您的应用程序在其他端口上运行良好的原因。
不幸的是,除了使用不同的端口之外,没有解决这个问题的可靠方法。
就我个人而言,我建议您只使用 TLS/SSL 连接。 WebSockets 确实支持 TLS(因为 WS 在 HTTP/HTTPS 内部工作)。透明代理通常未配置为拦截 TLS 流量:您写道您的应用程序通过端口 443 运行良好,因此这意味着该端口上没有透明代理。如果您不想(或不能)使用 TLS 连接(用于 websockets 的 wss://),您可以像使用未加密连接一样使用该应用程序,但只使用端口 443——这在应用程序体系结构意义上是不正确的,但在您的情况下,它是可以接受的并且可能是安全的。
更新
关于 8080 等替代 HTTP 端口,如果有透明代理拦截端口 80 上的流量,那么这些人很可能也想拦截 8080 或 81 或 8081 等替代 HTTP 端口。因此,即使应用程序通过 8080 运行正常,也无法保证它明天会继续运行,因此如果发生这种情况,您将需要再次更改端口。
在我看来,让它通过 TLS 工作(因此默认情况下它将通过端口 443 工作)是最正确的想法。或者,如果您不能引入 TLS,只需让它通过 443 工作而不加密(因为它是) - 这个选项,同样,实际上并不正确,但它会工作并且几乎不会被代理破坏。