jimyag's Blog

macvlan 与 ipvlan 介绍

本文基于 Linux 内核 IPVLAN Driver HOWTO 及内核 macvlan/ipvlan 驱动与 iproute2(Linux 下常用的网络配置工具,提供 ip、tc 等命令)的通用行为整理,介绍 macvlan 与 ipvlan 的差异、各自模式、特点及优缺点。不涉及 Docker 或其它容器运行时,仅讨论内核与 ip link 层面的能力。

二者是什么、主要差异

macvlan 和 ipvlan 都是 Linux 内核提供的网络虚拟化驱动,可以在同一块物理网卡(master,主设备/父接口)上创建多个虚拟网卡(slave,从设备),每个 slave 可放入不同网络命名空间,拥有自己的 IP;macvlan 下每个 slave 还有独立 MAC(Media Access Control,媒体访问控制地址,即网卡物理地址),对外看起来像多台设备直连在同一物理链路上。

核心差异(据内核 IPVLAN HOWTO):ipvlan 使用 L3(Layer 3,三层,网络层,IP 与路由)在多个 slave 之间做复用/解复用,因此 master 与 slave 共享 L2(Layer 2,二层,数据链路层,以太网与 MAC);macvlan 则为每个 slave 分配独立 MAC,在 L2 上靠 MAC 区分。带来的直接后果是:

  • macvlan:每个 slave 一个 MAC,需要物理网卡支持“一个端口多个 MAC”(混杂模式),交换机/上游可能对 MAC 数量有限制或产生 CAM(Content Addressable Memory,内容可寻址内存,交换机里存 MAC 与端口对应关系的表)表压力。
  • ipvlan:所有 slave 共用父接口(parent,即创建 macvlan/ipvlan 时指定的那张物理网卡)的 MAC,对外只看到一个 MAC,不同 slave 靠 IP 区分;不增加 MAC 数量,适合“每端口只允许一个 MAC”或 MAC 容量紧张的环境。

配置上二者都通过 iproute2 的 ip link 创建,例如(内核文档中的 ipvlan 示例):

1
ip link add link <master> name <slave> type ipvlan [ mode MODE ] [ FLAGS ]

macvlan 语法类似,type macvlan,并指定对应 mode。

macvlan 的模式与特点

macvlan 驱动支持四种模式,区别在于:同一父接口(parent,即作为“主设备”的那块物理网卡)上的多个 slave 之间能否通信、以及流量是留在主机内转发还是必须经物理口发到外部设备。下面用“同机 slave”指同一父接口上的 macvlan slave,“外部”指物理链路对端的交换机或其它主机。

模式说明
bridge默认。同一父接口上的 macvlan slave 之间可以互相通信,流量在主机内做类似桥的本地转发。
vepa所有流量都从父接口发出,由外部交换机/设备按 802.1Qbg(VEPA)做转发;同一父接口上的 slave 间通信也要经外部设备。
passthru每个父接口只允许一个 macvlan slave,该 slave 与物理接口一一绑定,隔离性最强。
private同一父接口上的 macvlan slave 之间不直接通信,仅能与外部通信。

四种模式详解

假设主机上有一块物理网卡 eth0 作为父接口,在其上创建了多个 macvlan slave(例如 slave A、slave B),并可能还有其它主机或设备接在同一台交换机上。

bridge 模式

  • 同机 slave 之间(A ↔ B):报文在主机内核里直接转发,不经过 eth0 发到线缆。相当于在主机内部有一个“小桥”,把挂在同一父接口上的 macvlan 口都接在这个桥上,同桥上的口之间二层互通。
  • slave 与外部之间(A 或 B ↔ 交换机/其它主机):报文从 eth0 发出或从 eth0 收进,和普通网卡一样。
  • 广播/组播:可在同机 slave 之间以及通过 eth0 向外部扩散(具体视实现而定)。
  • 典型用途:同一台机上的多个虚拟设备既要互相访问,又要访问外网,且希望同机流量不出主机、延迟低、不占上行带宽。

