第12篇:VXLAN协议深度解析——智算网络的二层隧道(附Linux实战抓包)
系列文章入口如下:
网工进阶必看:《从TCP/IP到AI智算网络》系列总目录(持续更新)-CSDN博客
一、为什么需要 VXLAN?——从 VLAN 的 4094 到 VXLAN 的 1600 万
前11篇我们覆盖了从 Ethernet 到 BGP 的完整协议栈。在 AI 智算网络和数据中心中,传统二层技术遇到了根本性瓶颈:
| 维度 | VLAN (802.1Q) | VXLAN |
| 隔离数量 | 4094 个(12位 VLAN ID) | 1600 万个(24位 VNI) |
| 网络边界 | 受限于二层广播域(通常一个机架) | 跨越三层 IP 网络(跨机房/跨城市) |
| 虚拟机/GPU容器迁移 | 需保持同一二层子网 | 任意物理位置,IP 不变,网络不断 |
| 报文封装 | 在以太帧头插入 4 字节 Tag | MAC-in-UDP 隧道封装(整个帧打包) |
| 对中间设备要求 | 所有交换机需识别 802.1Q | 中间路由器只需 IP 转发,完全无感知 |
| 广播处理 | 同一 VLAN 内泛洪 | 可通过 EVPN 控制平面抑制广播 |
| 典型场景 | 传统企业网 | 云数据中心、AI 训练集群、多租户隔离 |
二、VXLAN 到底是什么?——从"快递包裹"说起(原理通俗版)
1. 先搞懂一个问题:为什么二层网络走不远?
要理解 VXLAN,先得理解传统二层网络的致命缺陷。
电脑之间通信靠 MAC 地址(二层)或 IP 地址(三层):
- 二层(MAC):只能在"同一个广播域"内通信,就像同一个办公室里喊一嗓子,大家都能听见。二层靠"泛洪+学习"来发现邻居——不知道 MAC 地址就广播问所有人。设备越多,广播流量越大,网络就堵死了。所以二层网络通常只能局限在一个机架甚至一个交换机下面。
- 三层(IP):可以跨网络路由,就像寄快递,经过多个中转站最终送到。IP 网络没有广播域限制,可以无限扩展(互联网就是证明)。
传统 VLAN(802.1Q)能解决网络隔离问题,但它只有 12 位 VLAN ID,最多 4094 个隔离网络——云数据中心动辄需要数万个虚拟网络,VLAN 根本不够用。
2. VXLAN 的核心思想:给二层帧"穿上 IP 的外套"
VXLAN 的发明者想了一个绝妙的办法:
既然三层 IP 网络可以走很远,那我把二层以太网帧"打包"进 UDP/IP 报文里,让它搭 IP 网络的"顺风车",不就能跨越千山万水了吗?
打个比方:
| 概念 | 类比 |
| 内层以太网帧 | 你要寄的一封信(写着收件人/发件人的真实地址) |
| VXLAN 封装 | 把信装进快递盒子,盒子上写的是快递站的地址(不是信上的地址) |
| 外层 UDP/IP | 快递盒外面的物流标签(源快递站 → 目的快递站) |
| VTEP | 快递站(负责收信装箱 / 拆箱送信) |
| Underlay 网络 | 物流运输网络(高速公路、中转站) |
| Overlay 网络 | 逻辑上"直接连通"的虚拟网络(看起来像在同一间办公室) |
关键点:中间的路由器只认外层 IP(快递站地址),完全不知道盒子里装的是什么(内层 MAC 帧)。就像快递员不需要拆开包裹就知道往哪送。
3. VXLAN 报文长什么样?逐层拆解
┌────────────────────────────────────────
│ 外层以太网头(14字节) │
│ DMAC: 下一跳路由器的 MAC │
│ SMAC: 本机物理网卡的 MAC │
│ Type: 0x0800 (IPv4) │
├────────────────────────────────────────
│ 外层 IP 头(20字节) │
│ SIP: 本端 VTEP 的 IP(如 192.168.164.128) │
│ DIP: 对端 VTEP 的 IP(如 192.168.164.129) │
│ TTL: 64 │
│ Protocol: 17 (UDP) │
├────────────────────────────────────────
│ 外层 UDP 头(8字节) │
│ Src Port: 随机端口(由内层帧哈希生成,用于 ECMP 负载均衡) │
│ Dst Port: 4789 (VXLAN 标准端口) │
├────────────────────────────────────────
│ VXLAN 头(8字节) │
│ Flags: 0x08 (I 位 = 1,表示 VNI 有效) │
│ Reserved: 24 位全 0 │
│ VNI: 虚拟网络标识(24位,范围 1~16777215) │
│ Reserved: 8 位全 0 │
├────────────────────────────────────────
│ 内层以太网帧(原始二层帧,完整保留) │
│ DMAC: 目的虚拟机的 MAC │
│ SMAC: 源虚拟机的 MAC │
│ EtherType: 0x0800 (IPv4) / 0x0806 (ARP) / ... │
│ Payload: 原始数据(如 ICMP、TCP 等) │
│ FCS: 帧校验序列 │
└────────────────────────────────────────
总封装开销 = 50 字节(外层以太14 + IP 20 + UDP 8 + VXLAN 8 = 50,不含内层以太头)。生产环境需调大 MTU 避免分片。
4. VXLAN 是怎么工作的?——完整通信流程
假设两台虚拟机 VM-A(10.0.0.1)和 VM-B(10.0.0.2)分别接在不同物理服务器上,但属于同一个 VXLAN 虚拟网络(VNI=100):

