У меня есть 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 прозрачным.
С другой стороны, 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