我有
eth0
我的主网络命名空间中的接口 name- 另一个接口 name
jail0
位于备用网络命名空间 (namename0
) 中。该命名空间由监狱环境使用。 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
。