Vincula a todas as interfaces para IPv4 e IPv6 no haproxy

9

Eu quero configurar haproxy para vincular a um soquete tcp , bem como tcp6 em todas as interfaces ( ou seja, 0.0.0.0:80 e :::80 ).

Consegui alcançar esse objetivo com as seguintes configurações:

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

Existe algum caminho mais curto que isso?

Embora eu espere que ele se comporte de maneira diferente, a palavra-chave v4v6 faz com que o haproxy se vincule apenas a um soquete da v4.

    
por StephenKing 09.01.2016 / 19:32

2 respostas

17

Para escutar na mesma porta para IPv6 e IPv4, use isto:

bind :::80 v4v6

Evidentemente, este foi um palpite intuitivo que parece ter sido correto ... mas em vez de apenas postular um palpite "sortudo" como resposta, mesmo que funcione, parece que eu deveria justificá-lo.

the v4v6 keyword makes haproxy bind to a v4 socket only.

Minha primeira intuição foi que não é v4v6 , mas o uso de :80 (ou, mais precisamente, o uso de nenhum endereço IP, apenas um número de porta) que faz com que esse soquete ouça apenas IPv4 .

Isso parece ser confirmado nos documentos para bind :

address is optional and can be a host name, an IPv4 address, an IPv6 address, or '*'. It designates the address the frontend will listen on. If unset, all IPv4 addresses of the system will be-listened on. The same will apply for '*' or the system's special address "0.0.0.0". The IPv6 equivalent is '::'.

http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#4.2-bind (emphasis added)

Portanto, as três formas a seguir são todas equivalentes e são interpretadas como sendo IPv4 pelo HAProxy:

bind :80
bind *:80
bind 0.0.0.0:80

Em seguida, há uma frase nos documentos para v4v6 que pode ser lida isoladamente para indicar que v4v6 pode ser usado para estender uma das declarações de ligação acima para ouvir em IPv6 ...

v4v6

It is used to bind a socket to both IPv4 and IPv6 when it uses the default address.

... hmmm, mas eu suspeito que isso realmente significa "o endereço padrão da v6" ( :: ) ...

Doing so is sometimes necessary on systems which bind to IPv6 only by default.

... e agora, eu suspeito ainda mais ...

It has no effect on non-IPv6 sockets, and is overridden by the v6only option.

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

Portanto, parece que v4v6 modifica apenas bind diretivas que especificam o endereço de escuta padrão do IPv6, que é :: (o terceiro : é o separador entre o endereço e a porta) e é ignorado para os outros.

    
por 10.01.2016 / 14:08
2

A resposta aceita não funciona para mim, pelo menos com o haproxy-1.6.11p0 no OpenBSD. Além disso, TL; DR. Apenas faça:

bind 0.0.0.0:80
bind :::80

e funcionará:

# netstat -an|grep "*.80"
tcp          0      0  *.80                   *.*                    LISTEN
tcp6         0      0  *.80                   *.*                    LISTEN
    
por 28.09.2017 / 06:37

Tags