ᕕ( ᐛ )ᕗ Jimyag's Blog

macvlan 与 ipvlan 介绍

· 686 字 · 约 4 分钟

本文基于 Linux 内核 IPVLAN Driver HOWTO 及内核 macvlan/ipvlan 驱动与 iproute2(Linux 下常用的网络配置工具,提供 iptc 等命令)的通用行为整理,介绍 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 连接跟踪。

模式 说明(据内核文档)
l2 TX 在 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 之间可以互相通信。
private slave 之间不能直接通信,仅能与外部通信。
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 更合适。

小结

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

文中简称与全称对照

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

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

参考链接:

#Network #Macvlan #Ipvlan #Linux