如何配置AWS CloudFront通过自定义端口使用安全WebSocket(WSS)?
首先明确一个核心误解:CloudFront仅监听80(HTTP)和443(HTTPS/WSS)端口,不支持自定义端口(比如3200)的外部请求接入。你之前尝试让客户端通过3200端口连接CloudFront是行不通的,客户端应该用标准WSS端口443发起请求,CloudFront再转发到EC2的3200端口。
以下是你可能遗漏的关键配置:
CloudFront行为需启用WebSocket支持
在CloudFront分发的行为设置里,创建一个单独的行为(比如匹配路径/ws/*或你WebSocket服务的专属路径),务必勾选**"WebSocket support"**选项(这是CloudFront转发WebSocket请求的必要开关,默认关闭)。源配置的端口与权限
- 检查EC2安全组:除了HTTPS(443),还要允许CloudFront的IP段访问3200端口。你可以通过AWS CLI命令
aws cloudfront list-distribution-ips获取CloudFront的IP范围,把这些IP段添加到EC2安全组的入站规则中,协议选TCP,端口3200。 - 源协议设置:如果你的EC2上3200端口是纯WebSocket(ws://),CloudFront源的协议要设为
HTTP;如果是WSS(带TLS加密),则设为HTTPS,同时确保EC2上的3200端口服务配置了正确的SSL证书。
- 检查EC2安全组:除了HTTPS(443),还要允许CloudFront的IP段访问3200端口。你可以通过AWS CLI命令
源请求策略的完整请求头
除了Sec-WebSocket-Version,还必须包含以下WebSocket核心请求头:Sec-WebSocket-KeySec-WebSocket-ProtocolSec-WebSocket-Extensions
可以直接使用CloudFront的Managed-WebSocket-Origin预定义源请求策略,不用手动添加,这个策略已经包含了所有必要的WebSocket头。
客户端连接地址修正
客户端的WSS连接地址应该是wss://你的域名/[WebSocket服务路径](比如wss://example.com/ws),不要带:3200端口。CloudFront会通过你配置的行为,把这个请求转发到EC2的3200端口。EC2服务的可达性验证
先在EC2本地用curl -i http://localhost:3200/[你的路径]测试WebSocket服务是否正常响应(应该返回101 Switching Protocols相关的响应);再用CloudFront的IP段内的机器(或者用AWS Lambda模拟)测试EC2的3200端口是否可访问,排除网络连通性问题。
内容的提问来源于stack exchange,提问作者Theopep

