Linux網絡虛擬化 - Network Namespace 實踐


Network Namespace能夠隔離系統的網絡設備, IP地址, 端口等,每個netns有自己獨立的網絡棧,路由表等。Linux提供了ip netns命令方便我們創建、刪除netns或者在給定的netns中執行命令。本文主要介紹使用ip等命令創建netns並使用NAT使配置netns中的網絡。參考鏈接:

本文中所有的命令在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,而只是unmountadd命令創建的bind mount。因此,只有在delete之後且netns1中沒有任何進程運行時,netns1纔會被刪除。

創建、配置虛擬網卡

新創建的netns初始只包含一個未啓用的本地環回設備lo,若要使其能夠與宿主機或網絡通信,則需要先建立虛擬網卡。具體步驟如下:

  1. 創建相連(peer)的兩個虛擬網卡
  2. 將其中一個虛擬網卡加入到netns
  3. 配置虛擬網卡的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中網絡的目的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章