现在有些时候会用到IPv6,我在成都的一台NAT机的IPv4在出国时会遇到问题,但是使用IPv6发现就没这个问题。同时我发邮件让Racknerd给我开通IPv6,RN很豪爽地直接给我/64子网,真的太爽了。

Docker启动IPv6支持

编辑 /etc/docker/daemon.json docker守护进程配置文件。

1
2
3
4
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
}

替换 fixed-cidr-v6 字段为VPS所拥有的IPv6子网。

可以通过 ip a 命令获取:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@lite:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
altname enp0s18
altname ens18
inet 172.16.1.32/24 brd 172.16.1.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::200:1ff:febe:2acf/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
altname enp0s19
altname ens19
inet6 240e:974:xxxx:xxxx::5064:2a/118 scope global
valid_lft forever preferred_lft forever
inet6 fe80::200:1ff:fed0:3b1b/64 scope link
valid_lft forever preferred_lft forever

这里 eth1inet6 240e:974:xxxx:xxxx::5064:2a/118 scope global 就是公网IPv6。给了 /118 子网但是也够了,总共 $2^{128 - 118} = 2^{10} = 1024$ 个地址。

配置完成 /etc/docker/daemon.json 后运行:

1
sudo systemctl restart docker

可以这样给容器分配v6地址:

1
docker run -d --name my_container --network bridge --ipv6 "240e:974:xxx:xxx::5064:2b" my_image

确保分配的地址唯一且不与主机地址重复。
防火墙也需要通过IPv6地址的连接。

如果是OpenRestyNginx,记得加 listen [::]:80;