3.5.1 网络命名空间

Linux 内核源于对资源隔离的需求,从 2.4.19 版本起陆续开始支持各类命名空间技术对资源进行隔离。

网络命名空间(Network Namespace)是其中的一种,它是实现 Linux 网络虚拟化的核心,它能创建多个隔离的网络空间,空间内的防火墙、网卡、路由表、邻居表、协议栈等与外部独立,当进程运行在一个独立的命名空间时,就像是一台单独的物理主机一样。

图 3-19 网络命名空间

由于每个容器都有自己的网络服务,在网络命名空间的作用下,这就使得一个主机内运行两个同时监听 80 端口的 Nginx 服务成为可能(当然,外部访问还需宿主机 NAT)。

Linux ip 工具的子命令 netns 集成了网络命名空间的增删查改功能,笔者使用 ip 命令进行操作实践,以便读者了解其过程。

创建新的网络命名空间。

ip netns add ns1

当 ip 命令创建一个网络命名空间时,系统会在 /var/run/netns 生成一个挂载点。挂载点的作用是方便对命名空间进行管理,另一方面也使得命名空间即使没有进程运行也能持续存在。

查询该命名空间的基本信息,由于没有任何配置,因此该命名空间下只有一块状态为 DOWN 的本地回环设备 lo。

$ ip netns exec ns1 ip link list 
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

继续查看该命名空间下 iptables 规则配置,由于是一个初始化的命名空间,所以也并没有任何规则。

$ ip netns exec ns1 iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

由于不同的命名空间之间相互隔离,所以同一个宿主机之内的命名空间并不能直接通信,如果想与外界(例如其他网络命名空间、宿主机)进行通信,就需要在命名空间里面插入虚拟网卡/网线(veth),然后再连接到虚拟交换机(Linux Bridge)。

没错,这些操作完全和物理环境中的局域网配置一样,只不过全部是虚拟的、用软件实现的而已。

总字数:648
Last Updated:
Contributors: isno