步骤 1:VM-A 发出原始帧
VM-A 要 ping VM-B(10.0.0.2),先 ARP 解析 MAC。发出的原始以太网帧:DMAC = VM-B 的 MAC,SMAC = VM-A 的 MAC,Payload = ICMP Echo Request。
步骤 2:VTEP-A 拦截并封装
VTEP-A 收到这个帧后:
- 查本地 FDB(转发数据库),知道 VM-B 的 MAC 对应远程 VTEP-B(192.168.164.129)
- 给原始帧"套娃":加上 VXLAN 头(VNI=100)→ UDP 头(Dst Port 4789)→ IP 头(SIP=128, DIP=129)→ 以太网头
步骤 3:穿越 Underlay
这个 UDP/IP 包在物理网络中像普通数据包一样被路由转发。中间路由器完全不关心 VNI 是什么,只管把 IP 包送到 192.168.164.129。
步骤 4:VTEP-B 解封装
VTEP-B 收到后:识别 Dst Port = 4789 → 解封装提取内层以太网帧 → 根据 VNI=100 确定目标虚拟网络 → 将原始帧转发给 VM-B。
步骤 5:VM-B 收到原始帧
VM-B 完全不知道中间经历了 VXLAN 封装/解封装,以为自己和 VM-A 就在同一个二层交换机下面。
5. VTEP 是怎么"知道"对端在哪的?——三种 MAC 学习方式
| 方式 | 原理 | 适用场景 |
| 泛洪+学习(数据平面) | 未知目的 MAC 时泛洪到所有 VTEP,收到回复后记录 MAC→VTEP 映射 | 小规模实验(本文采用) |
| 多播(组播) | 利用 Underlay 的 IGMP/PIM 多播将 BUM 流量发给组内所有 VTEP | 中规模部署 |
| EVPN 控制平面(BGP) | 用 BGP 协议分发 MAC/IP 可达性信息,完全替代泛洪 | 大规模数据中心/智算集群 |
泛洪+学习的具体过程:
- VTEP-A 收到 VM-A 发出的 ARP 请求(广播帧)
- VTEP-A 将其封装为 VXLAN 组播包,发给所有已知 VTEP
- VTEP-B 收到后解封装,转发给本地 VM-B
- VM-B 回复 ARP 响应(单播),VTEP-B 封装后发给 VTEP-A
- VTEP-A 从响应中提取 VM-B 的 MAC → VTEP-B 映射,写入本地 FDB
- 后续 VM-A 再发数据给 VM-B,VTEP-A 直接查表单播封装,不再泛洪
6. 什么是 Underlay 和 Overlay?
- Underlay(底层网络):物理交换机、路由器组成的真实 IP 网络,负责把数据包从 A 送到 B。你跑 OSPF、BGP 就是在 Underlay 上。
- Overlay(叠加网络):逻辑上构建在 Underlay 之上的虚拟网络,有自己的二层拓扑。VXLAN 就是 Overlay 的一种实现。
类比:Underlay 是"地面公路网",Overlay 是"公路上跑的集装箱卡车"——卡车里装的是什么(虚拟网络),公路完全不关心。
7. VXLAN 核心术语速查
| 术语 | 说明 |
| VTEP(VXLAN Tunnel Endpoint) | 隧道端点,负责封装/解封装,通常是服务器或交换机 |
| VNI(VXLAN Network Identifier) | 24 位虚拟网络标识(类似 VLAN ID,但空间大 4000 倍) |
| Underlay | 底层物理网络(IP 可达,跑 OSPF/BGP) |
| Overlay | 叠加在 Underlay 上的虚拟二层网络(VXLAN 隧道内) |
| BUM 流量 | Broadcast(广播)、Unknown unicast(未知单播)、Multicast(多播),传统需泛洪 |
三、实验环境搭建(Linux 原生 VXLAN + VMware)
拓扑

