Назад | Перейти на главную страницу

Включение веб-сокетов (SignalR) с помощью Barracuda WAF

В настоящее время я рву волосы на работе, пытаясь решить проблему с веб-приложением, которое использует SignalR через WebSockets, где трафик направляется через брандмауэр веб-приложений Barracuda (WAF). Каждая попытка подключиться к signalr/connect конечная точка, использующая веб-сокеты, завершится ошибкой с ошибкой 400 Bad Request. Затем соединение возвращается к опросу WebServer, который работает, но это не то, что мы хотим.

Запросы отправляются на наш брандмауэр веб-приложений Barracuda, а затем отправляются на наши веб-серверы IIS с балансировкой нагрузки. Мы используем IIS 8.5 на Windows Server 2012R2, и это приложение представляет собой веб-приложение .Net 4.6.2.

Та же самая установка (без использования Barracuda WAF) работает без проблем.

Пока у меня есть

Включены веб-сокеты в WAF согласно этой статье https://campus.barracuda.com/product/webapplicationfirewall/doc/49054741/how-to-enable-websocket. Я все еще получаю ту же ошибку 400.

Проверено, чтобы убедиться, что на моих серверах IIS есть WebSocket Функция включена.

Включена отладка / трассировка SignalR в Web.Config согласно https://docs.microsoft.com/en-us/aspnet/signalr/overview/testing-and-debugging/enabling-signalr-tracing. Это приводит к файлам журнала, но нет указывает на ошибки.

Я не уверен, что еще проверить?

Итак, я обнаружил свою проблему. Я обнаружил, что на самом деле мы сначала отправляем наш трафик в наш WAF через Azure Load Balancer. Когда я выхожу из заголовков в журналах доступа WAF, я вижу, что Connection заголовок не имеет значения, и я знаю, что мой клиент отправляет его как Upgrade.

Казалось бы, проблема с использованием балансировщика нагрузки Azure. Поэтому я решил использовать вместо этого шлюз приложений Azure.

Однако на данный момент я могу заставить это работать, если WAF добавит Connection Заголовок для меня, настроив правило перезаписи заголовка для отправки этого заголовка на мои серверы IIS.

Обязательные заголовки для веб-сокетов

Connection: Upgrade Upgrade: websockets

  1. Откройте сайт управления Barracuda WAF.
  2. Перейдите на сайт -> Перевод сайтов
  3. В разделе «Перезапись HTTP-запроса» добавьте новое правило перезаписи…

    1. Укажите имя правила.
    2. Установите порядковый номер.
    3. В качестве действия выберите «Перезаписать заголовок».
    4. Введите Connection в качестве имени заголовка.
    5. Используйте * как старое значение, которое заменит любое значение.
    6. Введите обновление в качестве значения перезаписи, чтобы оно было отправлено.
    7. Использовать Header Upgrade eq websocket как условие перезаписи. Теперь это будет применять правило только тогда, когда Upgrade заголовок содержит значение websocket.
    8. Щелкните Добавить.

Теперь, когда я снова пытаюсь загрузить приложение и бум, соединение с / signalr / connect с транспортом webSockets выполнено успешно!

Более подробная информация доступна на моем Сообщение блога