第178篇:VXLAN 报文封装与 UDP 端口

关键词

VXLAN、VNI、UDP 4789、MAC-in-UDP、VTEP、外层封装、MTU 适配


一、VXLAN 概述

1.1 什么是 VXLAN

VXLAN(Virtual Extensible LAN) 是一种 MAC-in-UDP 的隧道封装技术,由 VMware 和 Cisco 等提出(RFC 7348),用于在 IP 网络上构建二层 Overlay 网络。

1.2 为什么需要 VXLAN

传统 VLAN(802.1Q)只有 12 位标识符,最多 4094 个 VLAN,在数据中心多租户场景中远远不够:

VLAN ID:12 位 → 4,096 个
VXLAN VNI:24 位 → 16,777,216 个 → 1677 万个

VXLAN 解决了:
  - VLAN 数量不足
  - 数据中心网络规模限制(STP)
  - 虚拟机迁移范围受限

二、VXLAN 封装结构

2.1 完整封装

原始客户以太网帧: | 客户 MAC 头 | 客户 IP 头 | 客户 Payload | FCS | | --- | --- | --- | --- |

VXLAN 封装后: | 外层 MAC头 | 外层 IP头 | 外层 UDP头 | VXLAN 头 | 原始客户以太网帧 (不包含客户 FCS) | 外层 FCS | | --- | --- | --- | --- | --- | --- | 14B 20B 8B 8B 1542B 4B (ETH) (IP) (UDP) (VXLAN)

2.2 各层详细说明

外层 MAC 头(14 字节):

目的 MAC:下一跳路由器(Spine)的 MAC
源 MAC:本地 VTEP 的 MAC
EtherType:0x0800(IPv4)

外层 IP 头(20 字节):

目的 IP:远端 VTEP 的 IP 地址
源 IP:本地 VTEP 的 IP 地址
Protocol:17(UDP)

外层 UDP 头(8 字节):

源端口:基于内层流的 Hash(用于 ECMP 负载均衡)
目的端口:4789(IANA 分配)或 8472(Linux 传统端口)
UDP Length:VXLAN 包总长
UDP Checksum:通常为 0(Linux)/ 可计算

VXLAN 头(8 字节):

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R|R|R|R|I|R|R|R|              Reserved                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                VXLAN Network Identifier (VNI)                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Reserved                                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

  I bit = 1(VNI 有效)
  VNI = 24 位网络标识符
  Reserved = 保留位

三、UDP 端口与负载均衡

3.1 源端口 Hash

VXLAN 使用的源端口号基于内层数据流的 Hash

源端口 = Hash(内层 MAC + IP + L4 Port) % 范围 + 49152

用途:使得不同的内层流有不同的外层 UDP 源端口
→ Spine 节点可以根据外层 UDP 源端口进行 ECMP 负载均衡
多条流通过 VXLAN 隧道:

流 1(TCP 10.1.1.1:1234 → 10.2.2.2:80)
  → 外层 UDP 源端口 = 49152

流 2(TCP 10.1.1.1:5678 → 10.2.2.2:443)
  → 外层 UDP 源端口 = 51234

流 3(TCP 10.1.1.2:1234 → 10.2.2.2:80)
  → 外层 UDP 源端口 = 53210

Spine 根据外层 UDP 源端口将三条流分配到不同 ECMP 路径

3.2 端口分配

UDP 目的端口 使用方 说明
4789 IANA 分配(RFC 7348) 标准端口
8472 Linux 内核 VXLAN 早期 Linux 使用(VTEP 厂商兼容)

注意:两个端口不兼容。部署时需确认所有 VTEP 使用相同的 UDP 端口号。


四、MTU 适配

4.1 VXLAN 额外开销

VXLAN 封装带来的开销:

封装层 字节数
外层 MAC 头 14
外层 IP 头 20
外层 UDP 头 8
VXLAN 头 8
总计 50
客户 MTU = 1500 字节
VXLAN 封装后 = 1500 + 50 = 1550 字节
↓
Underlay 接口 MTU 必须 ≥ 1550!

4.2 解决方案

