認識 linux namespace

Linux namespace 解決的問題:

  • 主要是為了解決多個 process 之間的隔離需求。
  • 特別是在多用戶、多任務的系統上,進程之間互相影響會帶來安全和穩定性的問題。

核心功能:

  • 網路隔離:每個 Namespace 可以有自己的網路環境,每個 Namespace 擁有自己獨立的網卡、IP 地址、網路路由等。
    • 適合於需要網路隔離的場景,例如容器技術中的每個容器都可以有自己的網路接口和 IP 地址,並且可以通過虛擬網絡設備(如 veth)來實現互相通信或者和 host 通信。
  • Process 隔離:不同的 Namespace 可以擁有相同的進程 ID(PID),這樣即使兩個進程的 PID 相同,但它們處於不同的 Namespace 中,彼此之間看不到對方,從而實現進程的隔離。

Veth Lab

以下透過 lab 來建立 namespace:

新增 namespace

建立兩個獨立的 namespace 分別叫做 redblue

1
2
3
4
5
root@ns-lab ~ ➜  ip netns add red
root@ns-lab ~ ➜ ip netns add blue
root@ns-lab ~ ➜ ip netns
blue
red

透過 ip netns exec 指令查看,可以發現 redblue namespace 中都只有 LOOPBACK 這個預設的網路介面。

red 與 blue namespace 預設網路配置

ip nets exec red ip linkip -n red link 指令是相同的

可以觀察到 red 與 blue 的 namespace 中,目前是沒有 ARP 與 Route 的設定。

ARP 比較

Route 比較

建立 veth pair

ip link add veth-red type veth peer name veth-blue

  • veth-red 為第一個虛擬以太網接口的名稱。
  • type veth 為創建 veth 的接口,通常用於不同的 namespace 或是 container 進行通訊。
  • veth-blue 為第二個虛擬以太網接口的名稱。表示與 veth-red 接口是成對的,可以相互通訊。

將 veth 設定到 namespace

1
2
ip link set veth-red netns red
ip link set veth-blue netns blue
  • 用於將虛擬以太網接口 veth-redveth-blue 分別移動到不同的 namespace 中。
    • set: 指定要修改某個網絡接口的屬性。
    • veth-red: 指定要操作的虛擬以太網接口。
    • netns red: 將 veth-red 接口移動到名為 red 的網絡命名空間中。

veth 示意圖

為不同 namespace 配置 IP 位置

1
2
ip -n red addr add 192.5.48.1/24 dev veth-red
ip -n blue addr add 192.5.48.2/24 dev veth-blue

這兩條命令用於為之前移動到不同網絡命名空間的虛擬以太網接口 veth-red 和 veth-blue 分別配置 IP 地址。

ip -n red addr add 192.21.91.1/24 dev veth-red:

  • addr add: 指示要新增一個 IP 地址。
  • dev veth-red: 指定要為其配置 IP 地址的網絡接口是 veth-red

將 veth 設定為 up

1
2
ip -n red link set veth-red up
ip -n blue link set veth-blue up

這兩條命令用於啟用之前創建的虛擬以太網接口 veth-redveth-blue,並將它們設置為 「up」 狀態。

  • link set: 指示要對網絡接口的鏈接狀態進行設置。
  • veth-red: 指定要操作的虛擬以太網接口名稱。
  • up: 將指定的網絡接口啟用。

查看 namespace 裡面的 ARP

在 namespace red 中 ping 了 blue 之後,可以查看到 ARP 已經有了內容。

red 與 blue namespace 的 ARP

透過 veth 可以讓兩個 Linux Network Namespace之間實現網路互通,接下來使用 switch 進行測試。

Switch Lab

在 Linux 中,Bridge 可以被看作是一個 Layer 2 Switch。

bridge 與 Open vSwitch 比較

Linux Bridge

簡單輕量:Linux Bridge 提供了基礎的網路橋接功能,它類似於實體交換機的行為,能將多個網路接口連接起來,形成一個內部網路,用於不同虛擬機或容器之間的通訊。

適合簡單場景:它更適合用於簡單的場景,例如在本地單個主機內部進行虛擬機之間的通信,或簡單的容器網路。

Open vSwitch (OVS)

高級功能與彈性:相比於 Linux Bridge,OVS 支援更多的高級網路功能,比如虛擬局域網(VLAN)、網路隔離、流量控制、網路監控、負載均衡,以及支援 OpenFlow 等協議。這使得它在需要更多控制和網路監控的場景中非常有用。

建立 virtual switch

1
ip link add v-net-0 type bridge

新增的 v-net-0

啟用 virtual switch

1
ip link set v-net-0 up

刪除原本在 veth lab 的 veth peer

當刪除其中一個 link veth 的時候,另外一個也會被刪除。

1
ip -n red link del veth-red

建立新的 veth pair

每對虛擬以太網接口由兩個相互關聯的接口組成,它們可以相互通信。

1
2
ip link add veth-red type veth peer name veth-red-br
ip link add veth-blue type veth peer name veth-blue-br

將新建立的 veth 移動到 namespace 與 swith

  • 將虛擬以太網接口 veth-red 移動到名為 red 的 namespace 中。
  • 並將其對等接口 veth-red-br 設置`為橋接接口 v-net-0 的成員。

red

1
2
ip link set veth-red netns red
ip link set veth-red-br master v-net-0

blue

1
2
ip link set veth-blue netns blue
ip link set veth-blue-br master v-net-0

veth 配置 IP

1
2
ip -n red addr add 192.21.91.1 dev veth-red
ip -n blue addr add 192.21.91.2 dev veth-blue

switch 示意圖

總結

以上展示了使用 Linux 的 Namespace 隔離技術,能為每個 Namespace 提供獨立的網路環境。

通過 Veth Pair,兩個網路接口可以實現點對點的對接,並將來自不同 Namespace 的網絡進行互通。

再配合 Linux Bridge,能將多個網路接口之間的封包進行轉發,從而模擬 switch 的功能,實現類似實體交換機的網路環境。


認識 linux namespace
https://phoebeho.com/sre/20240830/2988133093/
作者
Phoebe
發布於
2024年8月30日
許可協議