WebSocket连接持续返回403错误求助(Gin+Gorilla+AWS部署)
Gin+Gorilla WebSocket部署AWS后/ws接口返回403排查方案
问题背景
用Gin框架搭配Gorilla WebSocket开发的服务,部署到AWS之后,浏览器连接/ws接口持续返回403错误。代码中未编写任何返回403的逻辑,也未添加相关中间件,请求日志显示:
[GIN] 2023/05/07 - 22:18:49 | 403 | 18.344µs | 71.121.188.229 | GET "/ws"
相关服务代码如下:
func WebsocketServer(w http.ResponseWriter, r *http.Request, context *gin.Context) { fmt.Println("connection received") var upgrader2 = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, EnableCompression: false, } db, err := aws.GetDB() if err != nil { helpers.Log.Println(err) return } defer db.Close() c, err := upgrader2.Upgrade(w, r, nil) if err != nil { helpers.Log.Println(err) return } }
func PublicRoutes(c *gin.RouterGroup) { c.GET("/ws", func(c *gin.Context) { relay.WebsocketServer(c.Writer, c.Request, c) }) }
部署层面排查方向
- AWS WAF拦截:检查AWS WAF规则配置,确认是否存在阻止
/ws路径请求的规则,或是针对WebSocket握手的防护规则误触发了拦截。 - 负载均衡器配置:如果使用了ALB/NLB,需确认是否开启WebSocket支持——ALB要在监听器中启用WebSocket协议,同时检查目标组的健康检查配置是否会误拦截请求;另外要确保负载均衡器的安全组允许客户端与服务端的80/443端口通信。
- 安全组与网络ACL:检查EC2实例的安全组是否放开了客户端入站的80/443端口,网络ACL也要确保放行相关TCP流量,包括WebSocket握手后的长连接。
- API Gateway配置:如果使用了API Gateway,必须确认是配置了WebSocket API而非普通REST API——普通REST API默认不支持WebSocket握手,会直接返回403。
- HTTPS与Origin校验:虽然代码中
CheckOrigin返回true,但如果AWS服务强制HTTPS,客户端用HTTP请求可能触发403;或是AWS某些组件额外做了Origin校验,可尝试用HTTPS连接/ws接口测试。
内容的提问来源于stack exchange,提问作者xLeki
相关产品推荐
相关产品推荐

