原文:https://zhuanlan.zhihu.com/p/342633966
作者:[@曾大仁](https://www.zhihu.com/people/omegazeng)
****
容器中开启 IPv6 的方式可能有很多,其中一种就是在容器中分配公网 IPv6 地址,但是这样做就把容器中的端口全暴露到了公网中,用ip6tables 也不好管理,不安全。建议使用 IPv6 NAT 的方式。
IPv6 NAT 就是在容器中分配一个私有的 IPv6 地址,这和目前常用的 IPv4 桥接模式没有区别。
开启 IPv6 有什么好处,说下我的使用场景:
最近在树莓派(Ubuntu 20.04.1 LTS)中部署了aria2 进行 BT 下载(使用容器部署),但是没有真实的 IPv4 公网地址(因为是长沙移动的宽带), 如果开启 IPv6 , 就可以和其他的 IPv6 用户直接通讯了,理论上寻找资源和下载速度会提高。
# 开始之前:
**宿主机已经有 IPv6 地址**了, (如果没有请先确认你的运营商是否支持,请自行网上冲浪找答案。)
![a03b89d1cc744bf196372d6d51a1c2f9.jpg](https://ppmm.org/images/2021/12/29/a03b89d1cc744bf196372d6d51a1c2f9.jpg)
使用 `ifconfig` 查看, `inet6` 为 `global` 的 IP 就是 IPv6 地址
![3ec924c399058f0450074df8593366db.png](https://ppmm.org/images/2021/12/29/3ec924c399058f0450074df8593366db.png)
**Docker Engine 的版本大于等于 `20.10.2`**,因为这个版本才开始支持 `ip6tables`。(如果小于这个版本,就要用第三方的工具管理 `ip6tables` 的 `nat` 规则:[docker-ipv6nat](https://github.com/robbertkl/docker-ipv6nat) )
****
注意⚠️: 如果Docker Engine 的版本小于 `20.10.2`,临时的解决方法是执行以下命令:(但**不建议**,因为此配置不会在重启后保留)
```
ip6tables -t nat -A POSTROUTING -s fd00::/80 ! -o docker0 -j MASQUERADE
```
****
# 正式开始:
1. 编辑 `/etc/docker/daemon.json` ,加上以下内容。(如果没有这个文件直接创建。)
```
{
"ipv6": true,
"fixed-cidr-v6": "fd00::/80",
"experimental": true,
"ip6tables": true
}
```
2. 重启 Docker Engine
```
sudo systemctl restart docker
```
3. 测试
```
sudo docker run --rm -it busybox ping -6 -c4 ipv6-test.com
sudo docker run --rm -it busybox ifconfig
```
![4a773629380dc99a5e4060bb09464eb8.jpg](https://ppmm.org/images/2021/12/29/4a773629380dc99a5e4060bb09464eb8.jpg)
能 ping 通 IPv6 的公网地址了。容器中的 `eth0` 也有 `fd00::/80` 段的地址。完成!
下面给一个我在用的 aria2 的 `docker-compose.yaml`
```
version: "3"
services:
aria2:
image: hurlenko/aria2-ariang
hostname: aria2
restart: always
ports:
- 127.0.0.1:6800:8080
- 56999:56999
- 56999:56999/udp
volumes:
- /mnt/md0/aria2:/aria2/data
- /etc/aria2:/aria2/conf
environment:
- TZ=Asia/Shanghai
- PUID=1000
- PGID=1000
- RPC_SECRET=YOUR_RPC_SECRET
- DOMAIN=0.0.0.0:8080
- ARIA2RPCPORT=443
network_mode: bridge
```