認識 linux namespace
Linux namespace 解決的問題:
- 主要是為了解決多個 process 之間的隔離需求。
- 特別是在多用戶、多任務的系統上,進程之間互相影響會帶來安全和穩定性的問題。
核心功能:
- 網路隔離:每個 Namespace 可以有自己的網路環境,每個 Namespace 擁有自己獨立的網卡、IP 地址、網路路由等。
- 適合於需要網路隔離的場景,例如容器技術中的每個容器都可以有自己的網路接口和 IP 地址,並且可以通過虛擬網絡設備(如 veth)來實現互相通信或者和 host 通信。
- Process 隔離:不同的 Namespace 可以擁有相同的進程 ID(PID),這樣即使兩個進程的 PID 相同,但它們處於不同的 Namespace 中,彼此之間看不到對方,從而實現進程的隔離。
Veth Lab
以下透過 lab 來建立 namespace:
新增 namespace
建立兩個獨立的 namespace 分別叫做 red
跟 blue
1 |
|
透過 ip netns exec
指令查看,可以發現 red
跟 blue
namespace 中都只有 LOOPBACK 這個預設的網路介面。
ip nets exec red ip link
與ip -n red link
指令是相同的
可以觀察到 red 與 blue 的 namespace 中,目前是沒有 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 |
|
- 用於將虛擬以太網接口
veth-red
和veth-blue
分別移動到不同的 namespace 中。set
: 指定要修改某個網絡接口的屬性。veth-red
: 指定要操作的虛擬以太網接口。netns red
: 將veth-red
接口移動到名為red
的網絡命名空間中。
為不同 namespace 配置 IP 位置
1 |
|
這兩條命令用於為之前移動到不同網絡命名空間的虛擬以太網接口 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 |
|
這兩條命令用於啟用之前創建的虛擬以太網接口 veth-red
和 veth-blue
,並將它們設置為 「up」 狀態。
link set
: 指示要對網絡接口的鏈接狀態進行設置。veth-red
: 指定要操作的虛擬以太網接口名稱。up
: 將指定的網絡接口啟用。
查看 namespace 裡面的 ARP
在 namespace red 中 ping 了 blue 之後,可以查看到 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 |
|
啟用 virtual switch
1 |
|
刪除原本在 veth lab 的 veth peer
當刪除其中一個 link veth 的時候,另外一個也會被刪除。
1 |
|
建立新的 veth pair
每對虛擬以太網接口由兩個相互關聯的接口組成,它們可以相互通信。
1 |
|
將新建立的 veth 移動到 namespace 與 swith
- 將虛擬以太網接口
veth-red
移動到名為red
的 namespace 中。 - 並將其對等接口
veth-red-br
設置`為橋接接口 v-net-0 的成員。
red
1 |
|
blue
1 |
|
veth 配置 IP
1 |
|
總結
以上展示了使用 Linux 的 Namespace 隔離技術,能為每個 Namespace 提供獨立的網路環境。
通過 Veth Pair,兩個網路接口可以實現點對點的對接,並將來自不同 Namespace 的網絡進行互通。
再配合 Linux Bridge,能將多個網路接口之間的封包進行轉發,從而模擬 switch 的功能,實現類似實體交換機的網路環境。