顏汝南
(海南經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院,海南 海口 571127)
在傳統(tǒng)的Linux 系統(tǒng)中,所有進程共享同一個網(wǎng)絡(luò)命名空間,這意味著它們處于同一個網(wǎng)絡(luò)環(huán)境中,共享相同的網(wǎng)絡(luò)資源。然而,網(wǎng)絡(luò)命名空間技術(shù)改變了這種情況。通過創(chuàng)建多個網(wǎng)絡(luò)命名空間,并將不同的虛擬網(wǎng)絡(luò)置于各自的命名空間中,可以實現(xiàn)虛擬網(wǎng)絡(luò)之間的隔離。
每個網(wǎng)絡(luò)命名空間都擁有自己的網(wǎng)絡(luò)設(shè)備、IP地址、路由表和防火墻規(guī)則。網(wǎng)絡(luò)命名空間內(nèi)部的進程只能訪問自己所在命名空間中的網(wǎng)絡(luò)資源,無法直接訪問其他命名空間中的資源。這種隔離機制確保了不同虛擬網(wǎng)絡(luò)之間的相互獨立性和安全性。同時,通過網(wǎng)絡(luò)命名空間之間的通信機制,不同虛擬網(wǎng)絡(luò)之間可以進行必要的網(wǎng)絡(luò)通信,Veth-Pair就是實現(xiàn)命名空間之間通信的一種機制。
Linux 虛擬網(wǎng)絡(luò)是一種在Linux 操作系統(tǒng)上使用虛擬化技術(shù)創(chuàng)建和管理虛擬網(wǎng)絡(luò)資源的方法,其核心是對二層物理網(wǎng)絡(luò)的抽象與管理,實現(xiàn)物理網(wǎng)卡和交換設(shè)備的虛擬化[1]。它允許在一臺物理主機上創(chuàng)建多個獨立的虛擬網(wǎng)絡(luò),并模擬多個虛擬網(wǎng)絡(luò)設(shè)備以實現(xiàn)隔離和通信。
常見的Linux虛擬網(wǎng)絡(luò)技術(shù)包括:Linux網(wǎng)絡(luò)命名空間、Linux 虛擬以太網(wǎng)(Virtual Ethernet,Veth)設(shè)備、Linux 網(wǎng)橋(Bridge)、Linux 虛擬局域網(wǎng)(Virtual LAN,VLAN)、Linux 虛擬專用網(wǎng)絡(luò)(Virtual Private Network,VPN)。其中,Linux 虛擬網(wǎng)絡(luò)技術(shù)可以通過創(chuàng)建獨立的網(wǎng)絡(luò)命名空間、使用Veth 設(shè)備進行連接、利用網(wǎng)橋?qū)崿F(xiàn)數(shù)據(jù)轉(zhuǎn)發(fā)、使用VLAN 技術(shù)進行網(wǎng)絡(luò)劃分以及使用VPN 技術(shù)實現(xiàn)安全通信等方式來實現(xiàn)虛擬網(wǎng)絡(luò)環(huán)境。這些技術(shù)可以提供更高效、靈活和安全的網(wǎng)絡(luò)架構(gòu),并廣泛應(yīng)用于云計算、容器化和網(wǎng)絡(luò)測試等領(lǐng)域。
網(wǎng)絡(luò)命名空間(Network Namespace)是一種在操作系統(tǒng)內(nèi)核中創(chuàng)建的隔離網(wǎng)絡(luò)環(huán)境。Network namespace 允許每個容器擁有自己唯一的(虛擬的)網(wǎng)絡(luò)設(shè)備,容器中的應(yīng)用程序可以綁定到物理主機上的端口,這樣即使端口號相同,每個名稱空間中的端口也不會沖突[2]。它通過將網(wǎng)絡(luò)設(shè)備、IP地址、路由表和防火墻規(guī)則等網(wǎng)絡(luò)資源隔離到各自的命名空間中,實現(xiàn)了不同網(wǎng)絡(luò)實體之間的邏輯隔離。每個網(wǎng)絡(luò)命名空間可以有自己的網(wǎng)絡(luò)配置,使得在同一主機上創(chuàng)造出多個獨立的網(wǎng)絡(luò)環(huán)境。各個網(wǎng)絡(luò)命名空間內(nèi)的進程只能訪問本命名空間內(nèi)的網(wǎng)絡(luò)資源,無法直接訪問其他命名空間的資源。
網(wǎng)絡(luò)命名空間的作用主要有以下四個方面:
1)安全隔離:網(wǎng)絡(luò)命名空間提供了安全隔離的網(wǎng)絡(luò)環(huán)境。不同的網(wǎng)絡(luò)命名空間之間彼此隔離,網(wǎng)絡(luò)流量無法直接通過命名空間邊界進行傳遞。這可以防止流量泄露和橫向移動,提高了系統(tǒng)的安全性。
2)資源隔離:每個網(wǎng)絡(luò)命名空間可以有獨立的網(wǎng)絡(luò)配置,包括獨立的IP 地址、路由表和防火墻規(guī)則。這樣可以將網(wǎng)絡(luò)資源進行有效的管理和分配,避免資源被競爭使用或濫用。每個網(wǎng)絡(luò)命名空間可以根據(jù)需要設(shè)置適量的網(wǎng)絡(luò)資源,確保公平共享和優(yōu)化資源利用。
3)管理靈活性:網(wǎng)絡(luò)命名空間可以為不同的應(yīng)用或用戶提供各自的網(wǎng)絡(luò)環(huán)境,使它們能夠獨立配置和管理網(wǎng)絡(luò)。這種靈活性可以根據(jù)具體需求進行個性化配置,并且可以根據(jù)需要隨時添加、刪除或修改網(wǎng)絡(luò)命名空間,實現(xiàn)網(wǎng)絡(luò)架構(gòu)的動態(tài)調(diào)整和擴展。
4)多租戶支持:網(wǎng)絡(luò)命名空間在多租戶環(huán)境中非常有用。每個租戶可以擁有自己的網(wǎng)絡(luò)命名空間,使得不同的應(yīng)用或用戶在同一物理主機上共享網(wǎng)絡(luò)資源,但彼此之間相互隔離。這種隔離可以減少相互干擾和沖突,并提供安全的多租戶環(huán)境。
網(wǎng)絡(luò)命名空間提供了強大的隔離和管理功能,允許在同一主機上創(chuàng)建多個獨立的網(wǎng)絡(luò)環(huán)境。它在容器化平臺、云計算環(huán)境和網(wǎng)絡(luò)功能虛擬化中得到廣泛應(yīng)用,為多租戶隔離、安全性和資源優(yōu)化提供了有效的解決方案。
Veth-Pair(Virtual Ethernet Pair)是一種在虛擬網(wǎng)絡(luò)中常用的技術(shù),它用于創(chuàng)建一對Veth設(shè)備支持連接兩個不同的網(wǎng)絡(luò)命名空間,它通常用于不同的網(wǎng)絡(luò)空間能夠相互通信,建立一個對端到對端的網(wǎng)絡(luò)通道[3]。
Veth-Pair 技術(shù)通過創(chuàng)建一對虛擬的Veth 設(shè)備來實現(xiàn)不同網(wǎng)絡(luò)命名空間之間的連接。Veth 設(shè)備是成對出現(xiàn)的虛擬以太網(wǎng)設(shè)備,其中一個設(shè)備位于一個網(wǎng)絡(luò)命名空間中,而另一個設(shè)備位于另一個網(wǎng)絡(luò)命名空間中。這對Veth 設(shè)備通過一個虛擬網(wǎng)橋或虛擬交換機連接起來,從而實現(xiàn)了跨命名空間的網(wǎng)絡(luò)通信。
當(dāng)數(shù)據(jù)包從一個網(wǎng)絡(luò)命名空間的Veth 設(shè)備發(fā)送出去時,它通過Veth-Pair 到達另一個網(wǎng)絡(luò)命名空間的Veth 設(shè)備。這樣,不同的網(wǎng)絡(luò)命名空間可以通過Veth-Pair設(shè)備進行網(wǎng)絡(luò)通信,就像是通過物理以太網(wǎng)連接的多個節(jié)點一樣。
Veth-Pair 技術(shù)在虛擬化和容器化環(huán)境中有廣泛的應(yīng)用,主要用于網(wǎng)絡(luò)隔離、互聯(lián)容器網(wǎng)絡(luò)、虛擬交換機和網(wǎng)絡(luò)功能虛擬化。Veth-Pair 技術(shù)通過創(chuàng)建一對虛擬的以太網(wǎng)設(shè)備,為不同的網(wǎng)絡(luò)命名空間提供了連通性。它在虛擬化和容器化環(huán)境中起到了重要作用,支持了復(fù)雜的網(wǎng)絡(luò)架構(gòu)、容器網(wǎng)絡(luò)和網(wǎng)絡(luò)功能虛擬化等應(yīng)用場景。
TAP(TAP虛擬以太網(wǎng)適配器)是一種用于創(chuàng)建虛擬網(wǎng)絡(luò)接口的技術(shù)。TAP作為虛擬網(wǎng)卡設(shè)備,并不直接和真實的物理板卡交換數(shù)據(jù),而是通過字符驅(qū)動和一個用戶模式下的應(yīng)用程序進行交互,再由應(yīng)用程序?qū)崿F(xiàn)與物理板卡之間的通信[4]。
TAP設(shè)備主要用于以下三個方面:
1)虛擬機網(wǎng)絡(luò):TAP設(shè)備在虛擬機環(huán)境中廣泛使用,可以實現(xiàn)虛擬機與主機之間以及虛擬機之間的網(wǎng)絡(luò)通信。通過將虛擬機的網(wǎng)絡(luò)接口連接到TAP 設(shè)備上,可以使得虛擬機能夠像物理機一樣與網(wǎng)絡(luò)進行通信。
2)容器網(wǎng)絡(luò):容器技術(shù),如Docker,也可以使用TAP 設(shè)備來實現(xiàn)容器之間以及容器與主機之間的網(wǎng)絡(luò)通信。通過創(chuàng)建一個或多個TAP設(shè)備,并將其與容器進行關(guān)聯(lián),容器可以與其他容器或者主機進行網(wǎng)絡(luò)通信。
3)VPN和隧道連接:TAP設(shè)備可以被用于創(chuàng)建虛擬專用網(wǎng)絡(luò)(VPN)或隧道連接,通過加密將數(shù)據(jù)包傳輸?shù)竭h程網(wǎng)絡(luò)。TAP 設(shè)備可以模擬一個物理網(wǎng)絡(luò)接口,將數(shù)據(jù)包從本地網(wǎng)絡(luò)傳輸?shù)竭h程網(wǎng)絡(luò),從而實現(xiàn)跨網(wǎng)絡(luò)的安全通信。
在Linux 內(nèi)核中有一個網(wǎng)絡(luò)設(shè)備管理層,處于網(wǎng)絡(luò)設(shè)備驅(qū)動和協(xié)議棧之間,負責(zé)銜接它們之間的數(shù)據(jù)交互,驅(qū)動就不需要了解協(xié)議棧的細節(jié),協(xié)議棧也不需要了解設(shè)備驅(qū)動的細節(jié)[5]。它使得應(yīng)用程序可以通過TAP設(shè)備與網(wǎng)絡(luò)進行通信,從而實現(xiàn)各種網(wǎng)絡(luò)連接和功能。
本實驗測試是基于centos7.6操作系統(tǒng),其中創(chuàng)建兩個命名空間分別為ns0和ns1,同時創(chuàng)建兩個TAP設(shè)備分別為tap0和tap1,分別將兩個TAP 設(shè)備加入對相應(yīng)的ns中,如圖1所示,實現(xiàn)步驟見如下1)~4)。

