namespace前言namespace是Linux虛擬網(wǎng)絡(luò)的一個(gè)重要概念,,傳統(tǒng)的Linux的許多資源是全局的,如果進(jìn)程id資源,。而namespace的目的首先就是講這些資源做資源隔離,。Linux可以在一個(gè)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ò)信息)。 一個(gè)設(shè)備(Linux Device)只能位于一個(gè)namespace中,,不同namespace中的設(shè)備可以利用veth pair進(jìn)行橋接,。 命令實(shí)操Linux 操作namespace的命令是ip netns。 # ip netns help 首先創(chuàng)建一個(gè)namespace: # ip netns list # ip netns add ns_test 當(dāng)創(chuàng)建一個(gè)namespace后,,就可以將一些虛擬設(shè)備遷移到這個(gè)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遷移到這個(gè)namespace中。 遷移之后,,在外直接 ip a s 已經(jīng)看不到這個(gè)虛擬設(shè)備了 # ip link set tap_test netns ns_test # ip netns exec ns_test ip a s veth pair前言veth pair 不是一個(gè)設(shè)備,,而是一對(duì)設(shè)備,,以連接兩個(gè)虛擬以太端口。操作veth pair,,需要跟namespace一起配合,,不然就沒有意義。 簡(jiǎn)單的拓?fù)鋱D: 兩個(gè)namespace ns1/ns2 中各有一個(gè)tap組成veth pair,兩個(gè)tap 上配置的ip進(jìn)行互ping,。 命令實(shí)操創(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 通過以上的測(cè)試用例,,可以了解通過veth pair連接兩個(gè)namespace的方法,。 下面就要依靠Bridge/Switch 實(shí)現(xiàn)三個(gè)或多個(gè)namespace進(jìn)行互通。 Bridge前言在Linux的語境中,,Bridge和Switch是一個(gè)概念,。Bridge是一個(gè)虛擬網(wǎng)絡(luò)設(shè)備,所以具有網(wǎng)絡(luò)設(shè)備的特征,,可以配置IP,、MAC地址等;Bridge是一個(gè)虛擬交換機(jī),,和物理交換機(jī)有類似的功能,。對(duì)于普通的網(wǎng)絡(luò)設(shè)備來說,只有兩端,,從一端進(jìn)來的數(shù)據(jù)會(huì)從另一端出去,,如物理網(wǎng)卡從外面網(wǎng)絡(luò)中收到的數(shù)據(jù)會(huì)轉(zhuǎn)發(fā)給內(nèi)核協(xié)議棧,而從協(xié)議棧過來的數(shù)據(jù)會(huì)轉(zhuǎn)發(fā)到外面的物理網(wǎng)絡(luò)中,。 而Bridge不同,,Bridge有多個(gè)端口,,數(shù)據(jù)可以從任何端口進(jìn)來,進(jìn)來之后從哪個(gè)口出去和物理交換機(jī)的原理差不多,,要看mac地址,。 命令實(shí)操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 對(duì)應(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ò)連通: |
|