HAProxy TCP режим клиентского IP

Вопрос или проблема

Я использую 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-протокола на целевом сервере и проводить тестирование после внесения любых изменений в конфигурацию, чтобы гарантировать, что ваша система будет продолжать функционировать как ожидалось.

Оцените материал
Добавить комментарий

Капча загружается...