![使用 Barracuda WAF 启用 WebSockets (SignalR)](https://linux22.com/image/718211/%E4%BD%BF%E7%94%A8%20Barracuda%20WAF%20%E5%90%AF%E7%94%A8%20WebSockets%20(SignalR).png)
我目前正在工作中绞尽脑汁试图解决一个使用 SignalR over WebSockets 的 Web 应用程序的问题,其中流量通过 Barracuda Web 应用程序防火墙 (WAF) 进行引导。每次尝试signalr/connect
使用 websockets 连接到端点都会失败,并出现 400 Bad Request。然后连接恢复到 WebServer 轮询,虽然可以工作,但这不是我们想要的。
所提出的请求将发送到我们的 Barracuda Web 应用程序防火墙,然后发送到我们的负载平衡 IIS Web 服务器。我们在 Windows Server 2012R2 上使用 IIS 8.5,应用程序是 .Net 4.6.2 Web 应用程序。
相同的设置(不使用 Barracuda WAF)运行没有问题。
到目前为止我已经
按照本文所述在 WAF 中启用 Websocketshttps://campus.barracuda.com/product/webapplicationfirewall/doc/49054741/how-to-enable-websocket。我仍然收到相同的 400 错误。
检查以确保我的 IIS 服务器已WebSocket
启用该功能。
按照以下说明在 Web.Config 中打开 SignalR 调试/跟踪https://docs.microsoft.com/en-us/aspnet/signalr/overview/testing-and-debugging/enabling-signalr-tracing。这会产生日志文件,但没有指示错误。
我不确定还要检查什么?
答案1
所以我找到了我的问题。我发现我们实际上是首先通过 Azure 负载均衡器将流量发送到我们的 WAF。当我在 WAF 访问日志中注销标头时,我可以看到标Connection
头没有值,我知道我的客户端正在将其发送为Upgrade
。
这似乎是使用 Azure 负载均衡器时出现的问题。因此,我正在研究使用 Azure 应用程序网关。
然而,目前,我可以通过让 WAFConnection
为我添加标头,通过配置重写标头规则将此标头发送到我的 IIS 服务器来实现这一点。
WebSocket 所需的标头
Connection: Upgrade Upgrade: websockets
- 打开 Barracuda WAF 管理站点。
- 前往网站 -> 网站翻译
在“HTTP 请求重写”下,添加新的重写规则…
- 指定规则名称。
- 设置序列号。
- 选择重写标头作为操作。
- 输入 Connection 作为标题名称。
- 使用 * 作为旧值,它将替换任何值。
- 输入升级作为重写值,以便发送此值。
- 用作重写条件。现在,仅当标头包含值
Header Upgrade eq websocket
时才应用规则。Upgrade
websocket
- 单击“添加”。
现在,当我尝试再次加载应用程序时,轰的一声,通过 webSockets 传输成功连接到 /signalr/connect!
更多信息请访问我的博客文章