У нас есть настройка балансировщика нагрузки, в которой запрос 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-адресу виртуального интерфейса. Вместо того, чтобы оставлять его «открытым».