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

haproxy - передать исходный / удаленный ip в режиме tcp

У меня есть haproxy, настроенный с keepalived для балансировки нагрузки и переключения IP-адресов кластера percona, и, поскольку он отлично работает, я хотел бы использовать тот же lb / failover для другой службы / демона.

Я настроил haproxy так:

listen my_service 0.0.0.0:4567
    mode tcp
    balance leastconn
    option tcpka
    contimeout      500000
    clitimeout      500000
    srvtimeout      500000

    server host1 xxx.xxx.xxx.xx1:4567 check port 4567 inter 5000 rise 3 fall 3
    server host2 xxx.xxx.xxx.xx2:4567 check port 4567 inter 5000 rise 3 fall 3

Балансировка нагрузки работает нормально, но служба видит IP-адрес балансировщика нагрузки, а не фактические IP-адреса клиентов. В режиме http довольно легко заставить haproxy проходить по удаленному IP-адресу, но как мне это сделать в режиме TCP? Это критически важно из-за характера службы, которая мне нужна для балансировки нагрузки.

Спасибо! Вито

На всякий случай, keepalived - это решение для аварийного переключения, а не для балансировки нагрузки (может быть, вы имеете в виду LVS?). режим прозрачного прокси для HAProxy не имеет ничего общего с каким-либо особым способом отправки исходного IP-адреса, это был бы обычный непрозрачный режим HTTP, в котором для этого можно использовать стандартизированный заголовок HTTP.

На мой взгляд, правильный ответ на исходный вопрос: вы можете скомпилировать поддержку прозрачного прокси в HAProxy на ядре Linux с поддержкой TPROXY. Это вместе с соответствующей версией, поддерживающей TPROXY + конфигурация iptables на одном компьютере, обеспечивает фактическую полностью прозрачную поддержку tcp-прокси. Это означает, что внутренние серверы НЕ нуждаются в специальной настройке.

Обратите внимание, что на самом деле это не рекомендуемая настройка для HAProxy, и ее следует использовать только в том случае, если она вам абсолютно необходима.

Очевидно, есть какой-то «прозрачный» режим для haproxy, на который я никогда не смотрел и не хотел иметь ничего общего, и вы могли бы попробовать. В противном случае вам нужно будет научить тому, что серверная служба использует особый способ haproxy для отправки исходного IP-адреса («PROXY blahblah»), и попросить службу извлечь из этого исходный IP-адрес.

Но почему вы возитесь с haproxy? У вас уже есть поддержка активности, и она также обеспечивает правильную прозрачную балансировку нагрузки.

С помощью send-proxy в вашей конфигурации (для каждого сервера) предоставит вам исходный IP-адрес источника на стороне принимающего сервера, даже в режиме TCP. Для этого требуется HAProxy 1.5+.

Вы можете найти дополнительную информацию о Протокол прокси в Документация HAProxy.

listen my_service 0.0.0.0:4567
mode tcp
balance leastconn
option tcpka
contimeout      500000
clitimeout      500000
srvtimeout      500000

server host1 xxx.xxx.xxx.xx1:4567 send-proxy check port 4567 inter 5000 rise 3 fall 3
server host2 xxx.xxx.xxx.xx2:4567 send-proxy check port 4567 inter 5000 rise 3 fall 3

Вы можете установить HAProxy как режим NAT, который по-прежнему использует режим TCP на уровне 4, но делает IP прозрачным.

HAProxy Layer 4 балансировка нагрузки в режиме NAT


С другой стороны, HAPorxy Transparent Mode использует режим HTTP на уровне 7, что не соответствует вашей точке, потому что уже есть forwardfor вариант в режиме HTTP.

HAProxy Layer 7 прозрачный режим прокси с балансировкой нагрузки

Эта конфигурация сработала для меня. Исходный IP-адрес можно получить в $ _SERVER ['HTTP_X_FORWARDED_FOR']:

global
        [..... usual stuff .... ]   
        ssl-server-verify none

frontend  main *:5000
        bind *:443 ssl crt /etc/ssl/mycert_with_private_key.pem
        mode http
        option forwardfor
        reqadd X-Forwarded-Proto:\ https
        default_backend https_server

backend https_server
        mode http
        balance leastconn
        option tcpka
        stick-table type ip size 200k expire 30m
        server srv04 192.168.1.10:443 ssl check
        server srv05 192.168.1.11:443 ssl check