我有一个 IPv6 本机容器在端口 8000 上运行一个小型 web 应用程序。
在 Docker 主机上,我可以使用全局 IP 访问 Web 服务,但从另一台主机连接时会收到“连接被拒绝”信息。但是,可以从另一台主机 ping 通容器。
容器内的服务运行
# curl "http://[2a01:4f8:10a:2cc5:0:242:ac11:2]:8000"
I'm b6032b33bc12
但是,从另一台主机运行:
{2.1.5p273} curl "http://[2a01:4f8:10a:2cc5:0:242:ac11:2]:8000"
curl: (7) Failed to connect to 2a01:4f8:10a:2cc5:0:242:ac11:2 port 8000: Connection refused
然而,ipv6 地址是可以 ping 通的:
{2.1.5p273} ping6 2a01:4f8:10a:2cc5:0:242:ac11:2
PING 2a01:4f8:10a:2cc5:0:242:ac11:2(2a01:4f8:10a:2cc5:0:242:ac11:2) 56 data bytes
64 bytes from 2a01:4f8:10a:2cc5:0:242:ac11:2: icmp_seq=1 ttl=60 time=0.385 ms
64 bytes from 2a01:4f8:10a:2cc5:0:242:ac11:2: icmp_seq=2 ttl=60 time=0.452 ms
我错过了什么?
有关我的环境的更多详细信息:
# docker -
Docker version 17.03.1-ce, build c6d412e
守护进程使用以下参数来启用 ipv6:
--experimental=true --ipv6 --fixed-cidr-v6=2a01:4f8:10a:2cc5::2/64
主机具有路由的 ipv6/64
子网,其中 有一个 IP 分配给eth0
,其余子网在docker0
。
# ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:c8:f8:5c:7b
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::1/64 Scope:Link
inet6 addr: fe80::42:c8ff:fef8:5c7b/64 Scope:Link
inet6 addr: 2a01:4f8:10a:2cc5::1/64 Scope:Global
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:129 errors:0 dropped:0 overruns:0 frame:0
TX packets:121 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:9536 (9.3 KiB) TX bytes:11130 (10.8 KiB)
eth0 Link encap:Ethernet HWaddr 90:1b:0e:c4:3d:a1
inet addr:88.99.148.135 Bcast:88.99.148.191 Mask:255.255.255.192
inet6 addr: fe80::921b:eff:fec4:3da1/64 Scope:Link
inet6 addr: 2a01:4f8:10a:2cc5::2/128 Scope:Global
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:107917 errors:0 dropped:0 overruns:0 frame:0
TX packets:25223 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:143498170 (136.8 MiB) TX bytes:2953043 (2.8 MiB)
Interrupt:16 Memory:f7000000-f7020000
该容器有一个全局 ipv6
docker exec b6032b33bc12 ifconfig eth0
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
inet6 addr: 2a01:4f8:10a:2cc5:0:242:ac11:2/64 Scope:Global
IPv6 路由已到位,并且似乎可以正常工作:
# ip -6 route
2a01:4f8:10a:2cc5::2 dev eth0 proto kernel metric 256
2a01:4f8:10a:2cc5::/64 dev docker0 proto kernel metric 256
2a01:4f8:10a:2cc5::/64 dev docker0 metric 1024
fe80::/64 dev eth0 proto kernel metric 256
fe80::/64 dev docker0 proto kernel metric 256
fe80::/64 dev veth0fbfa39 proto kernel metric 256
default via fe80::1 dev eth0 metric 1024
主机具有出站连接:
# ping6 google.com
PING google.com(fra16s20-in-x0e.1e100.net) 56 data bytes
64 bytes from fra16s20-in-x0e.1e100.net: icmp_seq=1 ttl=56 time=5.08 ms
容器也是如此
# docker exec b6032b33bc12 ping6 google.com
PING google.com(fra16s20-in-x0e.1e100.net) 56 data bytes
64 bytes from fra16s20-in-x0e.1e100.net: icmp_seq=1 ttl=55 time=5.00 ms
64 bytes from fra16s20-in-x0e.1e100.net: icmp_seq=2 ttl=55 time=5.00 ms
我怀疑存在 iptables 问题:
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
DOCKER-ISOLATION all -- anywhere anywhere
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (1 references)
target prot opt source destination
ACCEPT tcp -- anywhere 172.17.0.2 tcp dpt:8000
Chain DOCKER-ISOLATION (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
ipv6 等效版本:
# ip6tables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
答案1
查看您的整个配置,我没有发现任何问题。
我使用过的 Hetzner 产品都只带有链接前缀,没有路由前缀。但我尝试mtr
从 Hetzner 网络之外的机器上获取,结果输出看起来2a01:4f8:10a:2cc5::/64
确实是一个路由前缀。
从您的路由前缀中分配单个地址eth0
有点不寻常。但由于您确实将其分配为,因此这/128
仍然是一个有效的配置。如果您的服务器仅带有路由前缀而没有链接前缀,那么/128
以这种方式分配是合理的配置。
由于我在您的配置中找不到任何问题,因此我尝试从我的机器上重现该问题,但是却失败了。
$ curl "http://[2a01:4f8:10a:2cc5:0:242:ac11:2]:8000"
I'm b6032b33bc12
这使我得出结论,问题可能出在您运行该curl
命令的机器上(或它所连接的网络上)。
由于您没有告诉我们有关该机器的任何信息,因此我无法更具体地说明问题是什么。您可以尝试比较以下两个命令的输出:
traceroute 2a01:4f8:10a:2cc5:0:242:ac11:2
traceroute -p 8000 2a01:4f8:10a:2cc5:0:242:ac11:2
这里我使用的是traceroute
Ubuntu 16.04 上的软件包。其他traceroute
版本可能需要不同的参数。