设置 IPv6 ULA
之前 允许外部通过容器名解析至 Docker 解析得到的 IPv6 地址不是 GUA 而是 ULA,并且是 Docker Network 指定的一组 ULA。当时我没指定,Docker 便默认生成了一组。
这个 ULA 如果不加静态路由,从主机外是无从得知这条路由方向的。
我也希望局域网内有可预测的静态地址,所以在 LAN 侧设一套 ULA 很有必要。
倒也不难,在主路由的 LAN 网卡上配置一个 ULA 地址,网络中设备自动就能 SLAAC 到地址,实现互相访问,连路由表都不用动。
ip -6 addr replace fd00:2022:22ea:2677::1/64 dev br0那么在 Docker 中,创建网络的命令也要改改了,加上 IPv6 段的 subnet 等信息。
这里不设置 ISP 给到的 GUA 前缀也是考虑到这前缀随时会变,一天一个样。
docker network create -d macvlan --ipv6 \
--subnet 192.168.2.0/24 --gateway 192.168.2.1 \
--ip-range 192.168.2.128/25 \
--subnet fd00:2022:22ea:2677::/64 --gateway fd00:2022:22ea:2677::1 \
--ip-range fd00:2022:22ea:2677:d::/80 \
-o parent=ens19 docker我这还多一步,这个网络仍然在使用中,所以先 docker network disconnect 把容器解绑就能删除了。
最终效果
$ dig coredns.docker
NAME TYPE CLASS TTL ADDRESS NAMESERVER TIME TAKEN
coredns.docker. A IN 600s 192.168.2.53 [fd00:2022:22ea:2677::1]:53 5ms
coredns.docker. AAAA IN 600s fd00:2022:22ea:2677:d:: [fd00:2022:22ea:2677::1]:53 5ms
$ ping coredns.docker. -6
正在 Ping coredns.docker [fd00:2022:22ea:2677:d::] 具有 32 字节的数据:
来自 fd00:2022:22ea:2677:d:: 的回复: 时间=852ms
来自 fd00:2022:22ea:2677:d:: 的回复: 时间<1ms
来自 fd00:2022:22ea:2677:d:: 的回复: 时间<1ms
来自 fd00:2022:22ea:2677:d:: 的回复: 时间<1ms
fd00:2022:22ea:2677:d:: 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 852ms,平均 = 213ms