Je veux configurer haproxy pour se lier à un tcp
ainsi qu'à tcp6
socket sur toutes les interfaces (c'est-à-dire 0.0.0.0:80
et :::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?
Alors que je m'attends à ce qu'il se comporte différemment, le v4v6
le mot clé fait que haproxy se lie à un socket v4 uniquement.
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 v4v6
mais plutôt l'utilisation de :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 la documentation de bind
:
address
est 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. Si non défini, toutes les adresses IPv4 du système seront écoutées. Il en sera de même pour'*'
ou 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 (italique 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 v4v6
peut être lu isolément pour indiquer que v4v6
pourrait être utile pour é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 le
v6only
option.http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#5.1
Il semble donc que v4v6
modifie uniquement les directives bind
qui spécifient l'adresse d'écoute IPv6 par défaut, qui est ::
(le 3ème :
est le séparateur entre l'adresse et le port), et est ignoré pour les autres.
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