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


8

У меня настроен haproxy с keepalived для балансировки нагрузки и ip failover кластера 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? Это очень важно из-за характера услуг, которые мне нужны для балансировки нагрузки.

Спасибо! Vito


здесь полная документация HAproxy 1.6.6 cbonte.github.io/haproxy-dconv/...

Ответы:


3

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

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

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


2

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

Почему вы беспокоитесь о haproxy? Вы уже активировали keepalive, и он также выполняет правильную прозрачную балансировку нагрузки.


Привет, большое спасибо за ваш ответ :) Я читаю кое-что о поддержке tproxy, я думаю, это то, что вы имели в виду? Кроме того, я не рассматривал балансировку нагрузки с keepalived напрямую для этого. Keepalived проходит оригинальный IP-адрес клиента?
Вито Ботта

Да, keepalived сохраняет исходный IP-адрес без изменений, потому что это балансировщик нагрузки, а не прокси.
womble

2

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

Вы можете найти больше информации о Proxy Protocol в документации 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

Привет Нильс, спасибо за решение, но когда я ввожу send-proxy, это вызывает отключение базы данных (haproxy не может определить хост)
neobie

то же самое случилось со мной и с БД. любое решение?
Пеееш

2

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

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


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

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


-4

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

Глобальный
        [..... обычные вещи ....]   
        ssl-сервер-проверить нет

главный интерфейс *: 5000
        bind *: 443 ssl crt /etc/ssl/mycert_with_private_key.pem
        режим http
        опция forwardfor
        reqadd X-Forwarded-Proto: \ https
        default_backend https_server

серверная часть https_server
        режим http
        баланс наименьшее
        вариант tcpka
        флеш-стол тип ip размер 200k срок действия 30м
        сервер srv04 192.168.1.10:443 проверка ssl
        сервер srv05 192.168.1.11:443 проверка ssl

2
этот ответ не применяется. соединение не HTTP
Longneck

Вы предлагаете https соединение должно быть в режиме TCP ?.
Педро Саяго

Нет, я говорю, что в вопросе используется tcp, а ваш ответ относится только к http / s.
Longneck

хорошо, тогда удачи, я не нашел ни одного документа относительно haproxy в режиме tcp для пересылки ip. Возможно, слой, где обрабатываются запросы, не может передать эту информацию.
Педро Саяго
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.