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 {}
}
明明怎麼想都是 Ubuntu 的錯~
說的對
怎麼想都是systemd的錯。刮刮獎有禮物沒~
獎一個
上海電信依舊不支持IP6,話說多說不打算換么?
不知道換啥,換了個暢言的wp插件好像會爆炸