溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何解析Linux Network Namespace

發(fā)布時間:2021-10-21 17:06:33 來源:億速云 閱讀:119 作者:柒染 欄目:云計算

這篇文章給大家介紹如何解析Linux Network Namespace,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

Linux Network Namespace (netns) 詳解

Network Namespace (以下簡稱netns)是Linux內(nèi)核提供的一項實現(xiàn)網(wǎng)絡(luò)隔離的功能,它能隔離多個不同的網(wǎng)絡(luò)空間,并且各自擁有獨立的網(wǎng)絡(luò)協(xié)議棧,這其中便包括了網(wǎng)絡(luò)接口(網(wǎng)卡),路由表,iptables規(guī)則等。例如大名鼎鼎的docker便是基于netns實現(xiàn)的網(wǎng)絡(luò)隔離,今天我們就來手動實驗一下netns的隔離特性。

使用方式

使用ip netns help查看使用幫助

Usage: ip netns list
       ip netns add NAME
       ip netns set NAME NETNSID
       ip [-all] netns delete [NAME]
       ip netns identify [PID]
       ip netns pids NAME
       ip [-all] netns exec [NAME] cmd ...
       ip netns monitor
       ip netns list-id

開始實驗

我們將要構(gòu)建如下圖的網(wǎng)絡(luò)

如何解析Linux Network Namespace

首先我們添加兩個tap設(shè)備并配置上IP信息,然后添加兩個netns,最后將tap設(shè)備移動到netns中

# 添加并啟動虛擬網(wǎng)卡tap設(shè)備
ip tuntap add dev tap0 mode tap 
ip tuntap add dev tap1 mode tap 
ip link set tap0 up
ip link set tap1 up
# 配置IP
ip addr add 10.0.0.1/24 dev tap0
ip addr add 10.0.0.2/24 dev tap1
# 添加netns
ip netns add ns0
ip netns add ns1
# 將虛擬網(wǎng)卡tap0,tap1分別移動到ns0和ns1中
ip link set tap0 netns ns0
ip link set tap1 netns ns1

在宿主機器上使用ping 10.0.0.1測試與tap0的網(wǎng)絡(luò)連通性

PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
^C
--- 10.0.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 58ms

在宿主機器上使用ping 10.0.0.2測試與tap1的網(wǎng)絡(luò)連通性

ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
^C
--- 10.0.0.2 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 36ms

> 由于長時間未收到ICMP的回復(fù)報文,我使用Ctrl+C退出了。

使用ip netns exec ns0 ping 10.0.0.2在命名空間ns0中測試與tap1的網(wǎng)絡(luò)連通性

connect: 網(wǎng)絡(luò)不可達

使用ip netns exec ns1 ping 10.0.0.1在命名空間ns1中測試與tap0的網(wǎng)絡(luò)連通性

connect: 網(wǎng)絡(luò)不可達

> 在netns中執(zhí)行命令有兩種方式,一種是先在宿主機器上執(zhí)行ip netns exec <netns name> bash進入netns,然后就可以像是在本機一樣執(zhí)行命令了。另一種是每次在宿主機器上使用完整的命令,為了明顯區(qū)分,我們這里都使用完整的命令,例如ip netns exec ns0 ping 10.0.0.2的含義為在命名空間ns0中執(zhí)行ping 10.0.0.2命令

可以看到在宿主機器上訪問netns是丟包,而在netns中互相訪問是網(wǎng)絡(luò)不可達了,這是為什么呢?讓我們來檢查一下netns吧。

使用ip netns exec ns0 ip a在ns0中查看網(wǎng)卡

1: lo: <loopback> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
16: tap0: <broadcast,multicast> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 42:ad:98:a2:cc:81 brd ff:ff:ff:ff:ff:ff

使用ip netns exec ns1 ip a在ns1中查看網(wǎng)卡

1: lo: <loopback> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
17: tap1: <broadcast,multicast> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 12:06:1d:06:41:57 brd ff:ff:ff:ff:ff:ff

可以看到不僅本地環(huán)回lo和tap設(shè)備的狀態(tài)都是DOWN,甚至就連tap設(shè)備的IP信息也沒有了,這是因為在不同的網(wǎng)絡(luò)命名空間中移動虛擬網(wǎng)絡(luò)接口時會重置虛擬網(wǎng)絡(luò)接口的狀態(tài)。

我們將ns0和ns1中的相關(guān)設(shè)備都重新啟動并配置上IP

ip netns exec ns0 ip link set lo up
ip netns exec ns0 ip link set tap0 up
ip netns exec ns0 ip addr add 10.0.0.1/24 dev tap0

ip netns exec ns1 ip link set lo up
ip netns exec ns1 ip link set tap1 up
ip netns exec ns1 ip addr add 10.0.0.2/24 dev tap1

首先我們測試一下netns中本地網(wǎng)絡(luò)是否正常

使用ip netns exec ns0 ping 10.0.0.1在命名空間ns0中測試本地網(wǎng)卡是否啟動

PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.036 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.033 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=0.084 ms
64 bytes from 10.0.0.1: icmp_seq=4 ttl=64 time=0.044 ms
^C
--- 10.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 65ms
rtt min/avg/max/mdev = 0.033/0.049/0.084/0.021 ms

使用ip netns exec ns1 ping 10.0.0.2在命名空間ns1中測試本地網(wǎng)卡是否啟動

PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.033 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.034 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.065 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=0.035 ms
^C
--- 10.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 65ms
rtt min/avg/max/mdev = 0.033/0.049/0.084/0.021 ms

可以看出本地網(wǎng)絡(luò)沒有問題,然后我們再來測試一下兩個netns之間的網(wǎng)絡(luò)連通性

使用ip netns exec ns0 ping 10.0.0.2在命名空間ns0中測試與tap1的網(wǎng)絡(luò)連通性

PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
^C
--- 10.0.0.2 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 84ms

使用ip netns exec ns1 ping 10.0.0.1在命名空間ns1中測試與tap0的網(wǎng)絡(luò)連通性

PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
^C
--- 10.0.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 30ms

可以看出沒有任何ICMP回復(fù)包,netns確實把在同一臺主機上的兩張?zhí)摂M網(wǎng)卡隔離起來了。在這里我們只是簡單的使用ping命令來測試網(wǎng)絡(luò)的連通性,實際上可以做到更多,例如修改某一個netns的路由表或者防火墻規(guī)則,完全不會影響到其他的netns,當然也不會影響到宿主機器,在這里由于篇幅原因就不再展開實驗了,感興趣的同學可以實驗一下。

關(guān)于如何解析Linux Network Namespace就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI