Включение WebSockets (SignalR) с помощью Barracuda WAF

В настоящее время я теряю голову на работе, пытаясь решить проблему с веб-приложением, которое использует SignalR поверх WebSockets, где трафик направляется через межсетевой экран веб-приложений Barracuda (WAF). Каждая попытка подключиться к signalr/connect конечная точка, использующая websockets, потерпит неудачу с 400 ошибочными запросами. Затем соединение возвращается к опросу 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. Это приводит к файлам журнала, но не указывает на ошибки.

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

1 ответ

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

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

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

Требуемые заголовки для WebSockets

Connection: Upgrade Upgrade: websockets

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

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

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

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

Другие вопросы по тегам