Вопрос или проблема
Я использую haproxy для перенаправления нескольких доменов с одного IP. Это работает хорошо. Однако мне нужно, чтобы IP клиента передавался на конечную точку, поэтому я добавил send-proxy в бэкенд. Теперь сайт перестал загружаться. Когда я удаляю send-proxy, он снова работает, но мне нужен IP клиента. Ниже мой haproxy.cfg
frontend https_in
mode tcp
#mode http
option tcplog
#option forwardfor
bind *:443
acl tls req.ssl_hello_type 1
tcp-request inspect-delay 5s
tcp-request content accept if tls
acl host_work_domain_com req.ssl_sni -i work.domain.com
use_backend https_work_domain_com if host_work_domain_com
backend https_work_domain_com
mode tcp
option ssl-hello-chk
server server1 10.11.70.81:443 send-proxy
Опция send-proxy
требует, чтобы сервер понимал и реализовывал протокол PROXY, например, как это задокументировано по адресу http://www.haproxy.org/download/1.8/doc/proxy-protocol.txt
Ваш сервер реализует PROXY?
Ответ или решение
Для корректной передачи IP-адреса клиента через HAProxy в режиме TCP с использованием опции send-proxy
, необходимо учесть несколько важных аспектов, которые напрямую влияют на работоспособность вашей конфигурации.
Понимание решения
Опция send-proxy
используется для отправки оригинального IP-адреса клиента на сервер. Однако для того чтобы эта опция работала, сервер, к которому вы подключаетесь, должен поддерживать протокол PROXY, описанный в документации HAProxy. Если сервер не поддерживает данный протокол, то включение send-proxy
приведет к ошибкам и невозможности загрузки сайта.
Проверка поддержки PROXY-протокола на сервере
Перед тем как включать опцию send-proxy
, вам необходимо убедиться, что сервер, на который вы пересылаете запросы (в вашем случае это server1 10.11.70.81:443
), поддерживает PROXY-протокол. Если сервер написан на основе технологий, таких как Nginx или Apache, вам нужно будет включить поддержку PROXY-протокола в его конфигурации.
Для Nginx:
В конфигурации Nginx необходимо добавить директиву proxy_protocol
к вашему слушателю, так как это позволит Nginx принимать информацию о клиенте в формате PROXY.
server {
listen 443 proxy_protocol;
...
}
Для Apache:
Для Apache необходимо активировать модуль mod_proxy
и добавить параметр ProxyPreserveHost On
:
<VirtualHost *:443>
ProxyPreserveHost On
...
</VirtualHost>
Изменение конфигурации HAProxy
Если ваш сервер не поддерживает PROXY-протокол, вы можете рассмотреть альтернативные варианты, такие как использование режима HTTP вместо TCP или добавление заголовка X-Forwarded-For
, который будет содержать IP-адрес клиента.
Изменение вашей конфигурации HAProxy может выглядеть следующим образом:
frontend https_in
mode http
option httplog
bind *:443
acl host_work_domain_com req.ssl_sni -i work.domain.com
use_backend https_work_domain_com if host_work_domain_com
backend https_work_domain_com
mode http
server server1 10.11.70.81:443
Заключение
Чтобы успешно использовать функцию передачи IP-адреса клиента через HAProxy, убедитесь, что ваш сервер поддерживает PROXY-протокол. Если это не так, подумайте о переходе на режим HTTP или использовании заголовка X-Forwarded-For
. Каждый из этих вариантов требует правильной настройки сервера, чтобы обеспечить корректную работу вашего приложения.
Подводя итог, важно дважды проверить поддержку PROXY-протокола на целевом сервере и проводить тестирование после внесения любых изменений в конфигурацию, чтобы гарантировать, что ваша система будет продолжать функционировать как ожидалось.