namespace是Linux虛擬網(wǎng)絡(luò)的一個重要概念,傳統(tǒng)的Linux的許多資源是全局的,如果進(jìn)程id資源。而namespace的目的首先就是講這些資源做資源隔離。Linux可以在一個Host內(nèi)創(chuàng)建許多namespace,于是那些原本是linux的全局資源,就變成了namespace范圍內(nèi)的“全局”資源,而且不同namespace的資源相互不可見,彼此透明。
Linux namespace 可以隔離的資源有:uts_ns(內(nèi)存、版本等底層信息)、ipc_ns(所有與進(jìn)程通信的信息)、 mnt_ns(當(dāng)前裝載的文件系統(tǒng))、 pid_ns(有關(guān)進(jìn)程id的信息)、 user_ns(資源配額的信息)、 net_ns(網(wǎng)絡(luò)信息)。
一個設(shè)備(Linux Device)只能位于一個namespace中,不同namespace中的設(shè)備可以利用veth pair進(jìn)行橋接。
Linux 操作namespace的命令是ip netns。
# ip netns help
首先創(chuàng)建一個namespace:
# ip netns list
# ip netns add ns_test
當(dāng)創(chuàng)建一個namespace后,就可以將一些虛擬設(shè)備遷移到這個namespace中去了,比如上一篇中介紹的tap。
# tunctl -t tap_test
# ip addr add local 10.0.0.190/24 dev tap_test
# ip a show
創(chuàng)建namespace后,將前面創(chuàng)建的tap_test遷移到這個namespace中。
遷移之后,在外直接 ip a s 已經(jīng)看不到這個虛擬設(shè)備了
# ip link set tap_test netns ns_test
# ip netns exec ns_test ip a s
veth pair 不是一個設(shè)備,而是一對設(shè)備,以連接兩個虛擬以太端口。操作veth pair,需要跟namespace一起配合,不然就沒有意義。
簡單的拓?fù)鋱D:
兩個namespace ns1/ns2 中各有一個tap組成veth pair,兩個tap 上配置的ip進(jìn)行互ping。
創(chuàng)建 veth pair:
# ip link add tap1 type veth peer name tap2
# ip a s
創(chuàng)建namespace,并將tap遷移至namespace中:
# ip netns add ns1
# ip netns add ns2
# ip link set tap1 netns ns1
# ip link set tap2 netns ns2
# ip netns exec ns1 ip addr add local 192.168.10.200/24 dev tap1
# ip netns exec ns2 ip addr add local 192.168.10.201/24 dev tap2
# ip netns exec ns1 ifconfig tap1 up
# ip netns exec ns2 ifconfig tap2 up
根據(jù)ip進(jìn)行ping操作,驗(yàn)證連通性:
# ip netns exec ns1 ping 192.168.10.201
通過以上的測試用例,可以了解通過veth pair連接兩個namespace的方法。
下面就要依靠Bridge/Switch 實(shí)現(xiàn)三個或多個namespace進(jìn)行互通。
在Linux的語境中,Bridge和Switch是一個概念。Bridge是一個虛擬網(wǎng)絡(luò)設(shè)備,所以具有網(wǎng)絡(luò)設(shè)備的特征,可以配置IP、MAC地址等;Bridge是一個虛擬交換機(jī),和物理交換機(jī)有類似的功能。對于普通的網(wǎng)絡(luò)設(shè)備來說,只有兩端,從一端進(jìn)來的數(shù)據(jù)會從另一端出去,如物理網(wǎng)卡從外面網(wǎng)絡(luò)中收到的數(shù)據(jù)會轉(zhuǎn)發(fā)給內(nèi)核協(xié)議棧,而從協(xié)議棧過來的數(shù)據(jù)會轉(zhuǎn)發(fā)到外面的物理網(wǎng)絡(luò)中。 而Bridge不同,Bridge有多個端口,數(shù)據(jù)可以從任何端口進(jìn)來,進(jìn)來之后從哪個口出去和物理交換機(jī)的原理差不多,要看mac地址。
Linux實(shí)現(xiàn)Bridge功能是brctl模塊??梢灾苯釉诿钚猩喜榭矗绻麤]有回顯的話,可直接使用yum進(jìn)行安裝。
# yum -y install bridge-utils
根據(jù)如下拓?fù)鋱D,我們模擬創(chuàng)建相應(yīng)的虛擬網(wǎng)絡(luò)設(shè)備,進(jìn)行實(shí)現(xiàn):
命令操作:
# ip link add tap1 type veth peer name tap1_peer
# ip link add tap2 type veth peer name tap2_peer
# ip link add tap3 type veth peer name tap3_peer
# ip link add tap4 type veth peer name tap4_peer
創(chuàng)建namespace:
將設(shè)備遷移至namespace:
創(chuàng)建 Bridge,并tap 添加到 Bridge中:
# brctl addbr br1
# ip a s | grep br1
# brctl addif br1 tap1_peer
配置 tap 對應(yīng)的ip地址:
# ip netns exec ns1 ip addr add local 192.168.10.200/24 dev tap1
將 Bridge 以及所有 tap 狀態(tài)設(shè)置為 up:
# ip link set br1 up
# ip link set tap1_peer up
# ip netns exec ns1 ip link set tap1 up
相互進(jìn)行ip 互ping ,驗(yàn)證網(wǎng)絡(luò)連通:
聯(lián)系客服