Linux网络命名空间

引言 Namespaces(命名空间)和cgroups是两种主要的内核技术,他们是容器化技术的基石。简而言之,cgroup是一种计量和限制机制,它能控制你可以使用多少系统资源(CPU、内存)。另一方面,Namespaces限制了你所看到的内容。得益于Namespaces,进程有其独立的系统资源视图。 Linux内核提供了6种类型的Namespaces:pid、net、mnt、uts、ipc、user。例如,pid命名空间的进程只能看到同一个命名空间的进程。使用mnt命名空间,可以将进程附加到其自己的文件系统(就像chroot)。在本文中我们仅关注网络命名空间。 网络命名空间为命名空间内的所有进程提供了全新的网络堆栈。其中包括网络接口,路由表和iptables规则。 网络命名空间 从系统的角度来看,当通过clone()系统调用创建新进程时,传递标志CLONE_NEWNET将在新进程中创建一个全新的网络命名空间。从用户的角度来看,我们仅使用工具ip(软件包为iproute2)来创建新的持久网络命名空间: $ ip netns add ns1 此命令将创建一个名为ns1的新网络命名空间。创建命名空间后,ip命令会在/var/run/netns下为其添加绑定挂载点。这样,即使没有附加任何进程,命名空间也可以保留。列出系统中可用的命名空间: $ ls /var/run/netns ns1 或通过ip: $ ip netns ns1 如前所述,网络命名空间包含其自己的网络资源:接口,路由表等。让我们向ns1添加回环接口: 1 $ ip netns exec ns1 ip link set dev lo up 2 $ ip netns exec ns1 ping 127.0.0.1 3 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 4 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.115 ms 第1行在网络命名空间ns1内部启用回环接口。 第2行在网络命名空间内部执行命令ping 127.0.0.1。 启用回环接口的另一种语法可以是: $ ip netns exec ns1 ifconfig lo up 废弃旧的但更熟悉ifconfig,route等命令,我倾向于使用命令ip,因为它已经成为Linux的首选网络工具。请注意,ip需要root权限,因此请以root身份或前置sudo运行。 网络命名空间也有自己的路由表: $ ip netns exec ns1 ip route show 由于我们尚未添加任何路由表规则,因此该命令什么都不返回。一般而言,在网络命名空间中运行的任何命令都由以下内容开头: ...

March 20, 2021