基于Veth-Pair实现网络命名空间通信的研究
作者: 颜汝南
关键词:网络命名空间;Veth-Pair;netns;Linux
中图分类号:TP393 文献标识码:A
文章编号:1009-3044(2023)32-0081-04
0 引言
在传统的Linux系统中,所有进程共享同一个网络命名空间,这意味着它们处于同一个网络环境中,共享相同的网络资源。然而,网络命名空间技术改变了这种情况。通过创建多个网络命名空间,并将不同的虚拟网络置于各自的命名空间中,可以实现虚拟网络之间的隔离。
每个网络命名空间都拥有自己的网络设备、IP地址、路由表和防火墙规则。网络命名空间内部的进程只能访问自己所在命名空间中的网络资源,无法直接访问其他命名空间中的资源。这种隔离机制确保了不同虚拟网络之间的相互独立性和安全性。同时,通过网络命名空间之间的通信机制,不同虚拟网络之间可以进行必要的网络通信,Veth-Pair就是实现命名空间之间通信的一种机制。
1 Linux 虚拟网络
Linux虚拟网络是一种在Linux操作系统上使用虚拟化技术创建和管理虚拟网络资源的方法,其核心是对二层物理网络的抽象与管理,实现物理网卡和交换设备的虚拟化[1]。它允许在一台物理主机上创建多个独立的虚拟网络,并模拟多个虚拟网络设备以实现隔离和通信。
常见的Linux虚拟网络技术包括:Linux网络命名空间、Linux虚拟以太网(Virtual Ethernet,Veth)设备、Linux 网桥(Bridge)、Linux 虚拟局域网(Virtual LAN,VLAN)、Linux虚拟专用网络(Virtual Private Network,VPN)。其中,Linux虚拟网络技术可以通过创建独立的网络命名空间、使用Veth设备进行连接、利用网桥实现数据转发、使用VLAN技术进行网络划分以及使用VPN技术实现安全通信等方式来实现虚拟网络环境。这些技术可以提供更高效、灵活和安全的网络架构,并广泛应用于云计算、容器化和网络测试等领域。
1.1 网络命名空间
网络命名空间(Network Namespace)是一种在操作系统内核中创建的隔离网络环境。Networknamespace 允许每个容器拥有自己唯一的(虚拟的)网络设备,容器中的应用程序可以绑定到物理主机上的端口,这样即使端口号相同,每个名称空间中的端口也不会冲突[2]。它通过将网络设备、IP地址、路由表和防火墙规则等网络资源隔离到各自的命名空间中,实现了不同网络实体之间的逻辑隔离。每个网络命名空间可以有自己的网络配置,使得在同一主机上创造出多个独立的网络环境。各个网络命名空间内的进程只能访问本命名空间内的网络资源,无法直接访问其他命名空间的资源。
网络命名空间的作用主要有以下四个方面:
1)安全隔离:网络命名空间提供了安全隔离的网络环境。不同的网络命名空间之间彼此隔离,网络流量无法直接通过命名空间边界进行传递。这可以防止流量泄露和横向移动,提高了系统的安全性。
2)资源隔离:每个网络命名空间可以有独立的网络配置,包括独立的IP地址、路由表和防火墙规则。这样可以将网络资源进行有效的管理和分配,避免资源被竞争使用或滥用。每个网络命名空间可以根据需要设置适量的网络资源,确保公平共享和优化资源利用。
3)管理灵活性:网络命名空间可以为不同的应用或用户提供各自的网络环境,使它们能够独立配置和管理网络。这种灵活性可以根据具体需求进行个性化配置,并且可以根据需要随时添加、删除或修改网络命名空间,实现网络架构的动态调整和扩展。
4)多租户支持:网络命名空间在多租户环境中非常有用。每个租户可以拥有自己的网络命名空间,使得不同的应用或用户在同一物理主机上共享网络资源,但彼此之间相互隔离。这种隔离可以减少相互干扰和冲突,并提供安全的多租户环境。
网络命名空间提供了强大的隔离和管理功能,允许在同一主机上创建多个独立的网络环境。它在容器化平台、云计算环境和网络功能虚拟化中得到广泛应用,为多租户隔离、安全性和资源优化提供了有效的解决方案。
1.2 Veth-Pair
Veth-Pair(Virtual Ethernet Pair)是一种在虚拟网络中常用的技术,它用于创建一对Veth设备支持连接两个不同的网络命名空间,它通常用于不同的网络空间能够相互通信,建立一个对端到对端的网络通道[3]。
Veth-Pair技术通过创建一对虚拟的Veth设备来实现不同网络命名空间之间的连接。Veth设备是成对出现的虚拟以太网设备,其中一个设备位于一个网络命名空间中,而另一个设备位于另一个网络命名空间中。这对Veth设备通过一个虚拟网桥或虚拟交换机连接起来,从而实现了跨命名空间的网络通信。
当数据包从一个网络命名空间的Veth设备发送出去时,它通过Veth-Pair到达另一个网络命名空间的Veth设备。这样,不同的网络命名空间可以通过Veth-Pair设备进行网络通信,就像是通过物理以太网连接的多个节点一样。
Veth-Pair技术在虚拟化和容器化环境中有广泛的应用,主要用于网络隔离、互联容器网络、虚拟交换机和网络功能虚拟化。Veth-Pair技术通过创建一对虚拟的以太网设备,为不同的网络命名空间提供了连通性。它在虚拟化和容器化环境中起到了重要作用,支持了复杂的网络架构、容器网络和网络功能虚拟化等应用场景。
1.3 TAP 虚拟设备
TAP(TAP虚拟以太网适配器)是一种用于创建虚拟网络接口的技术。TAP作为虚拟网卡设备,并不直接和真实的物理板卡交换数据,而是通过字符驱动和一个用户模式下的应用程序进行交互,再由应用程序实现与物理板卡之间的通信[4]。
TAP设备主要用于以下三个方面:
1)虚拟机网络:TAP设备在虚拟机环境中广泛使用,可以实现虚拟机与主机之间以及虚拟机之间的网络通信。通过将虚拟机的网络接口连接到TAP设备上,可以使得虚拟机能够像物理机一样与网络进行通信。
2)容器网络:容器技术,如Docker,也可以使用TAP设备来实现容器之间以及容器与主机之间的网络通信。通过创建一个或多个TAP设备,并将其与容器进行关联,容器可以与其他容器或者主机进行网络通信。
3)VPN和隧道连接:TAP设备可以被用于创建虚拟专用网络(VPN)或隧道连接,通过加密将数据包传输到远程网络。TAP设备可以模拟一个物理网络接口,将数据包从本地网络传输到远程网络,从而实现跨网络的安全通信。
在Linux内核中有一个网络设备管理层,处于网络设备驱动和协议栈之间,负责衔接它们之间的数据交互,驱动就不需要了解协议栈的细节,协议栈也不需要了解设备驱动的细节[5]。它使得应用程序可以通过TAP设备与网络进行通信,从而实现各种网络连接和功能。
2 实验的设计与实现
2.1 无Veth-Pair 技术下网络命名空间通信实验
本实验测试是基于centos7.6操作系统,其中创建两个命名空间分别为ns0和ns1,同时创建两个TAP设备分别为tap0和tap1,分别将两个TAP设备加入对相应的ns中,如图1所示,实现步骤见如下1)~4)。
1)创建TAP设备及网络命名空间。首先添加两个TAP 设备并配置IP,然后添加两个netns,最后将TAP设备移动到netns中,配置如下:
[root@k8s-master ~]# ip tuntap add dev tap0 mode tap
[root@k8s-master ~]# ip tuntap add dev tap1 mode tap
[root@k8s-master ~]# ip netns add ns0
[root@k8s-master ~]# ip netns add ns1
[root@k8s-master ~]# ip link set tap0 netns ns0
[root@k8s-master ~]# ip link set tap1 netns ns1
2)在netns中执行命令ip netns exec <netns name>命令,例如ip netns exec ns0 ping 10.1.1.2命令,其含义为在命名空间ns0中执行ping 10.1.1.2命令。因为在不同的网络命名空间中移动虚拟网络接口时会重置虚拟网络接口的状态,所以将ns0和ns1中的相关设备都重新启动并配置上IP,配置后可以从图2和图3看到ns0和ns1下的网络设备IP状态。配置如下:
[root@k8s-master ~]# ip netns exec ns0 ip link setlo up
[root@k8s-master ~]# ip netns exec ns0 ip link set tap0 up
[root@k8s-master ~]# ip netns exec ns0 ip address add 10.1.1.1/24 dev tap0
[root@k8s-master ~]# ip netns exec ns1 ip link set lo up
[root@k8s-master ~]# ip netns exec ns1 ip link set tap1 up
[root@k8s-master ~]# ip netns exec ns1 ip addr add 10.1.1.2/24 dev tap1
[root@k8s-master ~]# ip netns exec ns0 ip a
[root@k8s-master ~]# ip netns exec ns1 ip a
3)测试netns 中本地网络是否正常。使用ipnetns exec ns0 ping 10.1.1.1命令在ns0中测试本地网卡tap0是否可通,如图4所示,可见ns0本地网络正常的。
使用ip netns exec ns1 ping 10.1.1.2命令在ns1中测试本地网卡tap1是否可通,如图5所示,可见ns1本地网络正常的。
4)测试两个netns 之间的网络连通性,使用ipnetns exec ns0 ping 10.1.1.2命令测试ns0与ns1中的网络连通性,如图6所示。
可以看出没有任何ICMP回复包,说明即使是连接同一个物理主机协议栈的两个网络命名空间之间确实是隔离的,这种隔离机制可以使得虚拟化下的网络资源可以更安全与灵活。
2.2 基于Veth-Pair 技术下网络命名空间通信实验
本测试是在图1基础上进行改造,在命名空间ns0和ns1中加入Veth-Pair设备对,从而将两个的隔离命名空间连接起来,如下图7所示,实现步骤见如下1)~5)。
1)首先创建一对Veth设备,将Veth设备分别移动到两个命名空间中并启动,配置如下:
[root@k8s-master ~]# ip link add veth0 type veth
peer name veth1
[root@k8s-master ~]# ip link set veth0 netns ns0
[root@k8s-master ~]# ip link set veth1 netns ns1