Powiązanie ze wszystkimi interfejsami dla IPv4 i IPv6 w haproxy

13

Chcę skonfigurować haproxy, aby łączył się tcpzarówno z tcp6gniazdem jak i gniazdem na wszystkich interfejsach (tj. 0.0.0.0:80I :::80).

Udało mi się osiągnąć ten cel przy użyciu następujących ustawień:

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

Czy jest jakaś krótsza droga?

Chociaż spodziewam się, że będzie się zachowywać inaczej, v4v6słowo kluczowe powoduje, że haproxy wiąże się tylko z gniazdem v4.

StephenKing
źródło
3
Co bind :::80 v4v6?
Michael - sqlbot
Właściwie to działa. Dzięki! Czy możesz podać ją jako odpowiedź, abym mógł Ci wyrazić uznanie?
StephenKing

Odpowiedzi:

25

Aby nasłuchiwać na tym samym porcie dla IPv6 i IPv4, użyj tego:

bind :::80 v4v6

Trzeba przyznać, że było to intuicyjne przypuszczenie, które wydaje się poprawne ... ale zamiast po prostu „zgadnąć” jako odpowiedź, mimo że działa, wydaje się, że powinienem to uzasadnić.

słowo kluczowe v4v6 powoduje, że haproxy wiąże się tylko z gniazdem v4.

Moją pierwszą intuicją było to, że to nie v4v6użycie, a raczej :80użycie w ogóle braku adresu IP, a jedynie numeru portu, powoduje, że gniazdo nasłuchuje tylko na IPv4.

Wydaje się to potwierdzone w dokumentacji dla bind:

addressjest opcjonalny i może być nazwą hosta, adresem IPv4, adresem IPv6 lub '*'. Określa adres, na którym nasłuchuje frontend. Jeśli nie jest ustawiony, wszystkie adresy IPv4 systemu będą nasłuchiwane. To samo dotyczy '*'specjalnego adresu systemu „ 0.0.0.0”. Odpowiednikiem IPv6 jest „::”.

http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#4.2-bind (wyróżnienie dodane)

Zatem następujące trzy formy są równoważne i wszystkie są interpretowane przez HAProxy jako IPv4:

bind :80
bind *:80
bind 0.0.0.0:80

Następnie w dokumentach znajduje się jedno zdanie, v4v6które można odczytać osobno, aby wskazać, v4v6że użyteczne może być rozszerzenie jednej z powyższych instrukcji wiązania w celu nasłuchiwania na IPv6 ...

v4v6

Służy do wiązania gniazda zarówno z IPv4, jak i IPv6, gdy używa adresu domyślnego.

... hmmm, ale podejrzewam, że to faktycznie oznacza "domyślny adres v6" ( ::) ...

Jest to czasem konieczne w systemach, które domyślnie wiążą się z IPv6.

... a teraz podejrzewam, że jeszcze bardziej ...

Nie ma to wpływu na gniazda inne niż IPv6 i jest zastępowane przez v6onlyopcję.

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

Wygląda więc na to, że v4v6modyfikuje tylko binddyrektywy, które określają domyślny adres nasłuchiwania IPv6, który jest ::(trzeci :to separator między adresem a portem) i jest ignorowany dla innych.

Michael - sqlbot
źródło
5

Przyjęta odpowiedź nie działa dla mnie, przynajmniej w przypadku haproxy-1.6.11p0 na OpenBSD. Również TL; DR. Po prostu zrób:

bind 0.0.0.0:80
bind :::80

i będzie działać:

# netstat -an|grep "*.80"
tcp          0      0  *.80                   *.*                    LISTEN
tcp6         0      0  *.80                   *.*                    LISTEN
foobar
źródło