У меня есть сборка gentoo с ipv6 и ipv4, настроенная для localhost
/ etc / hosts
# IPv4 and IPv6 localhost aliases
127.0.0.1 sunils-pc.homenetwork sunils-pc localhost
::1 sunils-pc.homenetwork sunils-pc localhost
Я включил пересылку ipv6, как показано ниже
sunils@sunils-pc ~ $ cat /proc/sys/net/ipv6/conf/all/forwarding
1
sunils@sunils-pc ~ $ cat /proc/sys/net/ipv4/conf/all/forwarding
1
Я запустил рой докеров с контейнером докеров, открывающим веб-сервер на 8080. Я могу получить доступ к веб-сайту, используя команду ниже
curl -4 http://localhost:8080/
Но когда я пытаюсь получить к нему доступ, используя curl http://localhost:8080/
висит бесконечно долго. Из подробных выходных данных он показывает, что пытается связаться с сервисом по адресу ipv4 и зависает на неопределенное время, не возвращаясь к ipv4.
sunils@sunils-pc ~ $ curl -v http://localhost:8080
* Rebuilt URL to: http://localhost:8080/
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.61.0
> Accept: */*
>
Я не уверен, что мне следует исследовать дальше. Я запускаю gentoo linux с ядром с поддержкой ipv6.
== Обновить
Когда я использую ipv4, я получаю правильный HTTP-ответ на терминале, но в случае ipv6 он зависает на неопределенный срок.
sunils@sunils-pc ~ $ curl -4 -v http://localhost:8080
* Rebuilt URL to: http://localhost:8080/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.61.0
> Accept: */*
>
< HTTP/1.1 200
< Set-Cookie: XSRF-TOKEN=e20b76f1-78c3-473c-a518-da2519983985; Path=/
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< Content-Type: text/html;charset=UTF-8
< Content-Language: en-US
< Transfer-Encoding: chunked
< Date: Wed, 26 Sep 2018 17:13:11 GMT
<
<!doctype html>
...
Похоже, что вы успешно подключаетесь к порту через ipv6, согласно следующему сообщению:
* Connected to localhost (::1) port 8080 (#0)
Поскольку соединение перешло в состояние ESTABLISHED, curl считает это успешным соединением с хостом IPv6, и это правильно.
Следующее, что происходит, это то, что клиент curl отправляет HTTP-запрос на localhost (:: 1) на порт 8080. Однако сервер никогда не отвечает ожидаемым документом.
На данный момент нет причин, по которым curl будет повторять попытку с IPv4, поскольку соединение было установлено с IPv6, однако сервер не отправил полезные данные HTTP.
Похоже, что проблема может заключаться в том, что сервер не привязан должным образом к порту IPv6, есть два экземпляра сервера, которые оба пытаются привязаться к порту 8080 IPv6, или другая проблема с сервером, привязанным к порту IPv6, который не реплицируется при использовании IPv4.