Binden Sie an alle Schnittstellen für IPv4 und IPv6 in Haproxy

13

Ich möchte Haproxy so konfigurieren , dass es an alle Schnittstellen (dh und ) sowohl an einen tcpals auch an einen tcp6Socket bindet .0.0.0.0:80:::80

Dieses Ziel konnte ich mit folgenden Einstellungen erreichen:

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

Gibt es einen kürzeren Weg als diesen?

Ich erwarte, dass es sich anders verhält, aber das v4v6Schlüsselwort bewirkt , dass Haproxy nur an einen v4-Socket gebunden wird.

Stephen King
quelle
3
Was ist bind :::80 v4v6?
Michael - sqlbot
Eigentlich funktioniert das. Vielen Dank! Können Sie es bitte als Antwort einreichen, damit ich Ihnen Kredit geben kann?
StephenKing

Antworten:

25

Gehen Sie folgendermaßen vor, um IPv6 und IPv4 auf demselben Port abzuhören:

bind :::80 v4v6

Zugegeben, dies war eine intuitive Vermutung, die richtig zu sein scheint ... aber anstatt nur eine "glückliche" Vermutung als Antwort zu posten, scheint es, als ob ich es rechtfertigen sollte, obwohl es funktioniert.

Mit dem Schlüsselwort v4v6 wird Haproxy nur an einen v4-Socket gebunden.

Meine erste Intuition war, dass es nicht v4v6nur die Verwendung von :80(oder genauer gesagt, die Verwendung von gar keiner IP-Adresse, nur einer Portnummer) ist, die bewirkt, dass dieser Socket nur IPv4 abhört.

Dies scheint in den Dokumenten bestätigt zu sein für bind:

addressist optional und kann ein Hostname, eine IPv4-Adresse, eine IPv6-Adresse oder ein Name sein '*'. Es gibt die Adresse an, die das Frontend abhört. Wenn nicht festgelegt, werden alle IPv4-Adressen des Systems abgehört. Gleiches gilt für '*'oder die Sonderadresse " 0.0.0.0" des Systems . Das IPv6-Äquivalent ist '::'.

http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#4.2-bind (Hervorhebung hinzugefügt)

Die folgenden drei Formen sind also alle gleichwertig und werden von HAProxy als IPv4 interpretiert:

bind :80
bind *:80
bind 0.0.0.0:80

Als nächstes gibt es einen Satz in den Dokumenten, der v4v6isoliert gelesen werden könnte, um anzuzeigen, dass v4v6möglicherweise eine der oben genannten bind-Anweisungen zum Abhören von IPv6 verwendet werden kann ...

v4v6

Es wird verwendet, um einen Socket an IPv4 und IPv6 zu binden, wenn die Standardadresse verwendet wird.

... hmmm, aber ich vermute, dass dies tatsächlich "die v6-Standardadresse" bedeutet ( ::) ...

Dies ist manchmal auf Systemen erforderlich, die standardmäßig nur an IPv6 gebunden sind.

... und jetzt vermute ich es noch mehr ...

Es hat keine Auswirkung auf Nicht-IPv6-Sockets und wird von der v6onlyOption überschrieben .

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

Es sieht also so aus, als würden v4v6nur bindDirektiven geändert , die die IPv6-Standardempfangsadresse angeben ::(die dritte :ist das Trennzeichen zwischen der Adresse und dem Port) und für andere ignoriert.

Michael - sqlbot
quelle
4

Die akzeptierte Antwort funktioniert bei mir nicht, zumindest mit haproxy-1.6.11p0 unter OpenBSD. Auch TL; DR. Mach einfach:

bind 0.0.0.0:80
bind :::80

und es wird funktionieren:

# netstat -an|grep "*.80"
tcp          0      0  *.80                   *.*                    LISTEN
tcp6         0      0  *.80                   *.*                    LISTEN
foobar
quelle