我已经为 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 时不会复制。