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

Использование виртуального IP с stunnel и haproxy

У нас есть настройка балансировщика нагрузки, в которой запрос HTTPS проходит через следующие шаги: -

Client -> DNS -> stunnel on Load-Balancer -> HAProxy on LB -> Web-Server

Эта настройка отлично работает, когда stunnel прослушивает локальный IP-адрес Load-Balancer.

Однако в нашей настройке у нас есть 2 балансировщика нагрузки, и мы хотим иметь возможность прослушивать виртуальный IP-адрес, который существует только на одном LB за раз (keepalived переключает IP на второй LB, если первый падает).

У HAProxy нет проблем с этим (и я могу пинговать назначенный виртуальный IP-адрес на балансировщике нагрузки, который я тестирую), но похоже, что stunnel ненавидит эту концепцию.

Кто-нибудь достигал этого раньше (ниже моя конфигурация stunnel - как вы можете видеть, я на самом деле слушаю ВСЕ трафик на 443): -

cert= /etc/ssl/certs/mycert.crt
key = /etc/ssl/certs/mykey.key
;setuid = nobody
;setgid = nogroup

pid = /etc/stunnel/stunnel.pid
debug = 3
output = /etc/stunnel/stunnel.log

socket=l:TCP_NODELAY=1
socket=r:TCP_NODELAY=1

[https]
accept=443
connect=127.0.0.1:8443
TIMEOUTclose=0
xforwardedfor=yes

Простите за длинный вопрос!

Ключ состоит в том, чтобы позволить несуществующим интерфейсам быть привязанными к программам (например, stunnel, HA-proxy). Таким образом, когда keepalived переворачивает виртуальный IP-адрес в этот ящик, программы уже прослушивают и ждут трафика на этом интерфейсе.

Это можно сделать, изменив свой /etc/sysctl.conf включив пару ключ / значение:

net.ipv4.ip_nonlocal_bind=1

Подробнее здесь: http://nbevans.wordpress.com/2011/03/01/safely-pairing-haproxy-with-virtual-network-interface-providers-like-keepalived-or-heartbeat/

Затем вам лучше всего изменить настройки stunnel и HA-proxy, чтобы жестко запрограммировать привязку к конкретному IP-адресу виртуального интерфейса. Вместо того, чтобы оставлять его «открытым».