Warum bindet Google Computer Engine mein Programm an IPv6-Ports?

Warum bindet Google Computer Engine mein Programm an IPv6-Ports?

Ich schreibe einen Server, der an eine Reihe lokaler Ports (einschließlich 80und 443) gebunden ist. Wenn ich ihn auf Google Computer Engine (GCE) mit ihrem Container-Optimized OS (COS) und einem Docker-Container ausführe, werden die Ports an IPv6 und nicht an IPv4 gebunden.

$ netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 127.0.0.1:36265         0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp6       0      0 :::80                   :::*                    LISTEN
tcp6       0      0 :::443                  :::*                    LISTEN
udp        0      0 10.128.0.33:68          0.0.0.0:*

Dies ist ein wichtiger Unterschied, da mein Programm eine Logik enthält, die versucht, unter Verwendung der IPv4-Adresse von eine direkte Verbindung mit der lokalen Schnittstelle herzustellen 127.0.0.1.

Wie kann ich für meine GCE-Instanz die Verwendung eines IPv4-Ports festlegen?

Antwort1

Bearbeiten

Eine wichtige Anmerkung (wie in den Kommentaren erwähnt)- Obwohl die Bindung an eine Schnittstelle, die sowohl IPv4 als auch IPv6 verwendet, möglich ist, funktioniert das IPv6-Routing in der Google Cloud nicht (wird intern noch nicht unterstützt).


Es stellt sich also heraus, dass dies ein verwirrendes „Feature“ im Zusammenhang mit der Netzwerkverwaltung von Docker ist und dass es weiterhin sowohl IPv4- als auch IPv6-Verbindungen zulassen sollte.

Sehendiese StackOverflow-Antwortfür weitere Einzelheiten. Ich habe die Antwort unten für die Nachwelt zitiert:

...github.com/docker/docker/issues/2174geht es darum, nur die Bindung an IPv6 anzuzeigen netstat, aber das ist kein Problem. In diesem GitHub-Problem heißt es:

Beim Einrichten des Proxys fordert Docker die Loopback-Adresse „127.0.0.1“ an. Linux erkennt, dass dies eine Adresse ist, die in IPv6 existiert (als ::0) und öffnet sich auf beiden (aber es ist formal ein IPv6-Socket). Wenn Sie netstat ausführen, sieht es dies und sagt Ihnen, dass es sich um eine IPv6 handelt – aber es lauscht immer noch auf IPv4. Wenn Sie ein wenig mit Ihren Einstellungen herumgespielt haben, haben Sie diesen Trick von Linux möglicherweise deaktiviert – indem Sie net.ipv6.bindv6only = 1 setzen.

Mit anderen Worten: Nur weil Sie es als nur IPv6 sehen, kann es trotzdem über IPv4 kommunizieren, es sei denn, Sie haben IPv6 mit der Einstellung net.ipv6.bindv6only so eingestellt, dass es nur an IPv6 bindet. Um das klarzustellen: net.ipv6.bindv6only sollte 0 sein – Sie können es sysctl net.ipv6.bindv6onlyzur Überprüfung ausführen.

verwandte Informationen