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

Может ли HAProxy выполнять одновременно завершение SSL и сквозную передачу?

Я работаю над анализом периодического сбоя балансировки нагрузки в нашем приложении.

Ранее мы использовали AWS Elastic Load Balancer в следующей конфигурации:

HTTP 80 -> HTTP 80
HTTPS 443 -> HTTPS 443, presenting the same certificate as the backend IIS servers are

Теперь мы понимаем, что это немного нелепая установка (и LB, и сервер IIS выполняют одно и то же шифрование ... напрасная работа), и теперь это начало вызывать у нас некоторые проблемы. В частности, мы будем периодически видеть запрос на увеличение задержки ELB, принимать полные 60 секунд (тайм-аут по умолчанию), а затем сообщать об ошибке клиенту. Мы потратили много времени на то, чтобы убедиться, что всплеск задержки не связан с задержкой обработки в приложении.

Как уже упоминалось, теперь мы понимаем, что это странная установка. Например, более естественная конфигурация ELB отлично работает:

HTTP 80 -> HTTP 80
TCP 443 -> TCP 443, straight passthrough, all encryption happening on the IIS backend

На мгновение уменьшив масштаб, нам стало любопытно, сможем ли мы воспроизвести периодический сбой в плохой конфигурации HAProxy. Это означает, что HAProxy выполняет завершение SSL, а затем инициирует еще одно полное SSL-соединение с внутренним сервером. Опять же, мы понимаем, что это глупо, но проводим расследование с целью сравнения черного ящика, то есть ELB и HAProxy.

Вот простая конфигурация, которую я пробовал:

frontend https_frontend
  bind *:443 ssl crt /etc/ssl/certs/ourpublicandprivatecert.pem
  mode http
  default_backend web_server
backend web_server
  mode http
  server s1 10.0.1.4:443 check

Затем, просматривая хост HAProxy, мы получаем:

504 Gateway Time-out

The server didn't respond in time.

Я предполагаю, что HAProxy волнуется из-за несоответствия в сертификате, но я не могу получить журналы, подтверждающие это. Другая возможность заключается в том, что из-за того, что это такая странная установка (смешивание завершения SSL и сквозной передачи), HAProxy просто не поддерживает ее, вместо этого вынуждая вас использовать более разумные пути сквозного завершения ИЛИ.

У кого-нибудь есть понимание?

Естественно, у вас есть последняя версия HAProxy со встроенной поддержкой OpenSSL.

Кажется, вам нужны дополнительные параметры для использования бэкэнда HTTPS. HAProxy по умолчанию пытается использовать обычное HTTP-соединение, независимо от номера порта.

В ssl параметр обеспечивает SSL-соединение:

server s1 10.0.1.4:443 ssl check check-ssl

Сертификат сервера по умолчанию не проверяется. Если вы хотите проверить это, вам нужно добавить verify required и ca-file <cafile> к серверной строке.

Подробнее о вариантах см. Здесь: http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#5.2

Я думаю, что в вашей конфигурации бэкенда есть ошибка. Вместо этого попробуйте:

frontend https_frontend
  bind *:443 ssl crt /etc/ssl/certs/ourpublicandprivatecert.pem
  mode http
  default_backend web_server
backend web_server
  mode http
  server s1 10.0.1.4:80 check

Изменяющийся порт! А также убедитесь, что ваш веб-сервер не перенаправляет с 80 на 443 порт, иначе это может запутать ситуацию.

Одно из преимуществ, которое вы получаете при использовании haproxy или ELB для завершения SSL, заключается в том, что он может вставлять заголовки, такие как X-Forwarded-For.

Если вы просто проходите через SSL с помощью опции tcp и не используете SSL на ELB или с HAProxy, нет возможности вставить заголовки, потому что поток зашифрован. Следовательно, у веб-сервера нет возможности сделать что-то разумное с запросом, и все клиентские соединения в журналах веб-сервера будут выглядеть так, как будто они исходят с IP-адреса elb или haproxy-сервера!

Поэтому не делегируйте шифрование бэкэнду, вместо этого делайте все это на ELB или экземпляре HAProxy и используйте X-Forwarded-For.