Ein Docker-Container von mir stellt eine HTTP-Schnittstelle an Port 8500 bereit, die dem Host-Port 8500 zugeordnet ist. Sie ist nicht IPv6-fähig. Dies bedeutet immer noch, dass ich unter localhost: 8500 darauf zugreifen kann. IPv6 wird bevorzugt, daher erhalte ich eine Anfrage an [:: 1]: 8500. Dieser bleibt stecken, er kehrt nie zurück.
Wenn Sie dies mit Curl reproduzieren, bleibt dieser Befehl hängen:
curl -g -6 "http://[::1]:8500"
Die Option --verbose von curl enthüllt nichts und --ascii-trace auch nicht. Gleichzeitig ist eine Anforderung an den lokalen Host von IPv4 erfolgreich:
curl http://127.0.0.1:8500
gib mir den erwarteten HTML. Wenn ich einen IPv4-HTTP-Server im Loopback verwende, verwenden Sie
python -m SimpleHTTPServer 4001
dann bekomme ich viel HTML für IPv4s localhost
curl http://127.1:4001
und ein ordnungsgemäßer Verbindungsfehler für IPv6:
curl -g -6 "http://[::1]:4001"
curl: (7) Failed to connect to ::1 port 4001: Connection refused
Dinge zu beachten: Docker 1.7.1. IPv6 ist für den Container nicht aktiviert, daher gibt es keine IPv6-Iptable-Regeln. (ip6tables -v -L gibt nichts)
Meine Frage ist: Warum bleibt die Anfrage hängen und macht was?
tcp6 0 0 :::8500 :::* LISTEN 1648/docker
Faszinierend. Warum? Und warum blockiert es?
/proc/sys/net/ipv6/conf/all/disable_ipv6
ergibt sich 0, daher sollte IPv6 aktiviert sein.