pet*_*erh 3 linux namespace network-namespaces macvlan
我有
eth0,在我的主网络命名空间中jail0,位于备用网络命名空间 (name name0) 中。这个命名空间由一个被监禁的环境使用。jail0是macvlan别名的eth0。我看到网络没有任何问题,从我的主系统和我的监狱。
但是,我无法互相ping通。
为什么会这样?我想让它们触手可及。
在其他网络接口的命名空间中不存在任何网络接口。
要完成接受的答案,桥接模式是最简单的方法,但还不足以获得通信。
当 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 恢复设置的信息。
macvlan接口可以在不同的模式下使用,这会改变两个 macvlan 实例之间传输的数据的处理方式。默认模式是vepa(虚拟以太网端口聚合),这可能就是您的设置不起作用的原因。
您可能想要配置的常见模式的简短描述:
vepa数据通过物理接口传输,对于macvlan实例之间的通信,交换机需要支持发夹模式或者必须有IP路由器转发数据包。
private即使外部交换机支持发夹模式,也不允许 macvlan 实例之间进行通信。
bridge允许实例之间直接通信,macvlan 实例之间的流量不在物理链路上传输。
您可能想在桥接模式下使用 macvlan 。对于 macvlan 实例和包含网络接口本身的命名空间之间的通信,您需要在同一(主/主机)网络命名空间中创建 macvlan 实例。详细内容和解释请参见AB的回答。
有关完整文档(以及其他模式),请参阅man 8 ip-link。