Associare a tutte le interfacce per IPv4 e IPv6 in haproxy


13

Voglio configurare haproxy per associare a tcpcosì come tcp6socket su tutte le interfacce (cioè, 0.0.0.0:80e :::80).

Sono stato in grado di raggiungere questo obiettivo con le seguenti impostazioni:

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

C'è un modo più breve di questo?

Mentre mi aspetto che si comporti in modo diverso, la v4v6parola chiave fa legare il haproxy solo a un socket v4.


3
Che dire bind :::80 v4v6?
Michael - sqlbot

In realtà, funziona. Grazie! Puoi inviarlo come risposta, per favore, in modo che io possa darti credito?
StephenKing,

Risposte:


25

Per ascoltare sulla stessa porta per IPv6 e IPv4, utilizzare questo:

bind :::80 v4v6

Certo, questa era un'ipotesi intuitiva che sembra essere stata corretta ... ma piuttosto che pubblicare una supposizione "fortunata" come risposta, anche se funziona, sembra che dovrei giustificarla.

la parola chiave v4v6 fa associare haproxy solo a un socket v4.

La mia prima intuizione è stata che non è v4v6ma piuttosto l'uso di :80(o, più precisamente, l'uso di nessun indirizzo IP, solo un numero di porta) che fa sì che questo socket ascolti solo su IPv4.

Questo sembra essere confermato nei documenti per bind:

addressè facoltativo e può essere un nome host, un indirizzo IPv4, un indirizzo IPv6 o '*'. Indica l'indirizzo su cui il frontend ascolterà. Se non impostato, verranno ascoltati tutti gli indirizzi IPv4 del sistema. Lo stesso vale per '*'l'indirizzo speciale " 0.0.0.0" del sistema. L'equivalente IPv6 è '::'.

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

Quindi i tre moduli seguenti sono tutti equivalenti e sono tutti interpretati come IPv4 da HAProxy:

bind :80
bind *:80
bind 0.0.0.0:80

Successivamente, c'è una frase nei documenti per v4v6potrebbe essere letta in modo isolato per indicare che v4v6potrebbe essere utilizzabile per estendere una delle istruzioni di bind sopra per ascoltare su IPv6 ...

v4v6

Viene utilizzato per associare un socket a IPv4 e IPv6 quando utilizza l'indirizzo predefinito.

... hmmm, ma sospetto che ciò significhi in realtà "l'indirizzo predefinito v6" ( ::) ...

Ciò è talvolta necessario sui sistemi che si legano a IPv6 solo per impostazione predefinita.

... e ora lo sospetto ancora di più ...

Non ha alcun effetto sui socket non IPv6 ed è sovrascritto v6onlydall'opzione.

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

Quindi, sembra che v4v6modifichi solo le binddirettive che specificano l'indirizzo di ascolto predefinito IPv6, che è ::(il terzo :è il separatore tra l'indirizzo e la porta) e viene ignorato per gli altri.


5

La risposta accettata non funziona per me, almeno con haproxy-1.6.11p0 su OpenBSD. Inoltre, TL; DR. Basta fare:

bind 0.0.0.0:80
bind :::80

e funzionerà:

# netstat -an|grep "*.80"
tcp          0      0  *.80                   *.*                    LISTEN
tcp6         0      0  *.80                   *.*                    LISTEN
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.