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

pet*_*erh 3 linux namespace network-namespaces macvlan

我有

  • 一个接口 name eth0,在我的主网络命名空间中
  • 另一个接口 name jail0,位于备用网络命名空间 (name name0) 中。这个命名空间由一个被监禁的环境使用。
  • jail0macvlan别名eth0

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

但是,我无法互相ping通

为什么会这样?我想让它们触手可及。

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

A.B*_*A.B 8

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

当 jail 实例尝试 ping 主机时,它会发送一个 ARP 请求以获取其 IP。因为主机没有macvlan实例,数据包会直接在物理链路上传输(桥接模式定义的必然结果)。主机永远不会看到这个数据包,所以不能回答:没有 ping 回答。另一种方式是相同的:主机将所有数据包发送到真实的物理 LAN,没有主机的数据包将永远到达容器的 macvlan 接口(监狱...)。

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

host# ip link add link eth0 name hostmvl0 type macvlan mode bridge
Run Code Online (Sandbox Code Playgroud)

然后有两种方法:

  • 两个接口上的相同IP

    pro:eth0 或其设置没有变化,因此例如主机的 DHCP 没有问题。
    缺点:有些复杂,不能到处广播。

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

    host# ip addr add hostip/netmask dev hostmvl0 noprefixroute
    host# ip link set hostmvl0 up
    
    Run Code Online (Sandbox Code Playgroud)

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

    host# ip route add jailip/32 dev hostmvl0
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

    pro:网络配置更常见,没有特殊情况(例如:主机的广播无处不在),每个容器没有额外的路由设置。
    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
    
    Run Code Online (Sandbox Code Playgroud)

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


seb*_*sth 5

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

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

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

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

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

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

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