У меня есть следующие настройки:
(internet) ---> [ pfSense Box ] /-> [ Apache / PHP server ]
[running HAproxy] --+--> [ Apache / PHP server ]
+--> [ Apache / PHP server ]
\-> [ Apache / PHP server ]
Для HTTP-запросов это прекрасно работает , запросы распределяются на мои серверы Apache просто отлично. Для запросов SSL у меня было HAproxy, распределяющее запросы с использованием балансировки нагрузки TCP, и это работало, однако, поскольку HAproxy не действовал как прокси, он не добавлял X-Forwarded-For
заголовок HTTP, и серверы Apache / PHP не знали клиента реальный IP-адрес.
Итак, я добавил stunnel
перед HAproxy, читая, что stunnel может добавить X-Forwarded-For
заголовок HTTP. Однако пакет, который я мог бы установить в pfSense, не добавляет этот заголовок ... также, это, очевидно, убивает мою способность использовать запросы KeepAlive , которые я действительно хотел бы сохранить. Но самой большой проблемой, которая убила эту идею, было то, что stunnel преобразовал HTTPS-запросы в простые HTTP-запросы, поэтому PHP не знал, что SSL был включен, и пытался перенаправить на сайт SSL.
Как я могу использовать HAproxy для балансировки нагрузки между несколькими серверами SSL, позволяя этим серверам знать IP-адрес клиента и знать, что SSL используется? И если возможно, как я могу сделать это на моем сервере pfSense?
Или я должен отказаться от всего этого и просто использовать nginx?
источник
X-Forwarded-For
, смотрите здесь .Ответы:
Вам не нужно отбрасывать все это, вы можете просто использовать nginx перед haproxy для поддержки SSL, сохраняя все свои настройки балансировки нагрузки. Вам даже не нужно использовать nginx для HTTP, если вы не хотите. Nginx может передавать как X-Forwarded-For, так и пользовательский заголовок, указывающий, что SSL используется (и информацию о сертификате клиента, если хотите). Фрагмент конфигурации Nginx, который отправляет необходимую информацию:
источник
Просто для записи, так как этот поток часто упоминается относительно HAProxy + SSL, HAProxy поддерживает собственный SSL с обеих сторон, начиная с 1.5-dev12. Таким образом, имея X-Forwarded-For, HTTP keep-alive, а также заголовок, сообщающий серверу о том, что соединение было установлено через SSL, так просто:
Я уверен, что к тому времени, когда вы придумали что-то другое, но, по крайней мере, новые посетители получат простое решение сейчас :-)
источник
acl is-ssl dst_port 443
и переписать строку:reqadd X-Forwarded-Proto:\ https if is-ssl
Nginx, похоже, справляется с этим заголовком довольно хорошоДля всех, кто найдет этот вопрос, я последовал совету Ochoto и использовал nginx. Вот конкретные шаги, которые я использовал, чтобы заставить это работать на моем маршрутизаторе pfSense :
Используя веб-интерфейс pfsense, я установил пакет pfsense PfJailctl и пакет "jail_template" в разделе System> Packages, чтобы я мог создать джейл FreeBSD для компиляции и установки nginx в системе pfsense.
Я настроил тюрьму для своего сервера nginx в разделе « Службы»> «Тюрьмы» , предоставив новой тюрьме то же имя хоста и IP-адрес виртуального IP-псевдонима, на котором у меня работал HAproxy. Я привязал тюрьму к интерфейсу WAN. Я использовал шаблон тюрьмы по умолчанию и включил unionfs, а не nullfs.
После того, как тюрьма была запущена, я SSHed в поле pfsense и побежал,
jls
чтобы найти номер тюрьмы. Затем я побежалjexec 1 sh
за раковиной в тюрьму. Оттуда я настроил порты BSD и установил nginx, используя:Затем я настроил nginx для прослушивания порта 443 и передачи всех запросов HAproxy через порт 80, включая реальный IP-адрес и состояние SSL в заголовках HTTP. Моя
usr/local/etc/nginx/nginx.conf
выглядит так:Затем я изменил свое приложение PHP для обнаружения
X-Forwarded-Proto
заголовка HTTP:Итак, окончательная настройка:
источник
Моя конфигурация для haproxy версии 1.5-dev-17:
Он использует
ssl_fc
ACL. Обратите внимание, что этаoption http-server-close
часть очень важна.источник
HAProxy не может
X-Forwarded-For
получить доступ к бэкэнду SSL без использования режима «сырой» TCP, что приводит к потере , но вы можете потенциально повторно зашифровать трафик с помощью прослушивающего stunnel для транзита бэкэнда. Хотя уродливо.Мне больше нравится подход Ochoto, с оговоркой: nginx - это идеально способный балансировщик нагрузки; если вы используете это, я бы сказал, использовать его для всего. Проксируйте ваш входящий HTTPS для загрузки сбалансированных бэкэндов HTTPS - и таким образом, нет необходимости в пользовательских заголовках для информации SSL (если вам не нужен сертификат клиента).
источник
В прошлом году я реализовал решение для интеграции HAProxy с pfSense таким образом, чтобы он использовал все функции HAProxy и поддерживал хорошую изоляцию с pfSense. Так что это жизнеспособный вариант для производственных сред . SSL прекращается на HAProxy . Я установил HAProxy внутри тюрьмы в pfSense, используя ezjail и Ports Collection . Таким образом, очень легко поддерживать оба компонента независимо друг от друга. И вы можете установить любую версию, какую захотите. Я начал с 1.5-dev13. И с тех пор это работает отлично для меня. Я задокументировал все это здесь.
Установка HAProxy на pfSense
Кстати, Вилли, большое спасибо за такой отличный продукт.
источник