Назад | Перейти на главную страницу

Curl не возвращается к ipv4

У меня есть сборка 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.