我发现另一个答案并查看了官方Docker ipv6 文档,但我仍然在使用 IPv6 和 Docker 时遇到问题。如果我在 Docker 容器上公开公共端口,我可以通过 IPv6 连接到它们。从容器内部,我可以 ping 到其他提供商的其他 IPv6 主机。但是,如果我尝试通过 IPv6(http、telnet、nc 等)建立 TCP 连接,它会超时并失败。
这是我的公共适配器:
2: ens3: <BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 56:00:01:46:4e:fe brd ff:ff:ff:ff:ff:ff
inet 45.32.64.134/23 brd 45.32.65.255 scope global ens3
valid_lft forever preferred_lft forever
inet6 2001:19f0:6001:1c12:5400:1ff:fe46:4efe/64 scope global mngtmpaddr dynamic
valid_lft 2591898sec preferred_lft 604698sec
inet6 2001:19f0:6001:1e43:5400:1ff:fe46:4efe/64 scope global mngtmpaddr dynamic
valid_lft 2591898sec preferred_lft 604698sec
inet6 fe80::5400:1ff:fe46:4efe/64 scope link
valid_lft forever preferred_lft forever
这2001:19f0:6001:1c12:/64
是我关心的(Vultr 允许您保留重建后仍可继续使用的 IPv6 地址,但出于某种原因,它也会为您提供另一个地址)。我daemon.json
像这样为 Docker 设置了我的:
{
"tls": true,
"tlsverify": true,
"tlscacert": "/etc/docker/ca.pem",
"tlscert": "/etc/docker/server.crt",
"tlskey": "/etc/docker/server-key.pem",
"ipv6": true,
"fixed-cidr-v6": "2001:19f0:6001:1c12::1/80",
"hosts": ["127.0.0.1:2376", "10.10.6.10:2376", "fd://"]
}
我的 ndppd 配置如下:
route-ttl 30000
proxy ens3 {
router yes
timeout 500
ttl 30000
rule 2001:19f0:6001:1c12::/64 {
static
}
}
我可以 ping6 成功:
docker exec -it mycontainer ping6 google.com
PING google.com (2607:f8b0:4007:80b::200e): 56 data bytes
64 bytes from 2607:f8b0:4007:80b::200e: seq=0 ttl=56 time=1.166 ms
64 bytes from 2607:f8b0:4007:80b::200e: seq=1 ttl=56 time=0.575 ms
64 bytes from 2607:f8b0:4007:80b::200e: seq=2 ttl=56 time=0.475 ms
^C
--- google.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.475/0.738/1.166 ms
..在 ndppd 运行之前我无法做到这一点,但我仍然无法通过 IPv6 出站连接:
docker run -it alpine ash -c "ip -6 addr show dev eth0; ip -6 route show"
191: eth0@if192: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 state UP
inet6 2001:19f0:6001:1c12::242:ac11:7/80 scope global flags 02
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:7/64 scope link tentative
valid_lft forever preferred_lft forever
2001:19f0:6001:1c12::/80 dev eth0 metric 256
fe80::/64 dev eth0 metric 256
default via 2001:19f0:6001:1c12::1 dev eth0 metric 1024
unreachable default dev lo metric -1 error -101
ff00::/8 dev eth0 metric 256
unreachable default dev lo metric -1 error -101
我错过了什么?
答案1
/etc/default/ufw
事实证明我基本走在正确的轨道上,我真正的问题出在防火墙上。如果您使用 UFW 设置 iptables 规则,则需要设置以下内容:
DEFAULT_FORWARD_POLICY="ACCEPT"
为了完整起见,Dockerdaemon.json
不需要::1
子网:
"fixed-cidr-v6": "2001:19f0:6001:1c12::/80"
..并且ndppd.conf
应该看起来像这样:
proxy ens3 {
timeout 500
ttl 30000
rule 2001:19f0:6001:1c12::/80 {
static
}
}