我有两台主机,host1 和 host2。两台主机上都有 HAProxy,目前正在监听 ip:port。这会对两台主机上监听 localhost:port 的服务执行 SSL 终止。
现在,我们引入了高可用性,因此我们有一个浮动 IP(我们称之为 VIP),它在任何时候都只驻留在两个主机中的一个上,客户端使用这个浮动 IP 而不是绑定到 NIC 的 IP 来访问服务。
因此,为了继续成功终止 SSL,我们需要将 HAProxy 绑定到当前拥有此 VIP 的节点上的浮动 VIP 上。将 HAProxy 绑定到 0.0.0.0 上非常容易,但不幸的是,由于我无法控制的原因,该服务必须在与 HAProxy 相同的端口上监听 localhost。而且我也无法更改 HAProxy 可以监听的端口。
有什么方法可以配置 HAProxy 来监听除本地主机之外的所有主机?
答案1
我不知道如何从通配符 * 地址中排除 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
丑陋至极。
答案2
有一个选项对于bind
所调用的关键字interface
,可能会起作用,具体取决于您的权限(强调我的)。
界面 <接口>
将套接字限制到特定接口。指定后,套接字将仅处理从该特定接口接收的数据包。目前仅在 Linux 上支持此功能。接口必须是主系统接口,而不是别名接口。如果多个前端绑定到不同的接口,也可以将它们绑定到同一地址。请注意,绑定到网络接口需要 root 权限。此参数仅与 TCPv4/TCPv6 套接字兼容。
我从来没有用过它,但我认为它看起来像这样:
frontend SSL-Terminator
...
bind 0.0.0.0:443 ssl interface eth0
...