为 Docker 容器分配公共 IPv6

为 Docker 容器分配公共 IPv6

我有一个 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 adocker0接口已分配了整个子网。

然后我使用 运行了一个容器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-v6Docker 守护程序中的值更改为私有范围 (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 命令,以免干扰目标地址位于子网内的流量。这对于我的用例来说不是必需的,所以我没有将其包含在答案中。

相关内容