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

Удаленные серверы в прозрачном режиме HAProxy TCP

Хорошо, у меня есть серверный ящик с установленным HAProxy, и он мне нужен для пересылки трафика на два сервера MySQL. Оба они расположены в совершенно разных дата-центрах. Это работает, когда я удалю это из конфигурации: source 0.0.0.0 usesrc clientip Однако при включении я не могу получить ответ от серверов MySQL.

У меня есть эти правила IPTables на сервере HAProxy: iptables -t mangle -N DIVERT iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT iptables -t mangle -A DIVERT -j MARK --set-mark 111 iptables -t mangle -A DIVERT -j ACCEPT ip rule add dev eth0 fwmark 111 lookup 100 ip route add local 0.0.0.0/0 dev lo table 100

И никакой связи не может быть. Однако когда я добавляю это: iptables -A POSTROUTING -t nat -j MASQUERADE

Это работает, но IP-адрес клиента не отправляется, только IP-адрес прокси.

Серверы MySQL настроены на использование IP-адреса сервера HAProxy в качестве шлюза по умолчанию.

Я не уверен, возможно ли это вообще, я возился с этим несколько дней.

Моя конфигурация HAProxy:

global
    log 127.0.0.1 local0 debug
    daemon

defaults
    log global
    retries 2
    #option dontlognull
    option tcp-smart-accept
    option tcp-smart-connect
    option tcplog
    option log-health-checks
    timeout connect 3000
    timeout server 5000
    timeout client 5000

frontend mysql-frontend
    bind 100.111.111.111:3306 transparent
    default_backend mysql-backend

backend mysql-backend
    mode tcp
    source 0.0.0.0 usesrc clientip
    option mysql-check user haproxy_check
    server mysql1 192.111.111.111:3306 check
    server mysql2 200.111.111.111:3306 check

Таблицы маршрутов для одного из серверов MySQL:

Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 100.111.111.111 0.0.0.0 UG 2 0 0 eth0 100.111.111.111 0.0.0.0 255.255.255.255 UH 2 0 0 eth0 192.111.111.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo

Sysctl для коробки HAProxy:

net.ipv4.ip_forward = 1 net.ipv4.conf.all.forwarding = 1 net.ipv4.conf.all.accept_redirects = 1 net.ipv4.conf.all.send_redirects = 1 net.ipv4.conf.eth0.send_redirects = 1 net.ipv4.ip_nonlocal_bind = 1 net.ipv4.conf.default.rp_filter = 2 net.ipv4.conf.default.accept_source_route = 0

Модуль TProxy также скомпилирован в HAProxy, и необходимые модули ядра также включены.

Также есть только один интерфейс, eth0.

Пожалуйста, дайте мне знать, что я делаю не так, и если это вообще возможно!

Спасибо!

Прозрачный режим требует, чтобы haproxy был шлюзом по умолчанию для внутренних серверов. Удаленные серверы работать не будут.