Docker IPV6 NAT
資深大佬 : qq296015668 6
最接在做容器化的 IPV6,发现一些小伙伴跟我一样根据官方文档配置后,容器里面根本无法与外部通信
注意:我们只讨论 IPV6 NAT 的实现,容器需要真实的外网 IPV6 不在此范围
Docker
- 官方文档地址: Enable IPv6 support
vi /etc/docker/daemon.json
{ "ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64" # 这里的 "fixed-cidr-v6": "2001:db8:1::/64" 只是容器内部使用的 ipv6 地址,选一个常用不与现有网络冲突的网段即可(不知道如何设置保持默认也行) }
systemctl reload docker
官方文档到这里就结束了,这样设置后,容器确实可以获取到 ipv6 的地址了,但是除了宿主之外的 ipv6 均无法正常访问,这是因为 ip6tables 规则缺失,不知道为什么 Docker 没有自动生成 NAT 规则
ip6tables -t nat -A POSTROUTING -s 2001:db8:1::/64 -j MASQUERADE
-
这里的
2001:db8:1::/64是/etc/docker/daemon.json定义的fixed-cidr-v6地址 -
到这里就可以正常在容器里面使用宿主的网络权限访问局域网或者外网的 ipv6 地址了
Docker-Compose
如果是 docker-compose, 可以不修改 /etc/docker/daemon.json, 直接使用 yml 定义
cat docker-compose-network.yml
version: '2.2' networks: net: driver: bridge enable_ipv6: true ipam: driver: default config: - subnet: 172.18.0.0/16 - subnet: 2001:db8:10::/64
ip6tables -t nat -A POSTROUTING -s 2001:db8:10::/64 -j MASQUERADE
大佬有話說 (1)