1. 程式人生 > 實用技巧 >network ip netns 網路名稱空間

network ip netns 網路名稱空間

Network namespace 是 linux 核心提供的功能,Network namespace 用於實現網路虛擬化,它能建立多個隔離的網路空間,每個網路空間有自己獨自的網路棧資訊。不管是虛擬機器還是容器,執行的時候彷彿自己就在獨立的網路中。 網路名稱空間可以通過 linux 提供的 ip 命令進行管理。

常用命令

ip netns add net0 # 建立網路名稱空間 net0

ip netns del net0 # 刪除網路名稱空間 net0

ip netns exec net0 ip addr show # 檢視網路名稱空間 net0 下的 ip 資訊

Network namespace 之間的通訊

網路拓撲結構

  1. 建立 veth pair

    Network namespace 主要用於網路隔離,如果要實現網路之間的通訊,可以使用 linux 提供的veth pair。 需要注意的是 veth pair 無法單獨存在,刪除其中一個,另一個也會自動消失。

    ip link add type veth # 用於建立一對 veth pair

    or

    ip link add veth0 type veth peer name veth1 # 指定名字建立 veth pair

    建立結束後我們就可以看到名為 veth0 和veth1 兩個網路介面

  2. 建立 namespace

    ip netns add net0

    ip netns add net1

  3. 設定網絡卡到指定 namespace

    在建立完成後,我們要把這對 veth pari 分別放到兩個 namespace 裡面,

    ip link set veth0 netns net0

    ip link set veth1 netns net1

  4. 配置 ip 地址

    ip netns exec net0 ip link set veth0 up

    ip netns exec net0 ip addr add 10.0.1.1/24 dev veth0

    ip netns exec net1 ip link set veth1 up

    ip netns exec net1 ip addr add 10.0.1.2/24 dev veth1

  5. 設定 route

    ip netns exec net0 ip route add 10.0.1.0/24 dev veth0 proto kernel scope link src 10.0.1.1

    如果不配置 route,ping 命令顯示 connect: Network is unreachable

  6. ping測試連通性

    ip netns exec net0 ping -c 3 10.0.1.2

    ip netns exec net1 ping -c 3 10.0.1.1

    可以看到不同網路空間的裝置可以互相 ping 通。

 

使用 bridge 連線不同的 namespace

雖然 veth pair 可以實現兩個 network namespace 之間的通訊,但是當多個 namespace 需要通訊的時候,就無能為力了。 多個網路裝置通訊要用到交換機,linux 也提供了虛擬交換機的功能,也可以用ip命令來完成所有的操作。

linux 的 eth0 可以認為是 bridge 型別。

網路拓撲結構

  1. 建立 bridge 並設定 bridge ip

    ip link add br0 type bridge

    ip link set dev br0 up

    ip addr add 10.0.1.0/24 dev br0

  2. 建立 veth pair

    ip link add veth0 type veth peer name veth1

    ip link add veth2 type veth peer name veth3

    ip link add veth4 type veth peer name veth5

  3. 建立 namespace

    ip netns add net0

    ip netns add net1

    ip netns add net2

  4. 設定網絡卡到指定 namespace

    ip link set veth1 netns net0

    ip netns exec net0 ip link set dev veth1 name eth0

    ip netns exec net0 ip link set eth0 up

    ip link set dev veth0 master br0

    ip link set dev veth0 up

    ip link set veth3 netns net1

    ip netns exec net1 ip link set dev veth3 name eth0

    ip netns exec net1 ip link set eth0 up

    ip link set dev veth2 master br0

    ip link set dev veth2 up

    ip link set veth5 netns net2

    ip netns exec net2 ip link set dev veth5 name eth0

    ip netns exec net2 ip link set eth0 up

    ip link set dev veth4 master br0

    ip link set dev veth4 up

  5. 配置 ip 地址

    ip netns exec net0 ip addr add 10.0.1.1/24 dev eth0

    ip netns exec net1 ip addr add 10.0.1.2/24 dev eth0

    ip netns exec net2 ip addr add 10.0.1.3/24 dev eth0

  6. 設定 route

    ip netns exec net0 ip route add 10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.1

    ip netns exec net1 ip route add 10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.2

    ip netns exec net2 ip route add 10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.3

  7. ping測試連通性

    ip netns exec net0 ping -c 3 10.0.1.2

    ip netns exec net1 ping -c 3 10.0.1.3