Зависает запрос к IPv6 localhost


9

Мой контейнер Docker предоставляет HTTP-интерфейс для порта 8500, который сопоставлен с портом хоста 8500. Он не поддерживает IPv6. Это по-прежнему означает, что я должен иметь доступ к нему на локальном хосте: 8500. IPv6 предпочтительнее, поэтому я получаю запрос к [:: 1]: 8500. Этот застревает, он никогда не возвращается.

Воспроизводя это с помощью curl, эта команда застревает:

curl -g -6 "http://[::1]:8500"

Опция curl --verbose ничего не показывает, равно как и --ascii-trace. В то же время запрос к локальному хосту IPv4 завершается успешно:

curl http://127.0.0.1:8500

давая мне ожидаемый HTML. Если я запускаю HTTP-сервер IPv4 по шлейфу, используя

python -m SimpleHTTPServer 4001

тогда я получаю много HTML для локального хоста IPv4

curl http://127.1:4001

и правильный сбой соединения для IPv6:

curl -g -6 "http://[::1]:4001"
curl: (7) Failed to connect to ::1 port 4001: Connection refused

Что следует отметить: Docker 1.7.1. IPv6 не включен для контейнера, поэтому нет никаких допустимых правил IPv6. (ip6tables -v -L ничего не дает)

У меня вопрос: почему запрос застревает и что делает?


1
Не могли бы вы показать нам вывод "netstat -6 -an"?
Руи Ф. Рибейро

Да, докер прослушивает этот порт: tcp6 0 0 :::8500 :::* LISTEN 1648/docker завораживающе. Почему? И почему это блокирует?
mknecht

Прослушивание и не настроено, или IPv6 отключен в sysctl, я думаю. nginx, apache, lighthttp, не могли бы вы добавить веб-сервер, о котором идет речь, к сообщению, пожалуйста?
Руи Ф Рибейро

Внутри контейнера Consul, хранилище ключей для конфигурации, слушает. Но я не думаю, что это актуально: контейнер не поддерживает IPv6. Эта просьба никогда не должна доходить до Консула. Я не понимаю, на каком слое он застревает. На хосте /proc/sys/net/ipv6/conf/all/disable_ipv6выдает 0, поэтому IPv6 должен быть включен.
mknecht

2
Это не много значит. Вы можете отключить IPv6 даже в sysctl и в более новых ядрах, если программа привязана к сокету IPv6, запрос выполняется. Боль в заднице, так как вы должны пройти через каждого демона, который поддерживает IPv6 и отключить конфигурацию IPv6.
Руи Ф Рибейро

Ответы:


0

Включить ipv6 и пересылку ebable.

# 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
Очевидно, ОП не пытается заставить что-то работать; на самом деле вопрос «почему запрос застревает и что делает?». Ваш ответ дает объяснение этому? Если да, не могли бы вы уточнить, как?
фра-сан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.