如何为 LXD 容器设置静态 IPv6 地址

如何为 LXD 容器设置静态 IPv6 地址

在 Ubuntu Xenial 主机上,我运行来自 xenial-backports 的 LXD 2.12。虽然从容器外部将容器的 ipv4 地址更改为静态地址很容易,但我无法更改其 ipv6 地址。正确的做法是什么?

我为 lxd 配置了一个 lxdbr0 桥接器,该桥接器支持 IPv4 和 IPv6。配置中的相关部分如下所示:

ipv4.address: 10.122.45.1/24
ipv4.nat: "true"
ipv6.address: fd42:7146:f400:1::1/64
ipv6.nat: "true"

在我用 Xenial(contxenial)启动容器后,它的 eth0 的 ifconfig 看起来像这样:

peter@led:~$ lxc exec contxenial -- ifconfig eth0
eth0 Link encap:Ethernet  HWaddr 00:16:3e:bc:f5:8d
     inet addr:10.122.45.223  Bcast:10.122.45.255  Mask:255.255.255.0
     inet6 addr: fd42:7146:f400:1:216:3eff:febc:f58d/64 Scope:Global
     inet6 addr: fe80::216:3eff:febc:f58d/64 Scope:Link
     :

现在我想使用以下命令将其 ipv4 和 ipv6 地址都更改为静态 ip 地址:

peter@led:~$ lxc network attach lxdbr0 contxenial eth0
peter@led:~$ lxc config device set contxenial eth0 ipv4.address 10.122.45.71
peter@led:~$ lxc config device set contxenial eth0 ipv6.address fd42:7146:f400:1::71

最后我重新启动了我的容器。

peter@led:~$ lxc restart contxenial

令我惊讶的是,IPv4 地址按预期发生了变化,但 IPv6 地址却没有改变!

peter@led:~$ lxc exec contxenial -- ifconfig eth0
eth0 Link encap:Ethernet  HWaddr 00:16:3e:bc:f5:8d
     inet addr:10.122.45.71  Bcast:10.122.45.255  Mask:255.255.255.0
     inet6 addr: fd42:7146:f400:1:216:3eff:febc:f58d/64 Scope:Global
     inet6 addr: fe80::216:3eff:febc:f58d/64 Scope:Link
     :

但是,dnsmasq.hosts 同时包含更改后的 IPv4 地址和更改后的 IPv6 地址。

peter@led:~$ sudo cat /var/lib/lxd/networks/lxdbr0/dnsmasq.hosts
00:16:3e:bc:f5:8d,id:*,10.122.45.71,[fd42:7146:f400:1::71],contxenial

这是怎么回事?我做错了吗?目前实现这一目标的正确方法是什么(自 LXC/LXD 2.3 或更高版本以来)?

答案1

我从 LXC/LXD 项目负责人 Stéphane Graber 那里得到了以下信息回答我的问题

静态 IPv6 分配只能在有状态 DHCP 模式下工作,否则将使用 SLAAC 来分配地址。

您可以使用以下方式启用有状态 DHCP:

lxc network set lxdbr0 ipv6.dhcp.stateful true

但请注意,没有 Linux 发行版默认支持 DHCPv6,因此您还需要更新容器的 /etc/network/interfaces(或基于发行版的类似文件)以实际执行 DHCPv6。

这是我在任何文档中都找不到的缺失部分。这也意味着无法像更改 IPv4 那样简单地从容器外部更改 IPv6 地址。

就我而言,我必须在容器内的 /etc/network/interfaces.d/50-cloud-init.cfg 中添加以下行。

iface eth0 inet6 dhcp

如果没有注释它看起来一定是这样的:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
iface eth0 inet6 dhcp

该文件从 /etc/network/interfaces 调用。在其他发行版上可能会有所不同。

最后,它应该在重新启动容器后工作(至少对我来说是这样的)。

我希望这也能帮助其他人。

相关内容