圖1 網(wǎng)絡(luò)命名空間拓撲圖
1)創(chuàng)建TAP 設(shè)備及網(wǎng)絡(luò)命名空間。首先添加兩個TAP 設(shè)備并配置IP,然后添加兩個netns,最后將TAP設(shè)備移動到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 中執(zhí)行命令ip netns exec <netns name>命令,例如ip netns exec ns0 ping 10.1.1.2命令,其含義為在命名空間ns0 中執(zhí)行ping 10.1.1.2 命令。因為在不同的網(wǎng)絡(luò)命名空間中移動虛擬網(wǎng)絡(luò)接口時會重置虛擬網(wǎng)絡(luò)接口的狀態(tài),所以將ns0 和ns1 中的相關(guān)設(shè)備都重新啟動并配置上IP,配置后可以從圖2和圖3看到ns0和ns1下的網(wǎng)絡(luò)設(shè)備IP狀態(tài)。配置如下:

圖2 ns0下的網(wǎng)絡(luò)設(shè)備IP狀態(tài)

圖3 ns1下的網(wǎng)絡(luò)設(shè)備IP狀態(tài)
[root@k8s-master ~]# ip netns exec ns0 ip link set lo 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 中本地網(wǎng)絡(luò)是否正常。使用ip netns exec ns0 ping 10.1.1.1 命令在ns0 中測試本地網(wǎng)卡tap0 是否可通,如圖4 所示,可見ns0 本地網(wǎng)絡(luò)正常的。

