我有一个 IPv6 地址,在本例中2603:c021:4004:7400:4bc5:c726:7f5a:1c31
位于子网 2603:c021:4004:7400::/56 中。
我想将该 IP 地址分配给 Docker 容器,以便从该容器内部发出请求时,接收者将看到上面列出的 IP。
我只需要传出请求即可运行,不需要传入请求。
我尝试通过以下方式启用 IPv6
"ipv6": true,
"fixed-cidr-v6": "2603:c021:4004:7400::/56"
在 Docker 守护进程配置文件中。
重新启动 Docker 后,我可以看到ip -br a
该docker0
接口已分配了整个子网。
然后我使用 运行了一个容器sudo docker run -it --ip6 2603:c021:4004:7400:4bc5:c726:7f5a:1c31 ubuntu
。
在容器内部,可以 ping 并与公共 IPv4 主机通信,但不能与公共 IPv6 主机通信。
我还通过运行将相同的 IPv6 地址添加到我的主机sudo ip addr add 2603:c021:4004:7400:4bc5:c726:7f5a:1c31 dev enp0s3
,这样我就可以从单独的网络使用该 IP ping 我的主机。
答案1
我已经设法使用类似 NAT 的系统来完成此操作。
首先,我将 IPv6 地址添加到我的主机
ip addr add 2603:c021:4004:7400:4bc5:c726:7f5a:1c31 dev eth0
然后,在我的情况下,我将fixed-cidr-v6
Docker 守护程序中的值更改为私有范围 (fc00::/7) 中的 /64 CIDR fd2c:03f8:9028:5037::/64
。
接下来,我运行一个 Docker 容器,为其提供静态 IPv6 fd2c:3f8:9028:5037:0:242:ac11:3
。
docker run --ip6="fd2c:3f8:9028:5037:0:242:ac11:3" -it --rm ubuntu
然后我ip6tables
将流量路由到正确的 IP
ip6tables -t nat -I POSTROUTING -p all -s fd2c:3f8:9028:5037:0:242:ac11:3 -j SNAT --to-source 2603:c021:4004:7400:4bc5:c726:7f5a:1c31
瞧!在容器中安装 curl 并 curl 一个 IPv6 测试网站后,请求显示来自正确的 IP。
请注意,如果需要容器间通信,则必须修改 ip6tables 命令,以免干扰目标地址位于子网内的流量。这对于我的用例来说不是必需的,所以我没有将其包含在答案中。