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

Ste*_*ing 15 haproxy

我想配置haproxy以绑定到所有接口(即和)上的atcptcp6套接字。0.0.0.0:80:::80

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

listen web
  bind :80 v4v6
  bind :::80 v6only
Run Code Online (Sandbox Code Playgroud)

还有比这更短的方法吗?

虽然我希望它的行为有所不同,但v4v6关键字使haproxy 仅绑定到 v4 套接字。

Mic*_*bot 29

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

bind :::80 v4v6
Run Code Online (Sandbox Code Playgroud)

诚然,这是一个直观的猜测,似乎是正确的……但不仅仅是发布一个“幸运”的猜测作为答案,即使它有效,似乎我应该证明它是合理的。

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
Run Code Online (Sandbox Code Playgroud)

接下来,文档中有一句话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 默认侦听地址的指令,即::(第三个:是地址和端口之间的分隔符),其他指令被忽略。


小智 8

接受的答案对我不起作用,至少在 OpenBSD 上使用 haproxy-1.6.11p0。另外,TL; DR。做就是了:

bind 0.0.0.0:80
bind :::80
Run Code Online (Sandbox Code Playgroud)

它会起作用:

# netstat -an|grep "*.80"
tcp          0      0  *.80                   *.*                    LISTEN
tcp6         0      0  *.80                   *.*                    LISTEN
Run Code Online (Sandbox Code Playgroud)