Включение 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
- Откройте сайт управления Barracuda WAF.
- Перейти на сайт -> Перевод сайта
В разделе HTTP Request Rewrite добавьте новое правило перезаписи…
- Укажите имя правила.
- Установите порядковый номер.
- Выберите Перезаписать заголовок в качестве действия.
- Введите Connection в качестве имени заголовка.
- Используйте * как старое значение, которое заменит любое значение.
- Введите upgrade в качестве значения Rewrite, чтобы оно отправлялось вместо этого.
- использование
Header Upgrade eq websocket
как условие переписать. Теперь это правило будет применяться только тогда, когдаUpgrade
заголовок содержит значениеwebsocket
, - Нажмите Добавить.
Теперь, когда я пытаюсь снова загрузить приложение и запустить его, соединение установлено с /signalr/connect с помощью транспорта webSockets!
Более подробная информация доступна в моем блоге