Habilitación de WebSockets (SignalR) con un WAF Barracuda

Habilitación de WebSockets (SignalR) con un WAF Barracuda

Actualmente me estoy arrancando los pelos en el trabajo tratando de resolver un problema con una aplicación web que usa SignalR sobre WebSockets donde el tráfico se dirige a través de un firewall de aplicaciones web (WAF) Barracuda. Cada intento de conectarse al signalr/connectpunto final mediante websockets fallaría con una solicitud incorrecta 400. Luego, la conexión se revierte al sondeo del servidor web, que funciona, pero no es lo que queremos.

Las solicitudes realizadas se envían a nuestro Firewall de aplicaciones web Barracuda y luego a nuestros servidores web IIS con carga equilibrada. Estamos utilizando IIS 8.5 en Windows Server 2012R2 y la aplicación es una aplicación web .Net 4.6.2.

La misma configuración (sin usar un Barracuda WAF) funciona sin problemas.

Hasta ahora tengo

Websockets habilitados en WAF según este artículohttps://campus.barracuda.com/product/webapplicationfirewall/doc/49054741/how-to-enable-websocket. Sigo recibiendo el mismo error 400.

Verificado para asegurarme de que mis servidores IIS tengan la WebSocketfunción habilitada.

Se activó la depuración/rastreo de SignalR en Web.Config segúnhttps://docs.microsoft.com/en-us/aspnet/signalr/overview/testing-and-debugging/enabling-signalr-tracing. Esto genera archivos de registro, pero ninguno indica errores.

¿No estoy seguro de qué más comprobar?

Respuesta1

Entonces descubrí mi problema. Descubrí que en realidad primero estamos enviando nuestro tráfico a nuestro WAF a través de Azure Load Balancer. Cuando cierro sesión en los encabezados en los registros de acceso WAF, puedo ver que el Connectionencabezado no tiene valor, lo cual sé que mi cliente envía como Upgrade.

Parece ser un problema al utilizar Azure Load Balancer. Así que, en su lugar, estoy investigando el uso de Azure Application Gateway.

Por el momento, sin embargo, puedo hacer que esto funcione haciendo que WAF agregue el Connectionencabezado por mí, configurando una regla de reescritura de encabezado para enviar este encabezado a mis servidores IIS.

Encabezados requeridos para WebSockets

Connection: Upgrade Upgrade: websockets

  1. Abra el sitio de administración de Barracuda WAF.
  2. Vaya al sitio web -> Traducciones del sitio web
  3. En Reescritura de solicitud HTTP, agregue una nueva regla de reescritura...

    1. Especifique un nombre de regla.
    2. Establezca un número de secuencia.
    3. Seleccione Reescribir encabezado como acción.
    4. Ingrese Conexión como Nombre del encabezado.
    5. Utilice * como valor anterior, que reemplazará cualquier valor.
    6. Ingrese actualización como valor de Reescritura, para que se envíe este en su lugar.
    7. Úselo Header Upgrade eq websocketcomo condición de reescritura. Esto ahora sólo aplicará la regla cuando el Upgradeencabezado contenga el valor websocket.
    8. Haga clic en Agregar.

Ahora, cuando intento cargar la aplicación nuevamente y ¡boom, la conexión fue exitosa a /signalr/connect con el transporte webSockets!

Más información está disponible en mientrada en el blog

información relacionada