在 Linux 网络命名空间之间移动网络设备

在 Linux 网络命名空间之间移动网络设备

在 Linux 中,设置 2 个网络命名空间,ns1并且ns2.ip netns list可以查看2个网络命名空间。

如果我将一个网络设备从 Linux 根命名空间移至 ,然后ns1ns1移至ns2,然后删除ns2,我希望该网络设备可以移回ns1

实际结果是eth1回到Linux根网络命名空间。我不确定是否如预期的那样。

这是详细的测试场景:

  1. ip netns add ns1
  2. ip netns add ns2
  3. ip link set eth1 netns ns1
  4. ip netns exec ns1 ip link set eth1 netns ns2
  5. ip netns del ns2

预期结果: eth1将在ns1

实际结果: eth1回到 Linux 根命名空间 1

问题:有没有什么方法可以实现这种情况,以确保设备可以返回到 ns1 而不是 Linux 根网络命名空间 1?

答案1

据我所知,没有办法强制“物理”网络接口返回到与所谓的“初始”网络命名空间不同的网络命名空间。与 Patrick 的评论相反,Linux 内核认为网络命名空间是平坦的因此没有任何层次结构(参见ioctl_ns - Linux 命名空间的 ioctl() 操作,其中明确提到仅PID用户命名空间是分层的)。

由于没有定义网络命名空间的层次结构(这很难应用于 IP 堆栈、地址和路由表),Linux 具有返回主规则,将网络接口移回初始网络命名空间,即init(1)/PID1 所加入的网络命名空间。

所有ip netns add ...要做的就是通过调用创建一个新的网络命名空间unshare(),然后将其绑定安装到其中/run/netns/ns1以保持其浮动状态。接下来ip nets add ...重新开始,将另一个网络命名空间挂载绑定到/run/netns/ns2.两个完全不相关的网络命名空间。

相关内容