# 如何解析Linux Network Namespace
## 摘要
本文深入解析Linux Network Namespace的實現原理與應用場景,涵蓋namespace創建、管理、網絡隔離機制及實際案例。通過cgroup、veth pair等技術的結合分析,揭示容器網絡虛擬化的核心機制。
---
## 1. Linux Namespace概述
### 1.1 命名空間基礎概念
Linux Namespace是內核級別的資源隔離機制,通過將全局系統資源包裝在抽象空間中,實現以下核心功能:
- **進程隔離**:不同namespace中的進程擁有獨立的系統視圖
- **資源虛擬化**:為每個namespace提供虛擬化的網絡棧、掛載點等
- **安全邊界**:限制進程可訪問的資源范圍
### 1.2 Namespace類型對比
| 類型 | 隔離內容 | 典型應用場景 |
|-------------------|--------------------------|--------------------|
| PID | 進程ID空間 | 容器進程管理 |
| Network | 網絡設備/協議棧 | 容器網絡 |
| Mount | 文件系統掛載點 | 容器文件系統 |
| UTS | 主機名與域名 | 多租戶環境 |
| IPC | System V IPC資源 | 進程間通信隔離 |
| User | 用戶/組ID映射 | 權限隔離 |
---
## 2. Network Namespace深度解析
### 2.1 核心數據結構
內核通過`struct net`結構體實現網絡命名空間:
```c
// linux-5.15/include/net/net_namespace.h
struct net {
atomic_t count; // 引用計數
struct list_head list; // 全局命名空間鏈表
struct net_device *loopback_dev; // 回環設備指針
// 協議棧相關
struct netns_ipv4 ipv4;
struct netns_ipv6 ipv6;
struct netns_unix unx;
// ...其他協議棧成員
};
graph TD
A[unshare/clone系統調用] --> B(do_new_net)
B --> C[alloc_netdev_mqs]
C --> D[setup_net]
D --> E[初始化協議棧]
E --> F[創建默認網絡設備]
copy_net_ns()
:復制父命名空間配置setup_net()
:初始化新網絡命名空間netdev_register()
:注冊虛擬網絡設備創建跨命名空間的通道:
# 創建veth pair
ip link add veth0 type veth peer name veth1
# 將veth1移動到目標ns
ip link set veth1 netns ns1
graph LR
Host[宿主機eth0] -->|路由| Router[虛擬路由器]
Router -->|veth pair| NS1[容器ns1]
Router -->|veth pair| NS2[容器ns2]
不同namespace維護獨立的: - NAT表規則 - Filter表規則 - Mangle表規則
命令 | 功能描述 |
---|---|
ip netns add ns1 |
創建新network namespace |
ip netns exec ns1 ifconfig |
在指定ns中執行命令 |
ip link set eth0 netns ns1 |
移動網絡設備到指定ns |
ip netns delete ns1 |
刪除namespace |
# 實驗拓撲搭建
ip netns add client
ip netns add server
ip link add veth0 type veth peer name veth1
ip link set veth0 netns client
ip link set veth1 netns server
# 配置IP地址
ip netns exec client ip addr add 10.0.0.1/24 dev veth0
ip netns exec server ip addr add 10.0.0.2/24 dev veth1
# 測試連通性
ip netns exec client ping 10.0.0.2
方案 | 實現原理 | 性能損耗 | 隔離性 |
---|---|---|---|
Bridge模式 | 虛擬網橋連接所有容器 | 中 | 中 |
Macvlan | 直接分配MAC地址 | 低 | 高 |
IPvlan | 共享MAC地址 | 極低 | 高 |
SR-IOV | 硬件虛擬化 | 最低 | 最高 |
CNI插件工作流程: 1. 創建pause容器的network namespace 2. 調用CNI插件配置網絡 3. 業務容器共享該namespace
ip netns identify <pid>
ip netns exec ns1 route -n
ip neigh show
nsenter --net=/var/run/netns/ns1 tcpdump -i eth0
iptables -A FORWARD -i eth0 -j ACCEPT
iptables -A FORWARD -o eth0 -j ACCEPT
# /etc/rc.local示例
mkdir -p /var/run/netns
ln -s /proc/1234/ns/net /var/run/netns/myns
# 多表路由示例
ip netns exec ns1 ip route add default via 10.0.0.1 table 100
ip netns exec ns1 ip rule add from 10.0.0.2 lookup 100
注:本文所有代碼示例已在Linux 5.15內核驗證,不同版本可能需調整 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。