
本文基于 [Linux 内核 IPVLAN Driver HOWTO](https://docs.kernel.org/networking/ipvlan.html) 及内核 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 示例）：

```bash
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）。配置示例（内核文档）：

```bash
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 欺骗实践                                    |

参考链接：

- [IPVLAN Driver HOWTO (The Linux Kernel documentation)](https://docs.kernel.org/networking/ipvlan.html)