圖4 ns0可以ping通本地網(wǎng)卡tap0
使用ip netns exec ns1 ping 10.1.1.2 命令在ns1 中測試本地網(wǎng)卡tap1是否可通,如圖5所示,可見ns1本地網(wǎng)絡(luò)正常的。
4)測試兩個netns 之間的網(wǎng)絡(luò)連通性,使用ip netns exec ns0 ping 10.1.1.2命令測試ns0與ns1中的網(wǎng)絡(luò)連通性,如圖6所示。

圖6 測試ns0與ns1中的網(wǎng)絡(luò)連通性
可以看出沒有任何ICMP 回復(fù)包,說明即使是連接同一個物理主機協(xié)議棧的兩個網(wǎng)絡(luò)命名空間之間確實是隔離的,這種隔離機制可以使得虛擬化下的網(wǎng)絡(luò)資源可以更安全與靈活。
本測試是在圖1基礎(chǔ)上進行改造,在命名空間ns0 和ns1 中加入Veth-Pair 設(shè)備對,從而將兩個的隔離命名空間連接起來,如下圖7所示,實現(xiàn)步驟見如下1)~5)。

圖7 使用Veth-Pair的網(wǎng)絡(luò)命名空間拓撲圖
1)首先創(chuàng)建一對Veth 設(shè)備,將Veth 設(shè)備分別移動到兩個命名空間中并啟動,配置如下:
[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
[root@k8s-master ~]# ip netns exec ns0 ip link set veth0 up
[root@k8s-master ~]# ip netns exec ns1 ip link set veth1 up
2)使用ip netns exec ns0 ping 10.1.1.2 命令測試ns0與ns1中的tap1網(wǎng)絡(luò)連通性,如圖8所示。

