Network Namespace(netns) 是Linux內核提供的一項實現網絡隔離的功能,它能隔離多個不同的網絡空間,并且各自擁有獨立的網絡協議棧。通過 namespace 可以隔離容器的進程 PID、文件系統掛載點、主機名等多種資源,它可以為不同的命名空間從邏輯上提供獨立的網絡協議棧,具體包括網絡設備(網卡)、路由表、arp表、iptables、以及套接字(socket)等。使得不同的網絡空間就都好像運行在獨立的網絡中一樣。如大名鼎鼎的docker便是基于netns實現的網絡隔離。
1、ip netns 幫助文檔
A network namespace is logically another copy of the network stack, with its own routes, firewall rules, and network devices.
ip-netns
- process network namespace management.
ip netns help
man ip-netns
man ip netns
=========================================
Usage:
ip [ OPTIONS ] netns { COMMAND | help }
ip netns [ list ]
ip netns add NETNSNAME
ip [-all] netns delete [ NETNSNAME ]
ip netns set NETNSNAME NETNSID
ip netns identify [ PID ]
ip netns pids NETNSNAME
ip [-all] netns exec [ NETNSNAME ] command...
ip netns monitor
ip netns list-id1.將 {網卡名字} 移動到 {網絡命名空間}
ip link set {網卡名字} netns {網絡命名空間}
2.將接口iner1從網絡名稱空間ns2移動到網絡名稱空間ns1
ip netns exec ns2 ip link set iner1 netns ns1
3.將接口iner1從名稱空間ns2移動到Linux上默認網絡名稱空間
2、ip netns 實踐
2.1、添加兩個tap設備并配置IP信息
添加兩個tap設備并配置IP信息
1.添加并啟動虛擬網卡tap設備
ip tuntap add dev tap0 mode tap
ip tuntap add dev tap1 mode tap
ip link set tap0 up
ip link set tap1 up2.配置IP
ip addr add 10.0.0.1/24 dev tap0
ip addr add 10.0.0.2/24 dev tap1
在宿主機器上使用測試與tap0 10.0.0.1
的網絡連通性 (通
)
ping -c 1 10.0.0.1
===========================================================
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.032 ms--- 10.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.032/0.032/0.032/0.000 ms
在宿主機器上使用測試與tap0 10.0.0.2
的網絡連通性 (通
)
ping -c 1 10.0.0.2
===========================================================
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.046 ms--- 10.0.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.046/0.046/0.046/0.000 ms
2.2、添加兩個netns,移動tap設備到netns中
然后添加兩個netns,最后將tap設備移動到netns中
3.添加netns
ip netns add ns0
ip netns add ns14.查看已存在的netns
ip netns list5.將虛擬網卡tap0,tap1分別移動到ns0和ns1中
ip link set tap0 netns ns0
ip link set tap1 netns ns16.移動后查看netns中的網絡接口網絡配置丟失
【在不同的網絡命名空間中移動虛擬網絡接口時會重置虛擬網絡接口的狀態】
ip netns exec ns0 ip addr
ip netns exec ns1 ip addr7.啟動netns中網絡接口
ip netns exec ns0 ip link set tap0 up
ip netns exec ns1 ip link set tap1 up8.重新配置netns中網絡接口的IP
ip netns exec ns0 ip addr add 10.0.0.1/24 dev tap0
ip netns exec ns1 ip addr add 10.0.0.2/24 dev tap19.添加netns
ip netns exec ns0 ip addr
ip netns exec ns1 ip addr
在宿主機上使用測試與tap0 10.0.0.1
的網絡連通性 (不通
)
ping -c 1 10.0.0.1
===========================================================
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.--- 10.0.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
在宿主機上使用測試與tap0 10.0.0.2
的網絡連通性 (不通
)
ping -c 1 10.0.0.2
===========================================================
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.--- 10.0.0.2 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
在命名空間ns0中測試與tap0的網絡連通性 (不通
)
ip netns exec ns0 ping -c 1 10.0.0.1
在命名空間ns0中測試與tap1的網絡連通性 (不通
)
ip netns exec ns0 ping -c 1 10.0.0.2
====================================
connect: Network is unreachable
在命名空間ns1中測試與tap1的網絡連通性 (不通
)
ip netns exec ns1 ping -c 1 10.0.0.2
在命名空間ns1中測試與tap0的網絡連通性 (不通
)
ip netns exec ns1 ping -c 1 10.0.0.1
====================================
connect: Network is unreachable
在netns中執行命令有兩種方式:
法1::先在宿主機器上執行 ip netns exec <netns name> bash
進入netns的命令行窗口,然后就可以像是在本機一樣執行命令了。
法2:每次在宿主機器上使用完整命令。例: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 1000link/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 1000link/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 1000link/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 1000link/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 tap0ip 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,當然也不會影響到宿主機器,在這里由于篇幅原因就不再展開實驗了,感興趣的同學可以實驗一下。下一節我們將學習另一個網絡設備veth pair,使用它來把兩個netns連接起來,讓兩個隔離的?netns之間可以互相通信。
初心易得,始終難守;不忘初心,方得始終。