Haproxy

綁定到 haproxy 中 IPv4 和 IPv6 的所有介面

  • May 19, 2021

我想將haproxy配置為綁定到所有介面(即和)上的 atcp和套接字。tcp6``0.0.0.0:80``:::80

我能夠通過以下設置達到這個目標:

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

還有比這更短的方法嗎?

雖然我希望它表現不同,但該v4v6關鍵字使haproxy 僅綁定到 v4 套接字。

要在同一埠上偵聽 IPv6 和 IPv4,請使用以下命令:

bind :::80 v4v6

誠然,這是一個直覺的猜測,似乎是正確的……但不是僅僅發布一個“幸運”的猜測作為答案,即使它有效,似乎我應該證明它是合理的。

v4v6 關鍵字使 haproxy 僅綁定到 v4 套接字。

我的第一個直覺是,導致此套接字僅在 IPv4 上偵聽的不是v4v6使用:80(或者更準確地說,根本不使用 IP 地址,只是使用埠號)。

這似乎在以下文件中得到證實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 預設偵聽地址的指令,即::(第三個:是地址和埠之間的分隔符),而其他人則忽略。

引用自:https://serverfault.com/questions/747895