OVH的机器默认给的是/128,但是其实整个/64都是可以用的,如果添加到网卡上是可以双向ping通的。
但是如果docker的bridge网络分配了一个IPv6,却无法ping通。喝了一瓶果汁之后我发现是因为没有向(OVH的)路由器发邻居发现协议包(NDP)。
辛酸历程
配置docker使用IPv6
参考docker官方文档,给dockerd的启动参数增加
–ipv6 –fixed-cidr-v6=aaaa:bbbb:cccc:dddd:1::/80
需要注意的是如果是Ubuntu用户,并且docker是从很早的版本(Ubuntu 16.04 LTS发布以前)一路升级上来的话,你可能去会更改/etc/default/docker。然而systemd并不会自动读取/etc/default/docker(见这个issue)。怎么想都是systemd的错。所以要么在/lib/systemd/system/docker.service中增加
1 2 |
EnvironmentFile=-/etc/default/docker ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS |
或者可以新建/etc/docker/daemon.json,填入:
1 2 3 4 |
{ "ipv6": true, "fixed-cidr-v6": "aaaa:bbbb:cccc:dddd:1::/80" } |
推荐后一种方式。
配置内核转发IPv6
参考docker官方文档,配置内核转发IPv6包,运行:
1 2 |
sysctl net.ipv6.conf.default.forwarding=1 sysctl net.ipv6.conf.all.forwarding=1 |
OVH不是用Router Advertisement来获得IPv6地址的,所以不需要配置net.ipv6.conf.eth0.accept_ra
配置内核转发NDP
其实就是为了告诉OVH的路由器,这个IPv6地址的包请让我来处理。
运行:
1 |
sysctl net.ipv6.conf.eth0.proxy_ndp=1 |
然后设置转发NDP,其中IP是容器的IPv6地址:
1 |
ip -6 neigh add proxy aaaa:bbbb:cccc:dddd:1::xxxx dev eth0 |
你一定觉得每个容器都要发一遍很烦吧,可以:
- 事先配置为aaaa:bbbb:cccc:dddd:1:242:ac11:0 – aaaa:bbbb:cccc:dddd:1:242:ac11:ffff发NDP。因为docker默认使用MAC地址来配置IPv6,根据这个文档,docker会使用的MAC为02:42:ac:11:00:00到02:42:ac:11:ff:ff。
- 安装ndppd,配置/etc/ndppd.conf,填写
proxy eth0 {
rule aaaa:bbbb:cccc:dddd:1::/80 {}
}