Die Curl-Anforderung an IPv6 localhost bleibt hängen


9

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?


1
Würden Sie uns die Ausgabe von "netstat -6 -an" zeigen?
— Rui F Ribeiro

Ja, Docker lauscht auf diesem Port: tcp6 0 0 :::8500 :::* LISTEN 1648/docker Faszinierend. Warum? Und warum blockiert es?
— mknecht

Abhören und nicht konfiguriert oder IPv6 in sysctl deaktiviert, denke ich. nginx, apache, lighthttp, würden Sie den fraglichen Webserver bitte an den Beitrag anhängen?
— Rui F Ribeiro

Im Container lauscht Consul, ein Schlüsselwertspeicher für die Konfiguration. Aber ich denke nicht, dass es relevant ist: Der Container war nicht IPv6-fähig. Diese Bitte sollte niemals den Konsul erreichen. Ich verstehe jedoch nicht, auf welcher Schicht es stecken bleibt. Auf dem Host /proc/sys/net/ipv6/conf/all/disable_ipv6ergibt sich 0, daher sollte IPv6 aktiviert sein.
— mknecht

2
Das bedeutet nicht viel. Sie können IPv6 auch in sysctl und in neueren Kerneln deaktivieren lassen, solange das Programm an einen IPv6-Socket gebunden ist, wird die Anforderung berücksichtigt. Ein Schmerz im Arsch, da Sie jeden Daemon durchlaufen müssen, der IPv6 unterstützt, und die IPv6-Konfiguration deaktivieren müssen.
— Rui F Ribeiro

Antworten:


0

Aktivieren Sie IPv6 und ebable Weiterleitung.

# cat /etc/sysctl.conf | grep ipv6
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.default.disable_ipv6=0

1
Anscheinend versucht das OP nicht, etwas zum Laufen zu bringen. Die eigentliche Frage lautet: "Warum bleibt die Anfrage hängen und macht was?". Gibt Ihre Antwort eine Erklärung dafür? Wenn ja, können Sie bitte klarstellen, wie?
— Fra-San
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.