use*_*986 10 networking linux-kernel lxc docker linux-containers
在ip netns创建参考的(命名)网络命名空间/var/run/ns,它可以很容易地跟踪.此外,同样可以通过确定/proc/[pid]/ns/net.但是,某些自定义程序可能会创建一个net ns并将相应的inode保存在其他非常规位置.这可能使得难以确定是否存在我们可以列出的净ns.
其次,unshare <cmd>当进程退出时会破坏net ns,这很好.但是,ip netns exec <netns> <cmd>即使命令/进程退出,也会保留ns.所以我相信,任何自定义程序都可以这样做.
因此,问题是:自定义程序是否可能创建一个未命名的net ns,并且它与任何进程无关?
此外,如果我们不知道inode的路径,是否可以从用户空间列出这样的(隐藏的)网络?(内核当然有一个net ns的链表).代码片段会很有帮助.
自定义程序是否有可能创建一个未命名的 net ns,并且它与任何进程都没有关联?
是的,这是可能的。根据 Linux 命名空间手册页(http://man7.org/linux/man-pages/man7/namespaces.7.html):
每个进程都有一个 /proc/[pid]/ns/ 子目录,其中包含支持由 setns(2) 操作的每个名称空间的一个条目:
将此目录中的文件之一绑定安装(请参阅 mount(2))到文件系统中的其他位置,即使当前名称空间中的所有进程都终止,也会使 pid 指定的进程的相应名称空间保持活动状态。
关于另一个问题:
鉴于我们不知道 inode 的路径,是否可以从用户空间列出此类(隐藏)网络 ns?
如果您考虑第一个问题中的上述引用,通过检查绑定路径,您应该能够找到那些隐藏的名称空间。