圖8 測試ns0與ns1中的tap1網(wǎng)絡(luò)連通性
使用ip netns exec ns1 ping 10.1.1.1 命令測試ns1與ns0中的tap0網(wǎng)絡(luò)連通性,如圖9所示。

圖9 測試ns1與ns0中的tap0網(wǎng)絡(luò)連通性
可見添加了Veth-Pair 后兩個命名空間并不能直接通信,通過查看ns0和ns1的路由表可以發(fā)現(xiàn)原因。
3)檢查ns0和ns1路由表,配置如下:
使用ip netns exec ns0 ip route查看ns0的路由表。
[root@k8s-master ~]#ip netns exec ns0 ip route
10.1.1.0/24 dev tap0 proto kernel scope link src 10.1.1.1
使用ip netns exec ns1 ip route 查看ns1的路由表。
[root@k8s-master ~]#ip netns exec ns1 ip route
10.1.1.0/24 dev tap1 proto kernel scope link src 10.1.1.2
從以上路由表可以看出ns的流量都由tap設(shè)備發(fā)出,而tap設(shè)備沒有和其他設(shè)備相連,所以導(dǎo)致發(fā)出去的數(shù)據(jù)報文不會被處理。
4)修改ns0 和ns1 路由表,使得ns 內(nèi)部訪問外部流量從Veth設(shè)備發(fā)出,配置如下:
[root@k8s-master ~]#ip netns exec ns0 ip route delete 10.1.1.0/24
[root@k8s-master ~]# ip netns exec ns0 ip route add 10.1.1.0/24 via 0.0.0.0 dev veth0
[root@k8s-master ~]#ip netns exec ns1 ip route delete 10.1.1.0/24
[root@k8s-master ~]# ip netns exec ns1 ip route add 10.1.1.0/24 via 0.0.0.0 dev veth1
5)測試ns0到與ns1的網(wǎng)絡(luò)連通性。使用ip netns exec ns0 ping 10.1.1.2 和ip netns exec ns1 ping 10.1.1.1命令測試,如圖10、圖11 所示,ns0 和ns1 網(wǎng)絡(luò)已可以正常通信。

圖10 測試命名空間ns0到與ns1的網(wǎng)絡(luò)連通性

圖11 測試命名空間ns1到與ns0的網(wǎng)絡(luò)連通性
實驗結(jié)果表明兩個隔離的網(wǎng)絡(luò)命名空間可以通過Veth-Pair 實現(xiàn)通信,但是這樣的網(wǎng)絡(luò)拓撲存在一個明顯的缺陷,就是隨著網(wǎng)絡(luò)命名空間的增多,網(wǎng)絡(luò)拓撲的連線將按n*(n-1)/2的倍數(shù)增長。
虛擬網(wǎng)絡(luò)命名空間通信技術(shù)是一種實現(xiàn)虛擬化網(wǎng)絡(luò)的有效方法,它能夠在同一主機上創(chuàng)建多個獨立網(wǎng)絡(luò),并實現(xiàn)不同網(wǎng)絡(luò)之間的隔離和通信,可以應(yīng)用于多種場景,包括云計算和虛擬化環(huán)境、測試和開發(fā)環(huán)境、企業(yè)網(wǎng)絡(luò)等。虛擬網(wǎng)絡(luò)命名空間通信技術(shù)的應(yīng)用將會在未來得到更廣泛的推廣和應(yīng)用。