Habilitando WebSockets (SignalR) com um Barracuda WAF

Habilitando WebSockets (SignalR) com um Barracuda WAF

Atualmente, estou arrancando os cabelos no trabalho tentando resolver um problema com um aplicativo da web que usa SignalR sobre WebSockets, onde o tráfego é direcionado por meio de um Barracuda Web Application Firewall (WAF). Cada tentativa de conexão ao signalr/connectendpoint usando websockets falharia com um 400 Bad Request. A conexão é então revertida para a pesquisa do WebServer, que funciona, mas não é o que desejamos.

As solicitações feitas são enviadas para nosso Barracuda Web Application Firewall e, em seguida, enviadas para nossos servidores Web IIS com balanceamento de carga. Estamos usando o IIS 8.5 no Windows Server 2012R2 e o aplicativo é um aplicativo da Web .Net 4.6.2.

A mesma configuração (sem usar Barracuda WAF) funciona sem problemas.

Até agora eu tenho

Websockets habilitados no WAF conforme este artigohttps://campus.barracuda.com/product/webapplicationfirewall/doc/49054741/how-to-enable-websocket. Ainda recebo o mesmo erro 400.

Verificado para garantir que meus servidores IIS tenham o WebSocketrecurso habilitado.

Ativado depuração/rastreamento do SignalR no Web.Config conformehttps://docs.microsoft.com/en-us/aspnet/signalr/overview/testing-and-debugging/enabling-signalr-tracing. Isso resulta em arquivos de log, mas não indica erros.

Não tenho certeza do que mais verificar?

Responder1

Então descobri meu problema. Descobri que, na verdade, estamos enviando primeiro nosso tráfego para nosso WAF por meio de um Azure Load Balancer. Quando faço logout dos cabeçalhos nos logs de acesso do WAF, vejo que o Connectioncabeçalho não tem valor, o que sei que meu cliente está enviando como Upgrade.

Parece ser um problema usar um Azure Load Balancer. Então, estou investigando usando um Gateway de Aplicativo do Azure.

No momento, no entanto, posso fazer isso funcionar fazendo com que o WAF adicione o Connectioncabeçalho para mim, configurando uma regra de reescrita de cabeçalho para enviar esse cabeçalho para meus servidores IIS.

Cabeçalhos necessários para WebSockets

Connection: Upgrade Upgrade: websockets

  1. Abra o site de gerenciamento Barracuda WAF.
  2. Vá para Site -> Traduções de Sites
  3. Em Reescrita de solicitação HTTP, adicione uma nova regra de reescrita…

    1. Especifique um nome de regra.
    2. Defina um número de sequência.
    3. Selecione Reescrever cabeçalho como a ação.
    4. Insira Conexão como o nome do cabeçalho.
    5. Use * como valor antigo, que substituirá qualquer valor.
    6. Insira upgrade como o valor Rewrite, para que seja enviado.
    7. Use Header Upgrade eq websocketcomo condição de reescrita. Agora isso só aplicará a regra quando o Upgradecabeçalho contiver o valor websocket.
    8. Clique em Adicionar.

Agora, quando tento carregar o aplicativo novamente e boom, conexão bem-sucedida para /signalr/connect com transporte webSockets!

Mais informações estão disponíveis em meupostagem no blog

informação relacionada