我想要配置哈普罗西绑定到所有接口上的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 ...