У нас есть брандмауэр с HAProxy (pfSense) и несколько веб-серверов. Каждый веб-сервер настроен на HTTPS. Правила внешнего интерфейса HAProxy определены с помощью Server Name Indication TLS extension matches
а веб-серверы определены как бэкэнды (все очень похожи).
Выдержка из конфигурации HAProxy (домен / ip заменены)
frontend HAProxy_443-merged
bind 1.2.3.4:443 name 1.2.3.4:443
mode tcp
log global
option log-separate-errors
timeout client 45000
tcp-request inspect-delay 5s
acl sub1example req.ssl_sni -m end -i sub1.example.com
acl sub2example req.ssl_sni -m end -i sub2.example.com
...
tcp-request content accept if { req.ssl_hello_type 1 }
use_backend sub1.example.com_ipvANY if sub1example
use_backend sub2.example.com_ipvANY if sub2example
...
backend sub1.example.com_ipvANY
mode tcp
id 159
log global
timeout connect 30000
timeout server 30000
retries 3
server sub1.example.com 192.168.1.80:443 id 160 check inter 1000
...
Все работает нормально для всех доменов само по себе, но есть проблема с некоторыми поддоменами в том же браузере (тот же корневой домен, например, * .example.com).
Описание:
Если вы посещаете разные поддомены в одном и том же сеансе браузера в течение 30 секунд, трафик направляется на первый веб-сервер / бэкэнд. Если вы перезагружаете страницу, она обновит этот неизвестный сессия. Через прибл. 30 секунд это сессия закрыт, и вы можете перейти на правильную страницу.
Но есть некоторые поддомены без этих проблем.
BTW: это невозможно воспроизвести с помощью таких инструментов, как Postman.
Я исследовал настройки HAProxy для внешнего и внутреннего интерфейса, я проверил заголовки ответов и попытался отладить подтверждение ssl, но не смог найти сходства проблемных или различий между работающим и проблемным веб-сервером / бэкэндом.
Кто-нибудь признает эту проблему? Заранее спасибо.
Это может произойти, если несколько внутренних серверов имеют многодоменный сертификат (или групповой сертификат), где разные домены, на которые распространяется сертификат, обрабатываются разными внутренними серверами.
Рассмотрим сертификат, у которого есть альтернативные имена субъектов для A.example.com и B.example.com. Если клиент создает соединение HTTP / 2 с A.example.com через haproxy, он обнюхивает исходный TLS ClientHello и перенаправляет трафик на сервер A, который отвечает за A.example.com. Если затем клиент обращается к B.example.com, браузер, возможно, решит использовать то же TCP-соединение, поскольку согласно сертификату оно действительно для A.example.com, но также и для B.example.com. Видеть RFC 7540 раздел 9.1.1. Повторное использование подключения для соответствующей части стандарта HTTP / 2, которая позволяет это.
Теперь сервер A может не справиться с запросом B.example.com. В этом случае сервер должен выдать ответ с кодом 421 «Misdirected Request», и в этом случае клиент (браузер) может повторить запрос, используя новое соединение HTTP / 2. Если сервер не создает такой ответ, клиент не знает о проблеме и не может действовать соответствующим образом.
Решить эту проблему в haproxy невозможно, поскольку haproxy будет решать, куда пересылать данные, только на основе исходного ClientHello. Вместо этого нужно исправить это, либо отправив сервер в ответ 421, либо убедившись, что сертификаты охватывают только домены, фактически обслуживаемые сервером.
Смотрите также 421 Неверный запрос и Пул соединений HTTP / 2 нарушает узлы SNI.