使主机仅使用 IPv6,并将其唯一的公共 IPv4 分配给 LXC 容器

使主机仅使用 IPv6,并将其唯一的公共 IPv4 分配给 LXC 容器

我有一台 Debian 10 服务器,它通过 DHCP 获取其 IPv4-v6,也可以将其配置为静态:

root@host:~# ifconfig
ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 45.76.XX.XX  netmask 255.255.254.0  broadcast 45.76.XX.255
        inet6 2001:19f0:XXXX:XXX:XXXX:XXX:XXXX:XXXX  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::5400:2ff:fecf:999b  prefixlen 64  scopeid 0x20<link>
        ether 56:00:XX:XX:XX:XX  txqueuelen 1000  (Ethernet)
        RX packets 113  bytes 14499 (14.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 114  bytes 12413 (12.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 24  bytes 1896 (1.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 24  bytes 1896 (1.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

我知道如何配置具有私有 IPv4 地址的 nat-ed LXC 实例。但在这个新系统中,我希望创建一个 LXC 实例,并为其分配主机的主要公共 IPv4 地址。这可能吗?当主机的 IPv4 被移除并分配给容器时,我可以使用其 IPv6 通过 SSH 进入主机。

提前感谢您的所有帮助。

答案1

如果您的 LXC 网络使用的是第 2 层模式(例如 bridge 或 macvlan),则很容易实现。这会将容器的命名空间与主机放在同一个第 2 层网络上,您可以以最明显的方式完成其余操作:从主机中删除 IP 地址并将其添加到容器中。(如果必须使用 DHCP 分配地址,则容器只需运行 DHCP 客户端即可。)

(然而这需要容器的本地网络的 DHCP 服务器需要知道 MAC 地址或 DHCP 客户端 ID。如果这是个问题,那么您可能需要为主机分配一个自定义 MAC 地址,并为容器提供主机的 MAC。)


例如,如果您想使用桥接模式,请首先创建一个标准 Linux 桥接器(本例中为命名br0),并将您的以太网接口作为成员。使其永久化非常依赖于发行版(使用 ifcfg 或 /etc/network/interfaces 或 systemd-networkd),但暂时的可以使用以下方式进行配置:

ip link add br0 type bridge
ip link set br0 up
ip link set ens3 master br0

注意:如果你只能远程访问主机服务器,那么最好使用 KVM 或串行控制台在进行此类更改时。

那么你的 LXC 配置可能如下所示:

lxc.net.1.type = veth
lxc.net.1.flags = up
lxc.net.1.link = br0
lxc.net.1.hwaddr = 02:00:xx:yy:zz:tt

如果需要静态 IP 配置:

lxc.net.1.ipv4.address = 45.76.XX.XX/23
lxc.net.1.ipv4.gateway = 45.76.YY.YY
lxc.net.1.ipv6.address = 2001:19f0:X:X:X:X:X:X/64
lxc.net.1.ipv6.gateway = 2001:19f0:X:X::1

如果您想使用 DHCP 和/或 SLAAC,那么只需忽略地址/网关设置并在容器上安装标准 DHCP 客户端。

一旦启动容器,ip link ls master br0就会bridge link显示第二个桥接端口。

注意:我听说 macvlan 模式提供了更好的性能,但我不知道如何配置它。另外,它似乎要求主机使用 macvlan 以便能够与其自己的客户进行通信。


如果你必须使用路由模式,仍然可以用大致相同的方式实现,但容器将不是能够使用 DHCP,并且主机还需要运行 Proxy-ARP 来假装 IP 地址仍然“在链接中”,尽管它被分配给了另一个系统。(路由器不会转发 ARP 请求。)如果 DHCP 是强制性的,那么主机可能需要特殊的 DHCP 客户端配置才能获取地址,而无需实际将其分配给接口。

相关内容