
VXLAN 协议深度解析从 3 层报文到 2 层隧道的封装与转发在当今云计算和容器化技术蓬勃发展的时代网络虚拟化已成为构建灵活、可扩展基础设施的关键技术。VXLANVirtual Extensible Local Area Network作为一种主流的网络虚拟化解决方案通过创新的封装机制实现了跨物理网络的二层网络扩展。本文将深入剖析 VXLAN 协议的工作原理从数据包层面揭示其如何将二层以太网帧封装进 UDP/IP 报文进行传输并结合实际抓包分析帮助读者全面掌握这一技术的核心原理。1. VXLAN 技术概述VXLAN 是一种基于 IP 网络的 overlay 技术它通过在现有三层网络之上构建虚拟的二层网络解决了传统 VLAN 技术在扩展性和隔离性方面的限制。与 VLAN 仅支持 4096 个隔离域不同VXLAN 使用 24 位的 VNIVXLAN Network Identifier理论上可支持多达 1600 万个隔离的网络段。VXLAN 的核心组件包括VTEPVXLAN Tunnel End Point负责 VXLAN 报文的封装和解封装通常部署在虚拟交换机或物理交换机上VNIVXLAN Network Identifier24 位的网络标识符用于区分不同的虚拟网络Underlay 网络承载 VXLAN 流量的底层 IP 网络在容器化环境中VXLAN 常被用于实现跨主机的容器网络通信。例如在 Docker 多主机网络中VXLAN 技术使得位于不同物理主机上的容器能够像在同一个二层网络中一样直接通信。2. VXLAN 报文结构解析理解 VXLAN 协议的关键在于掌握其报文封装结构。一个完整的 VXLAN 报文由多个层次的头信息组成从内到外依次为原始以太网帧 - VXLAN 头 - UDP 头 - 外层 IP 头 - 外层 MAC 头让我们通过 Wireshark 抓包逐层分析每个字段的含义和作用2.1 原始以太网帧Inner Ethernet Frame这是被封装的实际通信数据包含源/目的 MAC 地址各 6 字节以太网类型2 字节有效载荷如 IP 报文FCS帧校验序列通常被网卡剥离2.2 VXLAN 头部8 字节VXLAN 头部结构如下比特位字段说明0-7Flags包含 I 标志位有效 VNI和其他保留位8-23Reserved保留字段必须为 024-31VNIVXLAN 网络标识符的高 8 位32-63VNI续VXLAN 网络标识符的低 16 位关键字段说明I 标志位置 1 表示 VNI 字段有效VNI24 位的虚拟网络标识符用于多租户隔离2.3 UDP 头部8 字节VXLAN 使用 UDP 协议进行传输默认目的端口为 4789。UDP 头部包含源端口2 字节通常由内核动态分配目的端口2 字节4789IANA 分配的标准端口长度2 字节UDP 报文总长度校验和2 字节可选字段2.4 外层 IP 头部20 字节这是承载 VXLAN 隧道的 IP 报文头包含源 IP本地 VTEP 的 IP 地址目的 IP对端 VTEP 的 IP 地址协议字段17表示 UDPTTL通常设置为 64 或 2552.5 外层 MAC 头部14 字节这是 Underlay 网络的以太网帧头包含源 MAC本地物理接口的 MAC 地址目的 MAC下一跳设备的 MAC 地址以太网类型0x0800表示 IPv43. VXLAN 通信流程详解VXLAN 的通信过程涉及封装和解封装两个关键阶段。下面我们通过一个跨主机容器通信的实例详细分析这一过程。3.1 封装过程Ingress当容器 A 向容器 B 发送数据包时VTEP 的封装流程如下学习 MAC 地址源 VTEP 检查本地 MAC 表确定目的 MAC 对应的远端 VTEP IP添加 VXLAN 头生成 8 字节的 VXLAN 头设置正确的 VNI封装 UDP 头# 查看 Linux 系统中 VXLAN 接口的配置 $ ip -d link show vxlan0 5: vxlan0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff promiscuity 0 vxlan id 42 local 192.168.1.100 dev eth0 srcport 0 0 dstport 4789 nolearning ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx添加外层 IP 头源 IP 为本地 VTEP目的 IP 为对端 VTEP添加外层 MAC 头通过 ARP 解析获取下一跳的 MAC 地址3.2 解封装过程Egress对端 VTEP 收到报文后的处理流程校验 UDP 端口确认目的端口为 4789提取 VNI从 VXLAN 头中获取 VNI确定目标虚拟网络移除外层头剥离 UDP、外层 IP 和 MAC 头转发原始帧根据内层目的 MAC 地址转发到对应容器3.3 转发数据库FDB管理VTEP 通过 FDBForwarding Database维护 MAC 地址与远端 VTEP 的映射关系。在 Linux 中可以通过以下命令查看$ bridge fdb show dev vxlan0 00:15:5d:42:13:01 dst 192.168.1.101 self permanent 02:42:ac:11:00:02 dst 192.168.1.101 selfFDB 表项可以通过以下方式学习静态配置管理员手动添加动态学习通过数据平面流量自动学习需启用 learning 标志控制平面同步使用 EVPN 等协议分发4. VXLAN 在容器网络中的实践应用现代容器平台如 Docker 和 Kubernetes 广泛使用 VXLAN 实现跨主机网络。下面以 Docker 为例展示如何配置 VXLAN 网络。4.1 创建 VXLAN 网络# 创建自定义的 Docker 网络 $ docker network create --driver overlay --subnet 10.0.0.0/24 --opt encryptedtrue my-vxlan-net4.2 容器连接与通信验证# 在主机1上运行容器 $ docker run -itd --name container1 --network my-vxlan-net alpine sh # 在主机2上运行容器 $ docker run -itd --name container2 --network my-vxlan-net alpine sh # 测试容器间通信 $ docker exec container1 ping -c 3 container2 PING container2 (10.0.0.3): 56 data bytes 64 bytes from 10.0.0.3: seq0 ttl64 time1.231 ms 64 bytes from 10.0.0.3: seq1 ttl64 time0.683 ms 64 bytes from 10.0.0.3: seq2 ttl64 time0.752 ms4.3 抓包分析容器通信使用 tcpdump 捕获 VXLAN 流量$ tcpdump -i eth0 -nn -s0 -v port 4789 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 15:23:45.123456 IP (tos 0x0, ttl 64, id 12345, offset 0, flags [none], proto UDP (17), length 142) 192.168.1.100.43412 192.168.1.101.4789: [udp sum ok] VXLAN, flags [I] (0x08), vni 42 IP (tos 0x0, ttl 64, id 54321, offset 0, flags [DF], proto ICMP (1), length 84) 10.0.0.2 10.0.0.3: ICMP echo request, id 16, seq 0, length 645. VXLAN 高级特性与优化5.1 多播与单播模式VXLAN 支持两种流量转发模式特性多播模式头端复制单播组网复杂度高需配置多播低扩展性有限好适用场景早期实现现代云环境5.2 流量负载均衡通过 UDP 源端口哈希实现 ECMP等价多路径路由# 查看 Linux 系统的 UDP 端口范围 $ cat /proc/sys/net/ipv4/ip_local_port_range 32768 609995.3 性能优化技巧MTU 调整# 设置 VXLAN 接口的 MTU $ ip link set vxlan0 mtu 1450硬件卸载支持 VXLAN 硬件卸载的网卡可显著提升性能加密传输使用 IPsec 加密 VXLAN 流量6. 常见问题排查当 VXLAN 网络出现通信故障时可以按照以下步骤排查检查底层网络连通性$ ping 对端VTEP_IP验证 VXLAN 接口状态$ ip -d link show vxlan0检查 FDB 表项$ bridge fdb show dev vxlan0抓包分析$ tcpdump -i any -nn -v port 4789在实际项目中我们曾遇到因 MTU 不匹配导致 VXLAN 报文被丢弃的情况。通过逐步排查各节点的 MTU 设置最终将 VXLAN 接口的 MTU 调整为 1450 后问题解决。