配置步骤
节点 A(.128):
# 创建 VXLAN 接口(点对点模式,适合实验)
sudo ip link add vxlan0 type vxlan \
id 100 \
dstport 4789 \
local 192.168.164.128 \
remote 192.168.164.129 \
dev ens33
# 配置 Overlay IP
sudo ip addr add 10.0.0.1/24 dev vxlan0
sudo ip link set up dev vxlan0
# 验证
ip link show vxlan0
ip addr show vxlan0

节点 B(.129):
sudo ip link add vxlan0 type vxlan \
id 100 \
dstport 4789 \
local 192.168.164.129 \
remote 192.168.164.128 \
dev ens33
sudo ip addr add 10.0.0.2/24 dev vxlan0
sudo ip link set up dev vxlan0
验证连通性
# 从 .128 ping overlay IP
ping 10.0.0.2

# 查看 FDB(转发数据库,含 MAC→VTEP 映射)
bridge fdb show dev vxlan0

1. 全零 MAC 条目(默认泛洪路由)
00:00:00:00:00:00 dst 192.168.164.129 via ens33 self permanent
- 00:00:00:00:00:00:全零 MAC 地址,代表未知单播、广播、组播(BUM)流量的默认转发目标。
- dst 192.168.164.129:在对端 IP 为 192.168.164.129 的 VTEP 上终结(本文实验采用静态单播点对点模式)。
- via ens33:底层(Underlay)物理出口网卡为 ens33,封装后的 UDP 包从此发出。
- self:表示该条目属于本设备(vxlan0 接口自身维护)。
- permanent:永久静态条目,由人工配置(如 remote 参数)生成,不会老化消失。这是 VXLAN 泛洪流量的“兜底”路径。
2. 具体 MAC 条目(动态学习结果)
e6:6f:7f:06:6a:b3 dst 192.168.164.129 self
- e6:6f:7f:06:6a:b3:对端(或跨 VXLAN 通信的远端主机)的具体 MAC 地址,通常是 Overlay 网络内的对端设备 MAC。
- dst 192.168.164.129:该 MAC 对应的 VTEP 对端 IP。
- self:同样属于本接口。
- (无 permanent):此条目通常为动态学习(泛洪后收到对端回复,自动记录映射),会随流量老化(若开启老化机制);若实验手动添加也会显示 permanent,此处未标注则多为动态。
四、Wireshark 抓包解析
0. 抓包实操,开两个终端进行抓包,不要直接打开wireshark抓包,不然抓不到vxlan完整报文
# 在 128 上执行(物理网卡 ens33)
sudo tcpdump -i ens33 udp port 4789 -w vxlan_outer.pcap

# 另开窗口触发流量
ping 10.0.0.2

抓包结果默认存在home文件夹


打开一个报文,可以先看到有VXLAN标识:

报文展开具体内容如下:


