WebSocket 请求通过 CDN 返回 403 Forbidden 的问题排查与解决

WebSocket 请求通过 CDN 返回 403 Forbidden 的问题排查与解决

💡 原文中文,约2500字,阅读约需6分钟。
📝

内容提要

在使用Kubernetes、NGINX Ingress和WebSocket服务时,CDN(Funnell)返回403 Forbidden。经排查发现,问题在于CDN未开启WebSocket支持及请求路径未被允许回源。解决方案是开启WebSocket支持、配置回源路径白名单,并确保请求头透传。调整后,WebSocket连接成功,服务稳定。

🎯

关键要点

  • 使用Kubernetes、NGINX Ingress和WebSocket服务时,CDN(Funnell)返回403 Forbidden。
  • 问题在于CDN未开启WebSocket支持及请求路径未被允许回源。
  • 解决方案是开启WebSocket支持、配置回源路径白名单,并确保请求头透传。
  • 确认Ingress配置正确,路径/push/ws会被重写并转发给go-push服务。
  • 测试绕过CDN,直连Ingress,返回101 Switching Protocols,说明Kubernetes服务与Ingress正常。
  • CDN拒绝连接日志表明403来自CDN层拦截,主要怀疑WebSocket未开启支持。
  • 在Funnell CDN控制台中开启WebSocket支持,配置回源路径白名单,确保请求头透传。
  • 完成配置后,通过WebSocket客户端访问得到正确响应,服务端日志打印握手成功。
  • 总结:CDN安全策略或协议限制可能导致403 Forbidden,需检查WebSocket支持、回源路径和关键握手头部。

延伸问答

为什么通过CDN访问WebSocket时会返回403 Forbidden?

返回403 Forbidden的原因通常是CDN未开启WebSocket支持或请求路径未被允许回源。

如何解决CDN返回403 Forbidden的问题?

解决方案包括开启WebSocket支持、配置回源路径白名单,并确保请求头透传。

在Kubernetes中如何配置WebSocket服务?

需要在Ingress配置中设置正确的proxy_set_header和路径转发规则,确保WebSocket请求能够正确转发。

如何验证WebSocket服务是否正常工作?

可以通过curl命令模拟WebSocket握手,若返回101 Switching Protocols,则说明服务正常。

CDN的哪些配置可能导致WebSocket请求失败?

CDN未开启WebSocket支持、请求路径未在白名单中、请求头未透传等配置都可能导致请求失败。

如何确保WebSocket请求头不被CDN篡改?

需要在CDN配置中设置请求头透传,确保Connection、Upgrade和Sec-WebSocket-*等头部不被移除或篡改。

➡️

继续阅读