Network Namespace
能夠隔離系統的網絡設備, IP地址, 端口等,每個netns
有自己獨立的網絡棧,路由表等。Linux提供了ip netns
命令方便我們創建、刪除netns
或者在給定的netns
中執行命令。本文主要介紹使用ip
等命令創建netns
並使用NAT使配置netns
中的網絡。參考鏈接:
- Namespaces in operation, part 7
- bridge
- ip-netns
- network-namespace-and-bridging
- add bridge to ubuntu
- Linux Namespace系列(06)
本文中所有的命令在Ubuntu18.04_amd64_server
下運行通過,其中大部分命令需要root權限。
創建 Network Namespace
ip netns
命令提供了創建、刪除netns
的方法:
ip netns add netns1 # 創建名爲 netns1 的 netns
# 該命令會在 /var/run/netns 下創建一個netns1的 bind mount
ip netns delete netns1 # ‘刪除’ netns1
# 該命令僅會 unmount 由 add 命令創建的 bind mount
ip netns exec netns1 cmd # 在 netns1 中執行 cmd
上述命令能夠用來創建、‘刪除’一個netns
,或者在netns
中執行命令。需要注意的是,ip netns delete
命令並不會真的刪除netns1,而只是unmount
由add
命令創建的bind mount
。因此,只有在delete
之後且netns1
中沒有任何進程運行時,netns1
纔會被刪除。
創建、配置虛擬網卡
新創建的netns
初始只包含一個未啓用的本地環回設備lo
,若要使其能夠與宿主機或網絡通信,則需要先建立虛擬網卡。具體步驟如下:
- 創建相連(peer)的兩個虛擬網卡
- 將其中一個虛擬網卡加入到
netns
中 - 配置虛擬網卡的ip
ip netns exec netns1 ip link set dev lo up # 使用 ip link 命令啓用本地環回 lo
ip link add veth0 type veth peer name veth1 # 使用 ip link 命令創建相連的虛擬網卡 veth0 veth1
# 發送到 veth0 的數據會到達 veth1,反之亦然
ip link set veth1 netns netns1 # 將 veth1 加入到 netns1 中
ifconfig veth0 10.1.1.2/24 up # 配置 veth0 的 ip
ip netns exec netns1 ifconfig veth1 10.1.1.1/24 up # 配置 veth1 的 ip
上述配置完成後就可以在netns1中通過veth1訪問veth0了,若要使netns1訪問互聯網(主機需已連接到互聯網),需要配置NAT或bridge。下面是配置NAT的方法:
ip netns exec netns1 route add default gw 10.1.1.2 # 配置 netns1 中的默認網關
iptables -t nat -A POSTROUTING -o ens33 # 配置宿主機的 iptable,各參數含義參考 man iptables
然後執行ip netns exec netns1 ping www.baidu.com
能夠看到netns1能夠訪問互聯網了。Network Namespace
中的網絡配置涉及到Linux網絡相關命令,由於作者對其不熟悉,此處不再介紹,感興趣的可以參考wuyangchun的文章。
總結
本文介紹了Linux中Network Namespace
相關內容,由於新創建的netns
中不包含任何設備,因此需要與其它網絡工具配合使用從而達到配置netns中網絡的目的。