vepa 模式(VEPA:Virtual Ethernet Port Aggregator,虚拟以太网端口聚合器;802.1Qbg 为定义该行为的 IEEE 标准)

  • 同机 slave 之间(A ↔ B):报文也必须先从 eth0 发到外部交换机,再由交换机决定往哪送。也就是说,A 发往 B 的包会:主机 → eth0 → 线缆 → 交换机;交换机需要把该包再送回到同一台主机的 eth0 上,才能被 B 收到。这要求交换机支持“同一端口进、同一端口出”的反射能力,即 hairpin(发往同机另一 slave 的流量经交换机再打回本机端口)。
  • slave 与外部之间:同样经 eth0 进出,由交换机正常转发。
  • 特点:所有流量都经物理口和交换机,没有“主机内直连”的路径;便于在交换机上做统一策略、监控或计费,但同机通信多一跳、依赖交换机能力。

private 模式

  • 同机 slave 之间(A ↔ B):不允许。A 发往 B 的包不会被 B 收到;内核不会把同机 slave 之间的流量在本地交付。若 A 把包发往 B 的 MAC,包会从 eth0 发到交换机,但交换机一般不会把目的 MAC 为 B 的包再送回同一端口(或即使送回,驱动/模式也可能不把“从外部收回的、目的为同机另一 slave”的包交给 B),因此同机 slave 在逻辑上彼此不可达。
  • slave 与外部之间:可以。A、B 各自可以和交换机另一侧的设备通信。
  • 典型用途:同一父接口上多台虚拟设备只要“能上联、能访外”,彼此之间必须完全隔离、不能二层直连。

passthru 模式

  • 每个父接口(如 eth0)上只能创建一个 macvlan slave,即“一块物理网卡 ↔ 一个 macvlan 设备”的一一对应。不能再在同一 eth0 上创建第二个 macvlan slave。
  • 该唯一 slave 与物理接口强绑定,流量行为接近直接使用物理口,隔离性、可见性都最强。
  • 典型用途:需要把一整块物理网卡独占给某一个命名空间/虚拟机使用,且不允许再在该物理口上虚拟出多个 macvlan。

小结(谁和谁能通、流量路径)

模式同机 slave 之间流量路径(同机)slave 与外部
bridge可以主机内转发,不出网卡经父接口
vepa可以(经交换机)出父接口 → 交换机 → 再回本机经父接口
private不可以不交付经父接口
passthru不适用(仅 1 个 slave)不适用经父接口

特点与限制:

  • 每个 slave 有独立 MAC,对外像多台设备直连物理网段,适合需要独立 MAC 或按 MAC 管理的场景。
  • 主机默认命名空间与 macvlan slave 所在命名空间不能直接通过该 macvlan 接口通信,这是内核设计;若需主机与 slave 互通,需在主机上再建一个同父接口的 macvlan 并配同网段 IP,或通过其它网络路径。
  • 需要父接口支持多 MAC(混杂模式);虚拟接口很多时会导致“一个端口大量 MAC”,可能引发交换机 CAM 表压力或策略限制。
  • 内核要求:Linux 3.9 及以上(建议 4.0+),仅 Linux。

优点:拓扑直观、slave 直接暴露在物理网段、无需 NAT(Network Address Translation,网络地址转换)即可被外部按 IP/MAC 访问。缺点:主机与 slave 不直通、依赖混杂模式与交换机策略、MAC 数量多时可能影响网络规模与稳定。

ipvlan 的模式与特点

(以下 ipvlan 内容来源:内核 IPVLAN Driver HOWTO。)

ipvlan 有两类参数:运行模式(mode)和模式标志(flag)。配置示例(内核文档):

1
2
3
ip link add link <master> name <slave> type ipvlan [ mode MODE ] [ FLAGS ]
   MODE: l3 (default) | l3s | l2
   FLAGS: bridge (default) | private | vepa

运行模式(MODE):l2 为二层模式,l3 为三层模式(默认),l3s 为 L3-symmetric(L3 对称),支持 iptables 连接跟踪。

模式说明(据内核文档)
l2TX 在 slave 所属协议栈上处理到 L2,再交给 master 发出;slave 可收发包、支持组播/广播。与 macvlan 的“同一网段直连”类似,但共用父接口 MAC。
l3默认。TX 在 slave 上处理到 L3,再转到 master 的协议栈做 L2 与路由;slave 不收不发组播/广播,路由由 master 所在命名空间控制。
l3s与 l3 类似,但支持 iptables 连接跟踪(L3-symmetric),便于有状态过滤与 NAT,性能略低于 l3。

模式标志(FLAGS):

