Network Namespace
基本信息
网络命名空间是Linux内核的一个功能,提供网络堆栈的隔离,允许每个网络命名空间拥有独立的网络配置、接口、IP地址、路由表和防火墙规则。这种隔离在各种场景中非常有用,比如容器化,其中每个容器应该有自己独立的网络配置,独立于其他容器和主机系统。
工作原理:
创建新的网络命名空间时,它会以一个完全隔离的网络堆栈开始,除了回环接口(lo)外没有网络接口。这意味着运行在新网络命名空间中的进程默认情况下无法与其他命名空间中的进程或主机系统通信。
虚拟网络接口,如veth对,可以被创建并在网络命名空间之间移动。这允许在命名空间之间或在命名空间和主机系统之间建立网络连接。例如,veth对的一端可以放置在容器的网络命名空间中,另一端可以连接到主机命名空间中的桥接器或另一个网络接口,为容器提供网络连接。
命名空间内的网络接口可以拥有它们自己的IP地址、路由表和防火墙规则,独立于其他命名空间。这允许不同网络命名空间中的进程拥有不同的网络配置,并且可以像在独立网络系统上运行一样操作。
进程可以使用
setns()
系统调用在命名空间之间移动,或者使用带有CLONE_NEWNET
标志的unshare()
或clone()
系统调用创建新的命名空间。当进程移动到新的命名空间或创建一个新的命名空间时,它将开始使用与该命名空间关联的网络配置和接口。
实验:
创建不同的命名空间
命令行界面
通过使用参数--mount-proc
挂载/proc
文件系统的新实例,确保新的挂载命名空间对该命名空间特定的进程信息具有准确且隔离的视图。
Docker
检查您的进程位于哪个命名空间
查找所有网络命名空间
```bash nsenter -n TARGET_PID --pid /bin/bash ``` 此外,**只有 root 用户才能进入另一个进程命名空间**。而且,**没有指向它的描述符**(如 `/proc/self/ns/net`),**无法进入**其他命名空间。
参考资料
最后更新于