私は現在、仕事で、トラフィックが Barracuda Web アプリケーション ファイアウォール (WAF) 経由で送信される WebSocket 上の SignalR を使用する Web アプリケーションの問題を解決しようと頭を悩ませています。WebSocket をsignalr/connect
使用してエンドポイントに接続しようとすると、400 Bad Request で失敗します。その後、接続は WebServer ポーリングに戻されますが、これは機能しますが、私たちが望んでいるものではありません。
行われたリクエストは、Barracuda Web アプリケーション ファイアウォールに送信され、その後、負荷分散された IIS Web サーバーに送信されます。Windows Server 2012R2 で IIS 8.5 を使用しており、アプリケーションは .Net 4.6.2 Web アプリケーションです。
同じセットアップ (Barracuda WAF を使用しない) では、問題なく動作します。
これまでのところ私は
この記事に従ってWAFでWebsocketsを有効にするhttps://campus.barracuda.com/product/webapplicationfirewall/doc/49054741/websocket を有効にする方法。まだ同じ 400 エラーが発生します。
IIS サーバーでWebSocket
機能が有効になっていることを確認しました。
Web.ConfigでSignalRデバッグ/トレースをオンにしました。https://docs.microsoft.com/en-us/aspnet/signalr/overview/testing-and-debugging/enable-signalr-tracingログ ファイルが作成されますが、エラーは示されません。
他に何をチェックすればよいか分かりません。
答え1
それで、問題が分かりました。実際には、最初に Azure Load Balancer を介してトラフィックを WAF に送信していることがわかりました。WAF アクセス ログのヘッダーをログアウトすると、ヘッダーにConnection
値がないことがわかります。これは、クライアントが として送信していることがわかりますUpgrade
。
Azure Load Balancer の使用時に問題が発生しているようです。そのため、代わりに Azure Application Gateway の使用を検討しています。
ただし、現時点では、WAFConnection
にヘッダーを追加させ、このヘッダーを IIS サーバーに送信するように書き換えヘッダー ルールを構成することで、これを機能させることができます。
WebSocket に必要なヘッダー
Connection: Upgrade Upgrade: websockets
- Barracuda WAF 管理サイトを開きます。
- ウェブサイトに移動 -> ウェブサイト翻訳
HTTP リクエスト書き換えの下で、新しい書き換えルールを追加します…
- ルール名を指定します。
- シーケンス番号を設定します。
- アクションとして「ヘッダーの書き換え」を選択します。
- ヘッダー名として「Connection」と入力します。
- * を古い値として使用します。これにより、任意の値が置き換えられます。
- 代わりにこれが送信されるように、書き換え値として「アップグレード」を入力します。
- 書き換え条件として使用します。これにより、ヘッダーに値が含まれている
Header Upgrade eq websocket
場合にのみルールが適用されるようになります。Upgrade
websocket
- [追加]をクリックします。
ここで、アプリケーションを再度ロードしてみると、なんと、webSocket トランスポートを使用して /signalr/connect への接続が成功しました。
詳細は私のブログ投稿