Lier à toutes les interfaces pour IPv4 et IPv6 dans haproxy

13

Je veux configurer haproxy pour se lier à un socket tcpainsi qu'à tcp6toutes les interfaces (c'est-à-dire, 0.0.0.0:80et :::80).

J'ai pu atteindre cet objectif avec les paramètres suivants:

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

Y a-t-il un moyen plus court que cela?

Bien que je m'attende à ce qu'il se comporte différemment, le v4v6mot clé fait que haproxy ne se lie qu'à un socket v4.

Stephen King
la source
3
Et alors bind :::80 v4v6?
Michael - sqlbot
En fait, cela fonctionne. Merci! Pouvez-vous le déposer comme réponse s'il vous plaît afin que je puisse vous donner un crédit?
StephenKing

Réponses:

25

Pour écouter sur le même port pour IPv6 et IPv4, utilisez ceci:

bind :::80 v4v6

Certes, c'était une supposition intuitive qui semble avoir été correcte ... mais plutôt que de simplement poster une supposition "chanceuse" comme réponse, même si cela fonctionne, il semble que je devrais la justifier.

le mot clé v4v6 fait que haproxy ne se lie qu'à un socket v4.

Ma première intuition était que ce n'est pas v4v6mais plutôt l'utilisation :80(ou, plus précisément, l'utilisation d'aucune adresse IP du tout, juste un numéro de port) qui fait que cette socket n'écoute que sur IPv4.

Cela semble être confirmé dans les documents pour bind:

addressest facultatif et peut être un nom d'hôte, une adresse IPv4, une adresse IPv6 ou '*'. Il désigne l'adresse que le frontend écoutera. S'il n'est pas défini, toutes les adresses IPv4 du système seront écoutées. Il en sera de même pour '*'l'adresse spéciale du système " 0.0.0.0". L'équivalent IPv6 est '::'.

http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#4.2-bind (soulignement ajouté)

Ainsi, les trois formes suivantes sont toutes équivalentes et sont toutes interprétées comme étant IPv4 par HAProxy:

bind :80
bind *:80
bind 0.0.0.0:80

Ensuite, il y a une phrase dans les documents pour v4v6pourrait être lue isolément pour indiquer qu'il v4v6pourrait être utile d'étendre l'une des instructions de liaison ci-dessus pour écouter sur IPv6 ...

v4v6

Il est utilisé pour lier un socket à la fois à IPv4 et IPv6 lorsqu'il utilise l'adresse par défaut.

... hmmm, mais je soupçonne que cela signifie en fait "l'adresse par défaut v6" ( ::) ...

Cela est parfois nécessaire sur les systèmes qui ne se lient à IPv6 que par défaut.

... et maintenant, je le soupçonne encore plus ...

Il n'a aucun effet sur les sockets non IPv6 et est remplacé par l' v6onlyoption.

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

Ainsi, il semble que v4v6ne modifie bindque les directives qui spécifient l'adresse d'écoute IPv6 par défaut, qui est ::(la 3e :est le séparateur entre l'adresse et le port), et est ignorée pour les autres.

Michael - sqlbot
la source
5

La réponse acceptée ne fonctionne pas pour moi, du moins avec haproxy-1.6.11p0 sur OpenBSD. Aussi, TL; DR. Faites juste:

bind 0.0.0.0:80
bind :::80

et cela fonctionnera:

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