您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何解析Linux Network Namespace,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
Network Namespace (以下簡稱netns)是Linux內核提供的一項實現網絡隔離的功能,它能隔離多個不同的網絡空間,并且各自擁有獨立的網絡協議棧,這其中便包括了網絡接口(網卡),路由表,iptables規則等。例如大名鼎鼎的docker便是基于netns實現的網絡隔離,今天我們就來手動實驗一下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
我們將要構建如下圖的網絡
首先我們添加兩個tap設備并配置上IP信息,然后添加兩個netns,最后將tap設備移動到netns中
# 添加并啟動虛擬網卡tap設備 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 # 將虛擬網卡tap0,tap1分別移動到ns0和ns1中 ip link set tap0 netns ns0 ip link set tap1 netns ns1
在宿主機器上使用ping 10.0.0.1
測試與tap0的網絡連通性
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的網絡連通性
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的回復報文,我使用Ctrl+C退出了。
使用ip netns exec ns0 ping 10.0.0.2
在命名空間ns0中測試與tap1的網絡連通性
connect: 網絡不可達
使用ip netns exec ns1 ping 10.0.0.1
在命名空間ns1中測試與tap0的網絡連通性
connect: 網絡不可達
> 在netns中執行命令有兩種方式,一種是先在宿主機器上執行ip netns exec <netns name> bash
進入netns,然后就可以像是在本機一樣執行命令了。另一種是每次在宿主機器上使用完整的命令,為了明顯區分,我們這里都使用完整的命令,例如ip netns exec ns0 ping 10.0.0.2
的含義為在命名空間ns0中執行ping 10.0.0.2
命令
可以看到在宿主機器上訪問netns是丟包,而在netns中互相訪問是網絡不可達了,這是為什么呢?讓我們來檢查一下netns吧。
使用ip netns exec ns0 ip a
在ns0中查看網卡
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中查看網卡
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
可以看到不僅本地環回lo和tap設備的狀態都是DOWN,甚至就連tap設備的IP信息也沒有了,這是因為在不同的網絡命名空間中移動虛擬網絡接口時會重置虛擬網絡接口的狀態。
我們將ns0和ns1中的相關設備都重新啟動并配置上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中本地網絡是否正常
使用ip netns exec ns0 ping 10.0.0.1
在命名空間ns0中測試本地網卡是否啟動
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中測試本地網卡是否啟動
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
可以看出本地網絡沒有問題,然后我們再來測試一下兩個netns之間的網絡連通性
使用ip netns exec ns0 ping 10.0.0.2
在命名空間ns0中測試與tap1的網絡連通性
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的網絡連通性
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回復包,netns確實把在同一臺主機上的兩張虛擬網卡隔離起來了。在這里我們只是簡單的使用ping
命令來測試網絡的連通性,實際上可以做到更多,例如修改某一個netns的路由表或者防火墻規則,完全不會影響到其他的netns,當然也不會影響到宿主機器,在這里由于篇幅原因就不再展開實驗了,感興趣的同學可以實驗一下。
關于如何解析Linux Network Namespace就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。