一、macvlan 實現原理
1. 核心概念
- macvlan 允許在單個物理網絡接口上創建多個虛擬網絡接口,每個虛擬接口擁有 獨立的 MAC 地址 和 IP 地址。
- 工作模式:
- bridge 模式(默認):虛擬接口之間可直接通信,類似交換機。
- private 模式:虛擬接口之間隔離,僅能與物理接口通信。
- vepa 模式(Virtual Ethernet Port Aggregator):依賴外部交換機實現通信。
- passthru 模式:將物理接口直接映射到容器(較少使用)。
2. 實現原理
- MAC 地址隔離:每個 macvlan 接口有唯一的 MAC 地址,物理網絡通過 MAC 地址識別不同虛擬接口。
- 混雜模式(Promiscuous Mode):物理接口需啟用混雜模式,以接收所有目標 MAC 地址的流量。
- 數據包轉發:物理接口將流量按 MAC 地址分發到對應的 macvlan 虛擬接口。
3. 適用場景
- 容器需要獨立 MAC 地址(如 Docker 的
macvlan
驅動)。 - 多租戶網絡,每個租戶需獨立網絡身份。
二、ipvlan 實現原理
1. 核心概念
- ipvlan 允許在單個物理接口上創建多個虛擬接口,共享物理接口的 MAC 地址,但使用 獨立 IP 地址。
- 工作模式:
- L2 模式:虛擬接口在數據鏈路層(Layer 2)工作,共享廣播域。
- L3 模式:虛擬接口在網絡層(Layer 3)工作,獨立路由表。
2. 實現原理
- MAC 地址共享:所有 ipvlan 接口共享物理接口的 MAC 地址,僅通過 IP 地址區分。
- 流量隔離:L2 模式通過 VLAN 或防火墻規則隔離;L3 模式通過路由表隔離。
- 無混雜模式依賴:物理接口無需啟用混雜模式。
3. 適用場景
- MAC 地址受限的環境(如公有云虛擬機)。
- 需要節省 MAC 地址資源的容器網絡。
三、macvlan 設計案例
案例目標
- 在同一物理接口(如
eth0
)上創建兩個 macvlan 虛擬接口,分配給兩個網絡命名空間(ns1
和ns2
)。 - 驗證:
- 命名空間之間可互相通信。
- 命名空間可通過物理接口訪問外部網絡。
- 宿主機無法直接訪問命名空間 IP(隔離性驗證)。
實現步驟
-
創建命名空間
sudo ip netns add ns1 sudo ip netns add ns2
-
創建 macvlan 接口并分配到命名空間
# 物理接口 eth0 上為 ns1 創建 macvlan(bridge 模式) sudo ip link add macvlan1 link eth0 type macvlan mode bridge sudo ip link set macvlan1 netns ns1# 為 ns2 創建 macvlan sudo ip link add macvlan2 link eth0 type macvlan mode bridge sudo ip link set macvlan2 netns ns2
-
配置 IP 地址并啟用接口
sudo ip netns exec ns1 ip addr add 192.168.1.101/24 dev macvlan1 sudo ip netns exec ns1 ip link set macvlan1 up sudo ip netns exec ns1 ip route add default via 192.168.1.1 # 假設網關為 192.168.1.1sudo ip netns exec ns2 ip addr add 192.168.1.102/24 dev macvlan2 sudo ip netns exec ns2 ip link set macvlan2 up sudo ip netns exec ns2 ip route add default via 192.168.1.1
-
驗證功能
# 1. 命名空間之間互通 sudo ip netns exec ns1 ping -c 3 192.168.1.102# 2. 命名空間訪問外網 sudo ip netns exec ns1 ping -c 3 8.8.8.8# 3. 宿主機無法訪問命名空間 IP(隔離性) ping -c 3 192.168.1.101 # 應失敗
四、ipvlan 設計案例
案例目標
- 在物理接口
eth0
上創建兩個 ipvlan 虛擬接口(L2 模式),分配給兩個網絡命名空間(ns1
和ns2
)。 - 驗證:
- 命名空間之間可通信(同一子網)。
- 命名空間可通過物理接口訪問外網。
- 宿主機無法直接訪問命名空間 IP(隔離性)。
實現步驟
-
創建命名空間
sudo ip netns add ns1 sudo ip netns add ns2
-
創建 ipvlan 接口并分配到命名空間
# 物理接口 eth0 上為 ns1 創建 ipvlan(L2 模式) sudo ip link add ipvlan1 link eth0 type ipvlan mode l2 sudo ip link set ipvlan1 netns ns1# 為 ns2 創建 ipvlan sudo ip link add ipvlan2 link eth0 type ipvlan mode l2 sudo ip link set ipvlan2 netns ns2
-
配置 IP 地址并啟用接口
sudo ip netns exec ns1 ip addr add 192.168.1.101/24 dev ipvlan1 sudo ip netns exec ns1 ip link set ipvlan1 up sudo ip netns exec ns1 ip route add default via 192.168.1.1sudo ip netns exec ns2 ip addr add 192.168.1.102/24 dev ipvlan2 sudo ip netns exec ns2 ip link set ipvlan2 up sudo ip netns exec ns2 ip route add default via 192.168.1.1
-
驗證功能
# 1. 命名空間之間互通 sudo ip netns exec ns1 ping -c 3 192.168.1.102# 2. 命名空間訪問外網 sudo ip netns exec ns1 ping -c 3 8.8.8.8# 3. 宿主機無法訪問命名空間 IP(隔離性) ping -c 3 192.168.1.101 # 應失敗
五、macvlan 與 ipvlan 對比
維度 | macvlan | ipvlan |
---|---|---|
MAC 地址 | 每個虛擬接口獨立 MAC | 共享物理接口 MAC |
物理網絡要求 | 需支持混雜模式 | 無特殊要求 |
適用場景 | 容器需要獨立 MAC(如 Docker macvlan) | MAC 受限環境(如公有云) |
廣播流量處理 | 所有虛擬接口接收廣播 | L2 模式共享廣播域,L3 模式隔離 |
性能 | 高(內核直接轉發) | 高(無 MAC 地址轉換) |
六、總結
- macvlan 適合需要獨立 MAC 地址的場景,但依賴物理網絡支持混雜模式。
- ipvlan 適合 MAC 地址受限或物理網絡不支持混雜模式的場景,共享 MAC 但通過 IP 隔離。
- 隔離性驗證:無論使用 macvlan 還是 ipvlan,宿主機默認無法直接訪問命名空間 IP,確保網絡隔離。
- 擴展應用:可結合 VLAN 或 SDN 控制器實現更復雜的多租戶網絡隔離。