到IPv6本地主机的curl请求被卡住


9

我的docker容器在端口8500上暴露了HTTP接口,该端口映射到主机端口8500。启用IPv6。这仍然意味着,我应该能够在localhost:8500上访问它。首选IPv6,因此我最终请求了[:: 1]:8500。这个卡住了,再也回不来了。

用curl复制它,这个命令卡住了:

curl -g -6 "http://[::1]:8500"

curl的--verbose选项不会显示任何内容,--ascii-trace也不会显示任何内容。同时,对IPv4本地主机的请求成功:

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
您能告诉我们“ netstat -6 -an”的输出吗?
Rui F Ribeiro

是的,码头工人正在那个端口上监听:tcp6 0 0 :::8500 :::* LISTEN 1648/docker 令人着迷。为什么?为什么会阻塞?
mknecht 2015年

我想是监听且未配置,或在sysctl中禁用了IPv6。nginx,apache,lighthttp,请问您将有问题的Web服务器附加到帖子中吗?
Rui F Ribeiro 2015年

在容器内部,Consul(用于配置的键值存储)正在监听。但我认为这无关紧要:容器尚未启用IPv6。该请求永远不会到达领事。不过,我不知道它会卡在哪一层。在主机上,/proc/sys/net/ipv6/conf/all/disable_ipv6产生0,因此应启用IPv6。
mknecht

2
那并不重要。您甚至可以在sysctl和较新的内核中禁用IPv6,只要程序绑定到IPv6套接字,请求就会被兑现。麻烦的是,您必须遍历支持IPv6的每个守护程序并禁用IPv6配置。
Rui F Ribeiro 2015年

Answers:


0

启用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

1
显然,OP并没有试图使某些事情起作用。实际的问题是“为什么请求卡住了,怎么办?”。您的答案是否为此提供了解释?如果是这样,请您说明如何?
fra-san
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.