方案一:增大 Underlay MTU(推荐)

# 在所有 Underlay 接口上设置 MTU
# 华为设备
interface GigabitEthernet0/0/0
 mtu 1600                                # 确保 L3 MTU 足够大
#
# Cisco NX-OS
interface ethernet 1/1
 mtu 9216                                # 数据中心常用 jumbo frame

方案二:MSS Clamping(仅治标,适用于 TCP 流量)

# 在 VTEP 的三层接口配置
interface Vlanif100
 tcp adjust-mss 1436                      # 1500 - 20(IP) - 20(TCP) - 14(预留)

推荐做法:不是调整 MSS,而是直接使用 Jumbo Frame(MTU 9000)

客户帧大小 VXLAN 后大小 推荐 Underlay MTU
1500 1550 ≥ 1600
9000(Jumbo) 9050 ≥ 9100

五、VXLAN 与 VLAN 的对比

对比维度 VLAN VXLAN
标识符大小 12 位 24 位
数量 4,096 1,677 万
封装 插入 4 字节 802.1Q 头 MAC-in-UDP(50 字节开销)
网络范围 二层广播域(STP 限制) 跨 IP 网络(无限)
底层要求 二层可达 三层 IP 可达
MAC 表 所有 VTEP 都需要 MAC 表 仅本地 VTEP
多租户 VLAN 数量受限 VNI 充足

六、VXLAN 的转发类型

6.1 已知单播

VTEP1 有 VTEP2 的 MAC 映射:

内层:CE1 MAC → CE2 MAC(客户帧)
外层:VTEP1 IP → VTEP2 IP
VXLAN: VNI = 100
UDP: 源端口(Hash) → 4789

6.2 BUM(广播/未知单播/组播)

BUM 的转发方式决定 VTEP 发现和泛洪策略:

BUM 方式 说明 适用场景
组播 Underlay 组播群组承载 BUM 传统方案(需组播支持)
Ingress Replication VTEP 逐个复制到所有远端 VTEP 当前主流(无需组播)
P2MP 隧道 核心层复制 大规模场景

七、VXLAN 配置示例(华为)

7.1 基本配置

# VTEP1 配置
bridge-domain 10
 vxlan vni 100                                    # VNI = 100
#
interface Nve1                                    # NVE = Network Virtual Endpoint
 source 1.1.1.1                                    # VTEP 源 IP(Loopback)
 vni 100 head-end peer-list protocol bgp           # 通过 BGP EVPN 学习对端
#
interface GigabitEthernet0/0/0.100
 vlan-type dot1q 100
 bridge-domain 10

7.2 验证

# 查看 VXLAN 隧道
<VTEP1> display vxlan tunnel

Tunnel ID    Source        Destination    VNI    State
0x1000001    1.1.1.1       2.2.2.2        100    Up

# 查看 VNI 信息
<VTEP1> display vxlan vni 100

VNI            : 100
Bridge-domain  : 10
State          : Up
Tunnels        : 1
Source         : 1.1.1.1

八、总结

知识点 核心要点
VXLAN 封装 MAC-in-UDP,外层 IP/UDP + VXLAN 头
VNI 24 位标识,1677 万个虚拟网络
UDP 目的端口 4789(标准)或 8472(Linux)
UDP 源端口 基于内层流的 Hash,用于 ECMP
MTU 开销 50 字节,需调大 Underlay MTU
BUM 方式 Ingress Replication 为主,组播/ P2MP 为辅

九、思考

  1. VXLAN 封装包括哪些层次?从内到外依次是什么?
  2. VNI 和 VLAN ID 的位数分别是多少?VXLAN 为什么能支持更多租户?
  3. VXLAN 的 UDP 源端口为什么要基于内层流进行 Hash?
  4. VXLAN 带来的 MTU 开销是多少?如何解决 MTU 问题?
  5. Ingress Replication 转发 BUM 流量的原理是什么?

下篇预告:第179篇《VXLAN 隧道与 VTEP 发现》——VTEP 之间如何发现对方?VXLAN 隧道的建立维护和 Head-end 复制。