设置 IPv6 ULA
之前 2025-11-27 > 允许外部通过容器名解析至 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