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

我想configurationhaproxy绑定到所有接口上的tcp以及tcp6套接字(即, tcp6 :::80:::80 )。

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

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

有没有比这更短的方式?

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

要在相同的端口上侦听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 (强调增加)

所以以下三种forms都是等价的,都被HAProxy解释为IPv4:

 bind :80 bind *:80 bind 0.0.0.0:80 

接下来, v4v6的文档中有v4v6可以单独读取,以指示v4v6可能可用于扩展以上绑定语句之一以侦听IPv6 …

v4v6

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

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

这样做有时在仅默认绑定到IPv6的系统上是必需的。

…现在,我怀疑它甚至更多…

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

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

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

至less在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