我们有一个负载均衡器设置,其中 HTTPS 请求经过以下步骤:-
Client -> DNS -> stunnel on Load-Balancer -> HAProxy on LB -> Web-Server
当 stunnel 正在监听负载均衡器的本地 IP 时,此设置可以完美运行。
然而,在我们的设置中,我们有 2 个负载均衡器,并且我们希望能够监听一个虚拟 IP,该虚拟 IP 一次只存在于一个 LB 上(如果第一个 LB 失败,keepalived 会将 IP 翻转到第二个 LB)。
HAProxy 执行此操作没有任何问题(并且我可以在我正在测试的负载均衡器上 ping 分配的虚拟 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
抱歉,这个问题问得太长了!
答案1
关键是允许程序(如 stunnel、HA-proxy)绑定到不存在的接口。这样,当 keepalived 将虚拟 IP 翻转到该框上时,程序已经在监听并等待该接口上的流量。
这可以通过修改您的,/etc/sysctl.conf
包括以下键/值对来完成:
net.ipv4.ip_nonlocal_bind=1
然后,您最好修改 stunnel 和 HA-proxy 配置,以将绑定硬编码到特定的虚拟接口 IP。而不是让它处于“开放”状态。