我想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