标志说明(据内核文档)
bridge默认。同一 master 下的 slave 之间可以互相通信。
privateslave 之间不能直接通信,仅能与外部通信。
vepa将转发交给外部实体(802.1Qbg);ipvlan 使用 master 的 MAC,VEPA 下相邻节点通信时源/目的 MAC 可能相同,交换机可能发 redirect。

特点与限制:

  • 不分配新 MAC,所有 slave 共用父接口 MAC,网络侧只看到一个 MAC、多个 IP,适合“每端口单 MAC”或 MAC 容量紧张的环境。
  • 不依赖 Linux 桥,slave 直接挂在父接口(或 802.1Q 子接口)上,实现简单、少一跳。
  • L3 模式下去掉广播/组播,无桥接环路与 BPDU(Bridge Protocol Data Unit,桥协议数据单元,用于生成树等)扩散,故障域可限于单机,适合大规模、可预测的 underlay(底层物理网络,相对 overlay 虚拟网络而言)。
  • 主机默认命名空间与 ipvlan slave 所在命名空间设计上不直通;若需互通,需在主机上配置路由或额外接口。
  • 内核要求:Linux 4.2 及以上(更早版本有已知问题)。

优点:单 MAC、适合严格网络策略与大规模部署;L3/L3s 可做多网段路由与策略。缺点:主机与 slave 不直通需额外配置;L3 需自行做路由分发;VEPA 模式有 MAC 相同等限制。

内核文档:何时选 macvlan、何时选 ipvlan

Linux 内核 IPVLAN HOWTO 中的“What to choose (macvlan vs. ipvlan)”建议,在以下情况可优先考虑 ipvlan:

  • 主机所连交换机/路由器策略只允许每端口一个 MAC。
  • 在一条 master 上创建的虚拟设备数量很多,导致 MAC 数量超过 NIC(Network Interface Card,网卡)能力、进入混杂模式并带来性能或稳定性问题。
  • slave 将放入不可信/敌对网络命名空间,L2 可能被篡改或滥用;ipvlan 用 L3 复用,与 L2 解耦,更易控制。

反之,若需要每个设备有独立 MAC、与现有按 MAC 管理的系统集成、且网络允许多 MAC,则 macvlan 更合适。

小结

维度macvlanipvlan
复用方式L2,每设备独立 MACL3(及 L2 模式),共用父接口 MAC
典型模式bridge / vepa / private / passthrul2 / l3 / l3s + bridge / private / vepa
MAC 数量每 slave 一个,易膨胀仅父接口一个
主机与 slave 直通不支持(需额外方案)不支持(需额外方案)
内核要求3.9+(建议 4.0+)4.2+
适用场景需独立 MAC、直连物理网段每端口单 MAC、大规模、多网段路由、L2 不可信环境

文中简称与全称对照

下表汇总正文中出现的简称及全称或含义,便于查阅。

简称 / 英文全称 / 含义
L2Layer 2,二层,数据链路层(以太网、MAC、帧)
L3Layer 3,三层,网络层(IP、路由)
L3sL3-symmetric,L3 对称模式(ipvlan 下支持 iptables 连接跟踪等)
MACMedia Access Control,媒体访问控制地址(网卡物理地址)
master主设备,指父物理网卡
slave从设备,指 macvlan/ipvlan 下的虚拟网卡
parent父接口,即创建 macvlan/ipvlan 时指定的那张物理网卡
VEPAVirtual Ethernet Port Aggregator,虚拟以太网端口聚合器
802.1QbgIEEE 标准,定义 VEPA、hairpin 等虚拟以太网端口行为
hairpin同一端口进、同一端口出的反射(如 VEPA 下同机 slave 间流量经交换机再打回本机)
bridge桥模式(此处指 macvlan/ipvlan 下“同机 slave 可互通”的模式名)
CAMContent Addressable Memory,内容可寻址内存(交换机中存 MAC 与端口对应关系的表)
BPDUBridge Protocol Data Unit,桥协议数据单元(生成树等协议用)
NICNetwork Interface Card,网卡
NATNetwork Address Translation,网络地址转换
underlay底层物理网络
overlay在 underlay 之上构建的虚拟网络
ToRTop of Rack,架顶交换机(机柜顶部接入交换机)
BCP38Best Current Practice 38,常用反 IP 欺骗实践

参考链接:

#Network #Macvlan #Ipvlan #Linux