一、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.1 sudo 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.1 sudo 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 控制器实现更复杂的多租户网络隔离。