网络命名空间¶
命名空间是一种限定特定标识符集合的方式。使用命名空间,可以在不同的命名空间中多次使用相同的标识符。还可以限制特定进程可见的标识符集合。
例如,Linux 提供用于网络和进程的命名空间,等等。如果一个进程在进程命名空间中运行,它只能看到并与同一命名空间中的其他进程通信。因此,如果在特定进程命名空间中的 shell 运行 ps waux,它只会显示同一命名空间中的其他进程。
Linux 网络命名空间¶
在网络命名空间中,限定的“标识符”是网络设备;因此,给定的网络设备,例如 eth0,存在于特定的命名空间中。Linux 启动时会有一个默认的网络命名空间,因此,如果您的操作系统没有做任何特殊处理,所有网络设备都将位于那里。但也可以创建进一步的非默认命名空间,并在这些命名空间中创建新设备,或者将现有设备从一个命名空间移动到另一个命名空间。
每个网络命名空间还拥有自己的路由表,事实上,这正是命名空间存在的主要原因。路由表以目标 IP 地址为键,因此,如果您希望相同的目标 IP 地址在不同的时间意味着不同的内容,则需要网络命名空间——这是 OpenStack Networking 需要其提供不同虚拟网络中重叠 IP 地址的功能的原因。
每个网络命名空间还拥有自己的 iptables 集合(对于 IPv4 和 IPv6)。因此,您可以对不同命名空间中具有相同 IP 地址的流应用不同的安全策略,以及不同的路由。
任何给定的 Linux 进程都在特定的网络命名空间中运行。默认情况下,它从其父进程继承,但具有相应权限的进程可以切换到不同的命名空间;实际上,这通常使用 ip netns exec NETNS COMMAND... 调用来完成,该调用启动在名为 NETNS 的命名空间中运行的 COMMAND。假设这样一个进程发送到 IP 地址 A.B.C.D 的消息,命名空间的作用是 A.B.C.D 将在命名空间的路由表中查找,这将确定消息通过的网络设备。
虚拟路由和转发 (VRF)¶
虚拟路由和转发是一种 IP 技术,它允许在同一路由器上同时存在多个路由表的实例。它是上述网络命名空间功能的另一个名称。