绑定到 haproxy 中 IPv4 和 IPv6 的所有接口

绑定到 haproxy 中 IPv4 和 IPv6 的所有接口

我想要配置哈普罗西绑定到所有接口上的tcp以及tcp6套接字(即0.0.0.0:80:::80)。

我能够通过以下设置达到这个目标:

listen web
  bind :80 v4v6
  bind :::80 v6only

有没有比这更短的方法?

虽然我期望它的行为有所不同,但v4v6关键字使得哈普罗西仅绑定到 v4 套接字。

答案1

要在同一端口上监听 IPv6 和 IPv4,请使用以下命令:

bind :::80 v4v6

不可否认,这是一个直观的猜测,似乎是正确的......但我不应该仅仅将“幸运”的猜测作为答案,尽管它有效,但我似乎应该证明它是正确的。

v4v6 关键字使 haproxy 仅绑定到 v4 套接字。

我的第一直觉是,不是因为v4v6使用了:80(或者更准确地说,根本不使用 IP 地址,而只使用端口号)导致该套接字仅在 IPv4 上监听。

这似乎在文档中得到了证实bind

address是可选的,可以是主机名、IPv4 地址、IPv6 地址或'*'。它指定前端将监听的地址。如果未设置,系统的所有 IPv4 地址都将被监听。这同样适用于'*'系统的特殊地址“ 0.0.0.0”。IPv6 等效项是“::”。

http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#4.2-bind(强调添加)

因此,以下三种形式都是等效的,并且都被 HAProxy 解释为 IPv4:

bind :80
bind *:80
bind 0.0.0.0:80

接下来,文档中有一句话v4v6可以单独阅读,表明v4v6可能可用于扩展上述绑定语句之一以监听 IPv6......

v4v6

当使用默认地址时,它用于将套接字绑定到 IPv4 和 IPv6。

...嗯,但我怀疑这实际上意味着“v6 默认地址”(::)...

在默认情况下仅绑定到 IPv6 的系统上有时需要这样做。

...现在,我更加怀疑了……

它对非 IPv6 套接字没有影响,并且被选项覆盖v6only

http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#5.1

因此,似乎v4v6只修改bind指定 IPv6 默认监听地址的指令,即::(第三个:是地址和端口之间的分隔符),而其他的则被忽略。

答案2

接受的答案对我来说不起作用,至少对于 OpenBSD 上的 haproxy-1.6.11p0 来说是这样。另外,TL;DR。只需执行以下操作:

bind 0.0.0.0:80
bind :::80

并且它会起作用:

# netstat -an|grep "*.80"
tcp          0      0  *.80                   *.*                    LISTEN
tcp6         0      0  *.80                   *.*                    LISTEN

答案3

我知道我迟到了。我不被允许发表评论,所以我不得不添加这个答案。

我只是想补充一下,如果你不喜欢三重冒号 ::: 的样子

bind :::80

您始终可以将 IPv6 地址括在括号中。

bind [::]:80

答案4

我是这样配置的:

    bind *:80,[::]:80 v6only
    bind *:443,[::]:443 v6only ssl crt ...

相关内容