Barracuda WAF で WebSocket (SignalR) を有効にする

Barracuda WAF で WebSocket (SignalR) を有効にする

私は現在、仕事で、トラフィックが 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

  1. Barracuda WAF 管理サイトを開きます。
  2. ウェブサイトに移動 -> ウェブサイト翻訳
  3. HTTP リクエスト書き換えの下で、新しい書き換えルールを追加します…

    1. ルール名を指定します。
    2. シーケンス番号を設定します。
    3. アクションとして「ヘッダーの書き換え」を選択します。
    4. ヘッダー名として「Connection」と入力します。
    5. * を古い値として使用します。これにより、任意の値が置き換えられます。
    6. 代わりにこれが送信されるように、書き換え値として「アップグレード」を入力します。
    7. 書き換え条件として使用します。これにより、ヘッダーに値が含まれているHeader Upgrade eq websocket場合にのみルールが適用されるようになります。Upgradewebsocket
    8. [追加]をクリックします。

ここで、アプリケーションを再度ロードしてみると、なんと、webSocket トランスポートを使用して /signalr/connect への接続が成功しました。

詳細は私のブログ投稿

関連情報