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


13

我想配置HAProxy的绑定到tcptcp6插座上的所有接口(即,0.0.0.0:80:::80)。

我可以通过以下设置实现此目标:

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

有没有比这更短的方法了?

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


3
bind :::80 v4v6
Michael-sqlbot

实际上,这可行。谢谢!您可以将其归档为答案,以便我给您信用吗?
StephenKing

Answers:


25

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

bind :::80 v4v6

诚然,这是一个直觉上的猜测,似乎是正确的……但是,尽管它能奏效,而不是仅仅发布“幸运”的猜测作为答案,但似乎我应该证明这一点。

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

我的第一个直觉是,不是(v4v6而是:80,更确切地说,根本不使用IP地址,仅使用端口号)导致此套接字仅侦听IPv4。

这似乎在docs中得到了确认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可能可以扩展上述bind语句之一以侦听IPv6 ...

v4v6

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

... hmmm,但我怀疑这实际上是“ v6默认地址”(::)...

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

...现在,我怀疑甚至更多...

它对非IPv6套接字无效,并且被该v6only选项覆盖。

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

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


5

接受的答案对我不起作用,至少对于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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.