1. 外层以太网头(Underlay 物理网络)
- 源 MAC:00:50:56:37:cb:08(VMware 虚拟网卡,即 128 的 ens33)
- 目的 MAC:00:0c:29:48:5d:fa(对端 129 的 ens33)
- 含义:这是物理(或虚拟网桥)链路上的真实二层帧头,中间 Underlay 设备只关注这一层。
2. 外层 IP + UDP 头(VXLAN 封装载体)
- 外层 IP:源 192.168.164.128,目的 192.168.164.129(即两个 VTEP 的 Underlay IP)。
- TTL:64,协议号 17(UDP)。
- UDP 头:
- 目的端口:4789(IANA 标准 VXLAN 端口,Wireshark 据此自动解析)。
- 源端口:37535(由内层报文哈希生成,用于 Underlay 的 ECMP 负载均衡)。
- 长度:114 字节(包含 8 字节 UDP 头 + 8 字节 VXLAN 头 + 98 字节内层帧)。
3. VXLAN 头(隧道标识)
- Flags:0x0800,其中 I 位(VNI 有效位)置 1。
- VNI:100(对应你配置的 id 100,实现多租户隔离)。
- 含义:标志着内层二层帧属于哪个虚拟网络,对端 VTEP 据此决定解封装后交给哪个本地桥接端口。
4. 内层以太网头(Overlay 虚拟网络)
- 源 MAC:8a:9d:e0:15:83:da(128 的 vxlan0 虚拟 MAC,与前轮抓包一致)。
- 目的 MAC:e6:6f:7f:06:6a:b3(129 的 vxlan0 虚拟 MAC,正是前文 FDB 表中学习到的条目)。
- 类型:IPv4(0x0800)。
- 含义:这是被“装进箱子”的原始二层帧,Underlay 设备完全不可见此 MAC。
5. 内层 IP + ICMP(真实业务流量)
- 内层 IP:源 10.0.0.1,目的 10.0.0.2(Overlay 网络的真实通信 IP)。
- 内层 IP 总长:84 字节(20 字节头 + 64 字节 ICMP)。
- ICMP:Type 8(Echo Request / Ping),标识符 28,序列号 1,数据 48 字节。
- 关联验证:Wireshark 标记 [Response frame: 2],证明往返互通;此 98 字节(14 以太头 + 84 IP/ICMP)正是前轮在 vxlan0 上抓到的“纯净报文”。
6. 抓包排障要点
| 现象 | 可能原因 | 排查方向 |
| 抓不到任何 4789 包 | Overlay 无流量 / 抓包接口选错 | 确认 ping 10.0.0.2 正在执行;换 -i any 试 |
| 有 4789 包但内层不是 ICMP | 其他 Overlay 流量干扰 | 过滤 vxlan && icmp 精准定位 |
| VXLAN 头 Flags 不是 0x08 | 抓到异常报文或非标准实现 | 检查对端 VTEP 配置 |
| 内层 IP 不对 | 本地 overlay 接口 IP 配错 | ip addr show vxlan0 确认 |
五、VXLAN 与智算网络的关联(系列主线)
1. 为什么 AI 训练集群需要 VXLAN?
| 场景 | 传统网络 | VXLAN 方案 |
| GPU 服务器跨机架通信 | 二层受限,需绕行 | VXLAN 隧道直连,逻辑二层打通 |
| 租户隔离 | VLAN 4094 上限 | 1600 万 VNI,每个训练任务独立网络 |
| RDMA 跨三层 | 需复杂路由配置 | VXLAN overlay 透明承载 RoCEv2 |
| 容器化部署 | 网络插件复杂 | K8s CNI(Calico/Cilium)底层用 VXLAN |
| 虚拟机/GPU容器热迁移 | IP 必须不变 | Overlay 网络屏蔽物理位置,迁移无感知 |
2. VXLAN + RDMA = 智算网络终极方案
RDMA 系列(RoCEv2)需要三层 IP 可达。在大规模 AI 集群中:
- Underlay:用 BGP(第11篇)提供 IP 可达性。
- Overlay:用 VXLAN 创建虚拟二层网络,让 RDMA 流量在隧道内传输,避免广播风暴。
- 控制平面:后续将引入 EVPN 替代泛洪学习,或结合 SRv6 实现更灵活的流量工程。
3. 性能考量
VXLAN 封装引入 50 字节额外开销。在 1500 MTU 网络中,内层有效载荷减少,可能导致分片。生产环境建议:
- 增大 Underlay MTU 到 1600+(推荐 9000,即 Jumbo Frame)。
- 启用 TSO/GSO 卸载(CPU 减负)。
- 使用硬件 VTEP(智能网卡/DPU 卸载 VXLAN 封装)。
六、FRR / Linux 实测踩坑记录
坑 1:VXLAN 接口创建失败
bash
# 报错:RTNETLINK answers: Operation not supported# 原因:内核未加载 VXLAN 模块# 解决:sudo modprobe vxlan# 验证:lsmod | grep vxlan
坑 2:ping 不通 overlay IP
bash
# 排查步骤:# 1. 确认 Underlay 连通性
ping 192.168.164.129
# 2. 确认 VXLAN 接口状态
ip link show vxlan0 # 需为 UP
# 3. 确认 FDB 条目
bridge fdb show dev vxlan0 # 应有对端 MAC→VTEP 映射
# 4. 抓包确认封装sudo tcpdump -i ens33 udp port 4789 -n
坑 3:MTU 问题导致大包丢弃
bash
# 现象:小包 ping 通,大包(>1400)不通# 原因:VXLAN 封装后超过 1500 字节,中间设备丢包# 解决:增大 overlay 接口 MTUsudo ip link set vxlan0 mtu 1450# 或增大物理接口 MTU(需交换机配合,推荐 9000)
坑 4:多播 vs 单播模式
bash
# 本文用 static remote(单播点对点),适合小规模实验# 生产环境用多播(需 Underlay 支持 IGMP/PIM):sudo ip link add vxlan0 type vxlan \
id 100 \
dstport 4789 \
local 192.168.164.128 \
group 239.1.1.1 \
dev ens33
坑 5:重启后配置丢失
bash
# ip link add 是临时配置,重启消失# 解决:写入 netplan 或 /etc/rc.local# netplan 示例(/etc/netplan/01-vxlan.yaml):
network:
version: 2
tunnels:
vxlan0:
mode: vxlan
local: 192.168.164.128
remote: 192.168.164.129
id: 100
port: 4789
link: ens33
七、本文要点速览
| 要点 | 说明 |
| VXLAN = MAC-in-UDP 隧道 | 二层帧封装在 UDP/IP 中,穿越三层网络 |
| VNI 24 位 | 1600 万虚拟网络,远超 VLAN 的 4094 |
| 标准端口 4789 | 外层 UDP 目的端口,Wireshark 据此解析 |
| VTEP 是封装端点 | 服务器或交换机承担,负责"装箱/拆箱" |
| 三种 MAC 学习方式 | 泛洪+学习 → 多播 → EVPN(最优) |
| Underlay + Overlay | Underlay 跑 BGP(IP 可达),Overlay 跑 VXLAN |
| 智算网络价值 | RDMA 跨三层、多租户隔离、GPU 跨机架通信 |
| MTU 需调优 | 封装开销 50 字节,建议 Jumbo Frame |
附录:命令速查卡
bash
# 创建 VXLAN 接口(点对点)
ip link add vxlan0 type vxlan id <VNI> dstport 4789 \
local <本地IP> remote <对端IP> dev <物理接口>
ip addr add <overlay_IP>/24 dev vxlan0
ip link set up dev vxlan0
# 查看状态
ip link show vxlan0
bridge fdb show dev vxlan0
ip -d link show vxlan0 # 详细参数
# 抓包
tcpdump -i <物理接口> udp port 4789 -w vxlan.pcap
# 清除
ip link del vxlan0
# 内核模块检查
lsmod | grep vxlan
modprobe vxlan
系列进度:第12篇 VXLAN 完成。下一篇将进入 SRv6(Segment Routing IPv6),基于 IPv6 数据平面的段路由技术,实现智算网络的灵活流量工程与业务链编排。敬请期待!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)