Настройки Haproxy-шлюза - клиент и сервер находятся в одной подсети

Я пытаюсь настроить шлюз haproxy между сервером и клиентом для полного прозрачного прокси, как показано на рисунке ниже. Моя главная цель - обеспечить балансировку нагрузки.

Существует простое приложение, которое прослушивает порт 25 на стороне сервера. Клиент пытается подключиться к порту 25 на компьютере шлюза, и haproxy на шлюзе выбирает доступный сервер, а затем перенаправляет соединение на сервер.

Сетевой анализ этого подхода создает поток, подобный диаграмме: клиент сбрасывает соединение в конце, так как он не отправляет пакет синхронизации на сервер.

Это использование haproxy верно и моя конфигурация связана с проблемой? Или клиент должен подключиться к серверу напрямую (для меня это не имеет особого смысла, но на самом деле я не уверен. Если это правда, то как haproxy будет вмешиваться в соединение и производить балансировку нагрузки)?

РЕДАКТИРОВАТЬ:

Я начал думать, что эта проблема связана с маршрутизацией и NAT на шлюзе. Все эти три машины находятся в одной подсети, но я добавил маршруты к шлюзу как для клиента, так и для сервера. Также правила на шлюзе:

iptables -t mangle -N DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 0x01/0x01
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A PREROUTING -p tcp --dport 25 -j TPROXY \
         --tproxy-mark 0x1/0x1 --on-port 10025

ip route flush table 100
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

Теперь вопрос в том, что я должен сделать в шлюзе, чтобы изменить "syn-ack (src: S, dst: C)" в "syn-ack (src: GW, dst: C)"?

Схема потока TCP

1 ответ

Решение

Вот определение моей ситуации.

Вот режим прозрачного прокси: HAProxy может быть настроен для подмены IP-адреса клиента при установлении TCP-соединения с сервером. Таким образом, сервер считает, что соединение исходит от клиента напрямую (конечно, сервер должен отвечать обратно HAProxy, а не клиенту, иначе это не может работать: клиент получит подтверждение от IP-адреса сервера, пока он имеет установил соединение по IP HAProxy).

И ответ - установить системный контроль ip_nonlocal_bind.

Другие вопросы по тегам