如何在除 localhost 之外的所有接口上绑定 haproxy,而无需单独提及每个接口?

如何在除 localhost 之外的所有接口上绑定 haproxy,而无需单独提及每个接口?

我有两台主机,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
  ...

相关内容