我的一个 docker 容器在端口 8500 上公开了一个 HTTP 接口,该接口映射到主机端口 8500。不是已启用 IPv6。这仍然意味着,我应该能够在 localhost:8500 访问它。 IPv6 是首选,因此我最终向 [::1]:8500 发出请求。这个被卡住了,再也不会回来了。
使用curl 复制此命令,此命令会卡住:
curl -g -6 "http://[::1]:8500"
curl 的 --verbose 选项没有显示任何内容,--ascii-trace 也没有显示任何内容。同时,向 IPv4 的 localhost 请求成功:
curl http://127.0.0.1:8500
给我预期的 HTML。如果我在环回上运行 IPv4 HTTP 服务器,使用
python -m SimpleHTTPServer 4001
然后我得到很多 IPv4 本地主机的 HTML
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 iptable 规则。 (ip6tables -v -L 什么也没给出)
我的问题是:为什么请求会被卡住,该怎么办?
答案1
启用 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
答案2
如果未启用 IPV6 转发,数据包就会被丢弃。因此,curl 一直在等待服务器的响应,但实际上却得不到任何响应。一段时间后它应该超时。
您可以通过设置防火墙来复制此内容,例如超细纤维束。只需使用防火墙阻止对某些端口的访问,然后尝试访问它们,curl 就会等到超时。此外,IP 版本与此没有任何具体关系。