Enlace a todas las interfaces para IPv4 e IPv6 en haproxy

13

Quiero configurar haproxy para unirse a una tcp, así como tcp6socket en todas las interfaces (es decir, 0.0.0.0:80y :::80).

Pude alcanzar este objetivo con la siguiente configuración:

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

¿Hay alguna forma más corta que esta?

Si bien espero que se comporte diferente, la v4v6palabra clave hace que haproxy se una solo a un socket v4.

Stephen King
fuente
3
¿Qué hay de bind :::80 v4v6?
Michael - sqlbot el
En realidad, esto funciona. ¡Gracias! ¿Puede presentarlo como respuesta por favor para que yo pueda darle crédito?
StephenKing

Respuestas:

25

Para escuchar en el mismo puerto para IPv6 e IPv4, use esto:

bind :::80 v4v6

Es cierto que esta fue una suposición intuitiva que parece haber sido correcta ... pero en lugar de simplemente publicar una suposición "afortunada" como respuesta, aunque funciona, parece que debería justificarla.

La palabra clave v4v6 hace que el haproxy se una solo a un socket v4.

Mi primera intuición fue que no es v4v6sino el uso de :80(o, más precisamente, el uso de ninguna dirección IP, solo un número de puerto) lo que hace que este socket escuche solo en IPv4.

Esto parece confirmarse en los documentos para bind:

addresses opcional y puede ser un nombre de host, una dirección IPv4, una dirección IPv6 o '*'. Designa la dirección en la que escuchará la interfaz. Si no está configurado, se escucharán todas las direcciones IPv4 del sistema. Lo mismo se aplicará a '*'la dirección especial del sistema " 0.0.0.0". El equivalente de IPv6 es '::'.

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

Por lo tanto, las siguientes tres formas son todas equivalentes y HAProxy las interpreta todas como IPv4:

bind :80
bind *:80
bind 0.0.0.0:80

A continuación, hay una oración en los documentos que v4v6podría leerse de forma aislada para indicar que v4v6podría utilizarse para extender una de las declaraciones de enlace anteriores para escuchar en IPv6 ...

v4v6

Se utiliza para vincular un socket a IPv4 e IPv6 cuando usa la dirección predeterminada.

... hmmm, pero sospecho que esto realmente significa "la dirección predeterminada de v6" ( ::) ...

Hacerlo a veces es necesario en sistemas que se unen a IPv6 solo de forma predeterminada.

... y ahora, sospecho que aún más ...

No tiene ningún efecto en los sockets que no son IPv6, y se anula con la v6onlyopción.

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

Por lo tanto, parece que v4v6solo modifica las binddirectivas que especifican la dirección de escucha predeterminada de IPv6, que es ::(la tercera :es el separador entre la dirección y el puerto), y se ignora para los demás.

Michael - sqlbot
fuente
5

La respuesta aceptada no funciona para mí, al menos con haproxy-1.6.11p0 en OpenBSD. Además, TL; DR. Solo haz:

bind 0.0.0.0:80
bind :::80

y funcionará:

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