У меня два хоста, host1 и host2. На обоих хостах есть HAProxy, который в настоящее время прослушивает порт ip :. Это завершает работу SSL для службы, прослушивающей порт localhost: на обоих хостах.
Теперь мы ввели высокую доступность, поэтому у нас есть плавающий IP-адрес (назовем его VIP), который находится только на одном из двух хостов в любой момент времени, и клиенты получают доступ к службе, используя этот плавающий IP-адрес вместо связанного. к сетевой карте.
Итак, чтобы продолжить успешное завершение SSL, нам нужно привязать HAProxy к этому плавающему vip на узле, который в настоящее время владеет этим VIP. Привязать HAProxy к 0.0.0.0 будет довольно просто, но, к сожалению, служба должна прослушивать localhost на том же порту, что и HAProxy, из-за вещей, которые я не могу контролировать. И я не могу изменить порт, на котором HAProxy также может слушать.
Есть ли способ настроить HAProxy для прослушивания на всех хостах, кроме localhost?
Я не знаю способа исключить 127.0.0.1 из адреса подстановочного знака *. Этот ТАК ответ говорит
[В Linux] возможно сначала привязать прослушивающий TCP-сокет к определенной комбинации IP-адреса и порта, а затем привязать другой к IP-адресу с подстановочными знаками и тому же порту.
Поэтому, если вы сначала запустите демон, привязанный к локальному хосту (давайте назовем его httpservice), а затем подстановочный знак haproxy, все должно работать так, как вы просили.
Но вам нужно спланировать, что произойдет, если httpservice умрет на вас. Вы не сможете перезапустить его, потому что haproxy заблокирует ваш порт. Чтобы сделать это более удобным для администратора, вам нужно удалить сценарии rc.d (или модули systemctl) и создать один общий сценарий rc.d:
Действие запуска сценария rc.d:
if httpservice dead
stop haproxy
wait until nothing is bound to *:port
start httpservice
wait until it binds to 127.0.0.1:port
start haproxy
else
start haproxy
остановить действие:
stop haproxy
stop httpservice
wait until nothing is bound to 127.0.0.1:port
Урод, как черт.
Есть вариант для bind
ключевое слово под названием interface
это может помочь, в зависимости от ваших разрешений (выделено мной).
интерфейс <интерфейс>
Ограничивает сокет конкретным интерфейсом. Если указано, сокетом обрабатываются только пакеты, полученные от этого конкретного интерфейса. В настоящее время это поддерживается только в Linux. Интерфейс должен быть первичным системным интерфейсом, а не интерфейсом с псевдонимом. Также возможно привязать несколько интерфейсов к одному и тому же адресу, если они привязаны к разным интерфейсам. Обратите внимание, что для привязки к сетевому интерфейсу требуются привилегии root. Этот параметр совместим только с сокетами TCPv4 / TCPv6.
Я никогда не использовал его, но предполагаю, что это будет выглядеть примерно так:
frontend SSL-Terminator
...
bind 0.0.0.0:443 ssl interface eth0
...