如何在不同的命名空间中创建可访问的 macvlan 别名?

如何在不同的命名空间中创建可访问的 macvlan 别名?

我有

  • eth0我的主网络命名空间中的接口 name
  • 另一个接口 namejail0位于备用网络命名空间 (name name0) 中。该命名空间由监狱环境使用。
  • jail0是一个macvlan 别名eth0

我从我的主系统和我的监狱中都看到网络没有任何问题。

然而,我无法互相 ping 通

为什么会这样呢?我想让他们能够接触到。

任何网络接口都不存在于其他网络接口的命名空间中。

答案1

要完成接受的答案,桥接模式是最简单的方法,但不足以进行通信。

当监狱实例尝试 ping 主机时,它会发送 ARP 请求以获取其 IP。由于主机没有 macvlan 实例,因此数据包将直接在物理链路上传输(桥接模式定义的推论)。主机永远不会看到此数据包,因此无法应答:无 ping 应答。另一种方式是相同的:主机将其所有数据包发送到真实的物理 LAN,没有主机的数据包将进入容器(监狱...)的 macvlan 接口。

诀窍是创建第二个 macvlan 接口,同样处于桥接模式,用于主机:这会将主机与容器/监狱的流量集成。

host# ip link add link eth0 name hostmvl0 type macvlan mode bridge

那么有两种方法:

  • 两个接口上的IP相同

    pro:没有更改 eth0 或其设置,因此主机的 DHCP 没有问题。
    缺点:有些复杂,不能让广播无处不在。

    为其分配主机的IP(与eth0相同),没有默认 LAN 路由( noprefixroute) 否则这可能会混淆整个主机的路由:

    host# ip addr add hostip/netmask dev hostmvl0 noprefixroute
    host# ip link set hostmvl0 up
    

    对于每个容器(监狱...),通过主机的 macvlan 接口而不是真实的接口添加其路由:

    host# ip route add jailip/32 dev hostmvl0
    

    现在一切都会正常工作(除了容器/监狱看不到来自主机的广播(ping,udp ...),因为它将在 eth0 上路由)。

    注意:新接口会获得一个随机 MAC 地址。可以在创建时额外设置它address xx:xx:xx:xx:xx:xx,但它不能是真实的(eth0 的)MAC 地址。只有监狱才会看到这个 MAC 地址。

  • 主机 macvlan 接口上的 IP,物理接口没有 IP

    优点:网络配置更常用,没有特殊情况(例如:主机的广播在任何地方都有效),每个容器没有额外的路由设置。
    con:需要删除 eth0 的网络设置并将其迁移到 hostmvl0。 MAC 地址将会改变(除非采取其他一些黑客措施来阻止它),因此可能会影响 DHCP 客户端。

    正如 sebasth 所建议的,可以简单地从 eth0 中删除 IP,并将新的“主”网卡视为 hostmvl0。当然,如果有某些服务管理此操作,请在那里进行更改。最好始终设置相同的 MAC 地址,否则每次重新启动时它都会在网络上发生变化,这在商业环境中是不受欢迎的。

    host# ip addr del hostip/netmask dev eth0 #careful, connectivity is lost
    host# ip link set hostmvl0 address xx:xx:xx:xx:xx:xx
    host# ip addr add hostip/netmask dev hostmvl0
    host# ip link set hostmvl0 up
    host# ip route add default via usualrouterip
    

    如果使用 DHCP,则 MAC 已更改,IP 也会更改。人们可以更改 eth0 的 MAC,以便能够将其原始 MAC 重新用于 hostmvl0。完成此操作后,某些工具有时会过于智能。这个 Archlinux 讨论可能有有关如何防止 NetworkManager 恢复设置的信息。

答案2

macvlan接口可以在不同的模式下使用,这会改变两个 macvlan 实例之间传输的数据的处理方式。默认模式是vepa(虚拟以太网端口聚合),这可能就是您的设置不起作用的原因。

您可能想要配置的常见模式的简短描述:

  • vepa数据通过物理接口传输,交换机需要支持macvlan实例之间的通信发夹模式或者必须有一个IP路由器转发数据包。

  • private即使外部交换机支持发夹模式,也不允许 macvlan 实例之间进行通信。

  • bridge允许实例之间直接通信,macvlan 实例之间的流量不在物理链路上传输。

您可能想在以下位置使用 macvlan桥接模式。对于 macvlan 实例和包含网络接口本身的命名空间之间的通信,您需要在同一(主/主机)网络命名空间中创建 macvlan 实例。详细信息和解释请参见AB的回答

有关完整文档(以及其他模式),请参阅man 8 ip-link

相关内容