4. VXLAN深度解析
VXLAN(Virtual eXtensible LAN)是多云 Overlay 网络中最常见的封装协议之一。它要解决的核心问题是:在底层 IP 网络(Underlay)之上,构建一个可以容纳海量租户、支持虚拟机跨三层迁移、并且对底层拓扑变化相对不敏感的虚拟二层网络。理解 VXLAN,关键要抓住四个对象:封装报文头、VNI、VTEP,以及泛洪与学习机制。这四个对象共同决定了多云环境中 Overlay 能否正确建立、流量能否被正确转发。
一、VXLAN 报文结构:外层承载内层
VXLAN 的本质是 MAC-in-UDP 封装。原始以太网帧被完整保留为内层载荷,外层再依次加上 VXLAN 头、UDP 头、外层 IP 头和外层以太网头。这样,原本只能在同一二层域内传播的帧,就可以被封装成普通 IP 报文,在 Underlay 的三层网络中路由转发。
各字段的作用如下:
- 外层以太头:承载下一跳的源/目的 MAC,由 Underlay 决定,与租户无关。
- 外层 IP 头:源 IP 为发送方 VTEP 地址,目的 IP 为接收方 VTEP 地址,协议号为 UDP(17)。
- UDP 头:目的端口固定为
4789(IANA 分配),源端口通常由内层帧的哈希计算得出,用于 ECMP 负载分担。 - VXLAN 头:8 字节,其中 24 位 VNI 是租户标识,I 标志位表示 VNI 有效。
- 内层以太帧:原始租户报文,包含内层源/目的 MAC 和内层 IP 载荷。
一个常见的误区是把 VNI 当成 VLAN ID 的简单扩展。实际上,VLAN 只有 12 位、约 4000 个可用值,而 VNI 有 24 位,理论可支持约 1600 万个租户段。这正是 VXLAN 能支撑多租户云环境的关键。
二、VTEP:Overlay 的边界与封装点
VTEP(VXLAN Tunnel Endpoint)是 VXLAN 隧道的起点和终点。它负责把内层帧封装成 VXLAN 报文,或者把收到的 VXLAN 报文解封装还原成内层帧。VTEP 可以位于物理交换机上,也可以位于虚拟化平台的 vSwitch 中,例如 Linux 的 vxlan 接口或 OVS 的 VXLAN 端口。
每个 VTEP 至少有一个用于 Underlay 通信的 IP 地址,称为 VTEP IP。同一 VNI 内的 VTEP 之间通过这个 IP 建立隧道。VTEP 上通常维护两类关键表项:
- 本地 MAC 表:记录本 VTEP 下挂的虚拟机/容器的 MAC 与所在端口。
- 远端 MAC 表(转发表):记录远端 MAC 对应的 VTEP IP 和 VNI,用于封装时填写外层目的 IP。
当 VTEP 收到一个内层帧时,它先查本地 MAC 表;若目的 MAC 在本地,直接二层转发;若不在本地,则查远端 MAC 表,找到对应 VTEP IP 后封装发送。如果查不到,就进入泛洪流程。
三、泛洪与学习:控制面与数据面的两条路
VXLAN 本身不定义控制面,它只定义了数据面封装格式。因此“如何知道某个 MAC 在哪个 VTEP 后面”这个问题,有两种主流解法:
第一种是数据面学习(Flood-and-Learn)。 当 VTEP 收到未知单播、广播或组播帧时,会向同一 VNI 内的所有其他 VTEP 泛洪。泛洪可以通过组播组实现,也可以通过头端复制(Head-End Replication)逐一向远端 VTEP 列表复制发送。收到响应的 VTEP 会回包,源 VTEP 从回包中学习到“该 MAC 位于该 VTEP”,写入远端 MAC 表。这种方式部署简单,但泛洪会带来额外带宽消耗,且表项学习依赖流量触发,收敛较慢。
第二种是控制面学习(如 EVPN)。 通过 BGP EVPN 等控制协议,各 VTEP 主动发布自己本地 MAC/IP 可达信息,其他 VTEP 直接学习,无需泛洪。这种方式收敛快、可控制、支持多活,是多云环境中的主流选择。
四、多云部署方式与限制
在多云环境中,VXLAN 的部署通常有三种形态:
- 云内 VXLAN:由云平台自身管理,租户通常不可见,VNI 与租户 VPC 映射由云厂商控制。
- 跨云自建 VXLAN:企业在各云中部署自己的 VTEP(如 Linux 主机或虚拟路由器),通过公网或专线建立 VXLAN 隧道,实现跨云二层互通。
- 混合模式:云内使用云厂商 Overlay,云间通过网关设备做 VXLAN 到 VXLAN 的映射或 VXLAN 到 VLAN 的转换。
需要特别注意的限制包括:
- MTU 问题:VXLAN 封装会增加约 50 字节开销(外层以太 14 + 外层 IP 20 + UDP 8 + VXLAN 8)。若内层帧为 1500 字节,则 Underlay 至少需要 1550 字节 MTU,否则会分片或丢包。多云专线常需确认 MTU 是否可调。
- VNI 冲突:不同云或不同管理域可能使用相同 VNI 表示不同租户,跨域互联时必须做 VNI 映射,否则会串租户。
- VTEP 地址规划:跨云 VTEP IP 不能重叠,且需要 Underlay 路由可达。
- 泛洪域控制:跨云泛洪若不加限制,可能把广播扩散到不相关的云和租户,需要配合 EVPN 或手动维护远端 VTEP 列表。
五、一个可参考的跨云 VXLAN 参数示例
假设某企业在云 A 和云 B 各有一台 Linux 网关作为 VTEP,计划打通 VNI 100 的租户网段。以下为示例参数(非实测,仅用于说明配置关系):
云 A VTEP: 10.10.1.1/24,VNI 100,内层网段 192.168.100.0/24
云 B VTEP: 10.20.1.1/24,VNI 100,内层网段 192.168.100.0/24
Underlay 路由:10.10.1.0/24 与 10.20.1.0/24 互通
MTU:Underlay 接口设为 1600,内层接口设为 1500
云 A 侧创建 VXLAN 接口(示例):
ip link add vxlan100 type vxlan id 100 \
remote 10.20.1.1 local 10.10.1.1 dev eth0 dstport 4789
ip link set vxlan100 up
ip addr add 192.168.100.1/24 dev vxlan100
配置完成后,可用 ping 192.168.100.2 验证内层连通性;用 tcpdump -i eth0 udp port 4789 观察外层封装是否正常;用 bridge fdb show dev vxlan100 查看远端 MAC 学习结果。若 ping 不通,优先检查 Underlay 路由、MTU 和 VNI 是否一致。
把这张图与前面的配置示例对照起来看,就能形成一条完整的理解链:内层帧从 VTEP-A 进入,按 VNI 100 封装,外层目的 IP 指向 VTEP-B;VTEP-B 解封装后交给内层网络;若目的 MAC 未知,则先泛洪、再学习、后单播。多云部署时,真正需要提前确认的,往往不是 VXLAN 本身能不能跑,而是 MTU、VNI 映射、VTEP 地址规划和泛洪域边界这四件事是否已经对齐。