IPvlan更适合高密度容器场景,因其共享MAC地址可避免冲突、降低开销,并支持L2/L3模式灵活适配网络拓扑;但nmcli不原生支持ipvlan类型,需用ip link手动创建后交由NetworkManager托管。

IPvlan 的模式选择与适用场景
父接口(如 eth0)启用 IPvlan 后,所有子接口共享同一 MAC,仅 IP 独立:
- L2 模式:类似交换机行为,同网段容器可二层互通;跨网段通信需经父接口路由转发,适合扁平二层网络(如 VXLAN underlay)
- L3 模式:类似路由器行为,不同子网容器可直通(如 10.10.1.0/24 和 10.10.2.0/24),无需额外网关配置,适合多租户隔离网络
注意:一个物理接口只能启用一种模式,且必须在创建 IPvlan 设备前确定,不可动态切换。
用 ip link 创建 IPvlan 设备并交由 NM 管理
NetworkManager 默认不识别手动创建的 IPvlan 接口(如 eth0.ipvlan1),需显式声明其为“受管设备”,否则重启后丢失或无法配置 IP:
- 创建 L3 模式 IPvlan 子接口:
ip link add link eth0 eth0.ipvlan1 type ipvlan mode l3 - 启用接口:
ip link set eth0.ipvlan1 up - 告知 NetworkManager 托管该设备:
nmcli device set eth0.ipvlan1 managed yes - 为该接口添加连接配置(静态 IP 示例):
nmcli con add type ethernet con-name ipvlan1 ifname eth0.ipvlan1 ipv4.addresses 10.10.1.10/24 ipv4.method manual autoconnect yes
若需 DHCP,将 ipv4.method manual 替换为 auto,并确保 DHCP 客户端能正确使用 Client ID(见下一点)。
DHCP 场景必须配置 Client ID
因所有 IPvlan 接口 MAC 相同,标准 DHCP 流程会误判为同一主机反复请求,导致地址分配失败或冲突:
- 为每个 IPvlan 连接设置唯一 Client ID:
nmcli con mod ipvlan1 ipv4.dhcp-client-id "ipvlan-001" - 对应 DHCP 服务端(如 dnsmasq 或 ISC DHCP)需配置
dhcp-client-identifier作为匹配字段,而非默认的hardware-address - 验证是否生效:
nmcli -f IP4.DHCP_CLIENT_ID con show ipvlan1
容器运行时集成建议(以 Docker 为例)
IPvlan 网络需由容器引擎直接驱动,nmcli 仅负责宿主机侧基础接口准备:
- 先完成上述 IPvlan 接口创建与 IP 配置(如 eth0.ipvlan1 已 up 并有 IP)
- Docker 创建网络时指定父接口和模式:
docker network create -d ipvlan --subnet=10.10.1.0/24 --gateway=10.10.1.1 -o ipvlan_mode=l3 -o parent=eth0 ipvlan-net - 容器启动后自动获得独立 IP,流量绕过宿主机 netfilter,IO 延迟更低、吞吐更高
不建议在 nmcli 创建的 IPvlan 接口上再叠加网桥或 VLAN——这会引入冗余封装,抵消 IPvlan 的轻量优势。











