Curl 不会回退到 ipv4

Curl 不会回退到 ipv4

我已经为 localhost 配置了 ipv6 和 ipv4 的 gentoo build

/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

我已经运行了docker swarm,docker容器在8080上公开了web服务器。我可以使用下面的命令访问网站

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: */*
> 

我不确定我应该在哪里进一步调查。我正在运行启用了 ipv6 内核的 gentoo linux。

==更新

当我使用 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>
...

答案1

根据以下消息,您似乎已成功通过 ipv6 连接到端口:

* Connected to localhost (::1) port 8080 (#0)

由于连接已经进入ESTABLISHED状态,所以curl认为这是一个成功连接到IPv6主机的连接,这是正确的。

接下来发生的事情是 curl 客户端将 HTTP 请求发送到端口 8080 上的 localhost(::1)。但是,服务器从未回复您期望的文档。

此时没有理由为什么 curl 会使用 IPv4 重试,因为连接是使用 IPv6 建立的,但是服务器没有发送 HTTP 有效负载。

看起来问题可能在于服务器没有正确绑定到 IPv6 端口,有两个正在运行的服务器实例都试图绑定到 IPv6 端口 8080,或者服务器绑定到 IPv6 端口的另一个问题在使用 IPv4 时不会复制。

相关内容