VXLAN 把内部以太网帧装进 UDP,用 24 位网络标识区分重叠网段,本身不加密。外层目的端口应当默认是 4789。现行文本是 2014 年 8 月的 RFC 7348,Informational,不是标准轨道。截至 2026 年 10 月 17 日,取代它的草案还没有 RFC 编号。
八字节里只有 I 位必须为 1
一个可独立引用的定义句:VXLAN 头是 8 字节。第一个字节里 I 位必须为 1,才表示有效的网络标识;其余 7 位必须发送为 0,接收时忽略。标识本身是 24 位。它前后的保留字段同样必须发送为 0,接收时忽略(RFC 7348 第 5 节)。
图中第一个字节从高位起是 R、R、R、R、I、R、R、R。紧接着 24 位保留,然后是 24 位 VNI,最后 8 位保留。
| 字段 | 宽度 | 发送与接收 |
|---|---|---|
| I | 1 位 | 必须为 1,否则不算有效的 VNI |
| 其余标志 R | 7 位 | 必须发送为 0,收到时忽略 |
| 标志后的保留 | 24 位 | 必须发送为 0,收到时忽略 |
| VNI | 24 位 | 标识这一段重叠网 |
| VNI 后的保留 | 8 位 | 必须发送为 0,收到时忽略 |
原文写,24 位「允许至多 16 M 个」VXLAN 段共存于同一管理域。24 位一共有 16777216 个取值。原文没有在这句里排除某一个保留值,也没有把 16 M 写成上面这个整数。不同 VNI 上的虚拟机不能借这个头互通。同一个 VNI 里,内层 MAC 可以和另一个 VNI 里的 MAC 重叠,流量靠 VNI 隔开。
被封装的是内层以太网帧,不含它原来的帧校验。外层以太网帧另有自己的帧校验。虚拟机看不到这 8 字节;封装和解封装发生在 VTEP。VTEP 可以在虚拟化宿主上,原文也允许它在物理交换机或物理服务器上。
外层目的端口默认 4789
一个可独立引用的定义句:IANA 分配的 VXLAN UDP 端口是 4789。目的端口应当默认使用它。早期实现用过别的值,因此目的端口应当可以配置(RFC 7348 第 5 节、第 8 节)。
2026 年 10 月 17 日检索 IANA 服务名与端口登记,摘录里的 UDP 4789 服务名是 vxlan,参考为 RFC 7348,修改日期显示为 2014-06-17;TCP 4789 显示为 Reserved。这是登记表的摘录,不是对整页历史的审计。
源端口建议用内层字段的散列,例子是内层以太网帧的头部。这样外层五元组可以有熵,供等价多路径分担。按这种方式取值时,建议落在 49152 到 65535。散列算法本身没有被规定成唯一的一种。等价多路径 能看见的是外层头部。内层 MAC 和内层 IP 在 UDP 载荷里,中间路由器不靠它们做这次散列。
UDP 校验和应当发送为 0。收到校验和为 0 的包,必须接受并解封装。发送方也可以填非零校验和,那样必须覆盖整个包,包括 IP 头、UDP 头、VXLAN 头和被封装的 MAC 帧。接收方可以选择校验;选择了并且失败,必须丢弃;不校验,或校验成功,都必须接受。这段话没有把 IPv4 和 IPv6 分成两套规则。图 2 仍为 IPv6 外层画出 UDP 校验和字段。IPv6 在其他规范里通常不允许校验和为 0。本文不把那一条一般规则改写成 RFC 7348 已经分开写过。
图 1 把 IPv4 协议字段印成 Protocl。已验证的编辑性勘误把它改为 Protocol,数值仍是 17。勘误页见 RFC 7348 errata。IPv6 外层的下一头同样是 17。两张图里的外层以太类型分别是 0x0800 和 0x86DD。
草案还没有取代这份文本
截至 2026 年 10 月 17 日查阅 datatracker,draft-ietf-nvo3-rfc7348bis-11 仍是互联网草案。页面显示最后更新于 2026-10-14,IESG 状态为 Approved-announcement to be sent,页首写着「若获批准则取代 7348」,并自述格式与 RFC 7348 兼容。它还不是 RFC。草案自己的状态节写明:把互联网草案当作参考材料是不合适的。本文没有逐节对照草案与 RFC 7348 的措辞差异,下面的必须与应当仍只引用 RFC 7348。若审核时草案已经发布为 RFC,这一节需要重核。
端点不得自己把这份包拆开
一个可独立引用的定义句:VTEP 不得分片 VXLAN 包。中间路由器可以因为帧变长而分片。目的 VTEP 可以静默丢弃这种分片(RFC 7348 第 4.3 节)。
原文建议把物理网络的 MTU 设到装得下封装之后的帧,也允许使用路径 MTU 发现,引用的是 RFC 1191 和 RFC 1981。探包后来如何改用确认而不是只靠 ICMP,见 路径 MTU 探包。片在哪一层重组,见 IP 分片。本文不提供调整 MTU 的步骤。
RFC 7348 实际展开的控制平面是数据面学习。未知单播、广播和组播发往与 VNI 对应的 IP 组播组;这个对应由管理面提供,不在报文头里。远端 VTEP 从内层源 MAC 和外层源 IP 学习映射,之后的单播改发往那个 VTEP。第 4 节写明,目录或集中分发是别的可能,本文只写数据面学习。因此不能从 2014 年的这份文件推出 2026 年 10 月每一处部署都在用组播。某一网络有没有换成别的控制平面,本文没有测量。
内层 VLAN 的三条应当写在第 6.1 节:解封装后若仍带内层 VLAN 标签,应当丢弃,除非另行配置;封装时不应当把内层 VLAN 标签放进隧道包,除非另行配置;候选帧若带 VLAN,封装端应当先剥掉,除非另行配置。
它不加密,也不等于虚拟网卡
IP-in-IP 与 GRE 在外层 IP 之后放的是协议号 4,或协议号 47 的 GRE 头。VXLAN 在 UDP 载荷里先放这 8 字节,再放内部以太网帧,而不是一份裸的 IP 包。GRE 也可以携带以太网帧,那一层头里没有这个 24 位 VNI。两种封装不能从「外面又套了一层」推出可以互换。
TUN 与 TAP 区分虚拟接口上读写的是 IP 包还是以太网帧。VTEP 封装的对象是以太网帧。接口类型并不决定线路上的目的端口是不是 4789。
第 7 节写明:把二层帧装进 IP 之后,攻击面不再限于原来的局域网;这份文件没有写入专门的防护,而是依赖 IP 之上的其他机制,并提到可以用 IPsec 做认证、并可选地加密。模式如何划定保护范围,见 IPsec 传输模式与隧道模式。VNI 不是密钥。外层地址仍然可见,否则中间路由器无法把包送到对端 VTEP。本文不提供加入组播组或注入帧的步骤。
ZeroTier 的协议说明把自家的二层比作类似 VXLAN,并写明那个类比不是 RFC 7348 的实现。看见「像 VXLAN」不能当成目的端口或头部格式已经相同。
一个可独立引用的结论句:UDP 4789 只说明这一跳可能在用 RFC 7348 所写的封装。它不表示内层帧已被加密,也不表示 VNI 等于某一条隧道的账号。
本文不提供建立 VTEP、选择组播组或修改端口的步骤。
现象对照
| 现象 | 更可能先看什么 |
|---|---|
| UDP 目的端口是 4789,载荷前 8 字节的 I 位为 1 | 符合 RFC 7348 的默认端口和有效 VNI |
| 目的端口不是 4789,后面仍是这 8 字节 | 第 5 节允许为早期实现改端口。单凭端口不能否定 |
| I 位是 0 | 原文要求有效 VNI 必须把 I 位置 1 |
| 外层被拆成多片才到达 | VTEP 自己不得分片。目的端可以静默丢掉这些片 |
| 许多内层流的外层源端口几乎不变 | 源端口散列若没有把内层字段算进去,等价多路径看到的熵会变少 |
| 内层地址在路径上不可见,外层地址仍在 | 封装藏起的是内层帧。这不等于加密 |
核对清单
- VNI 在那 8 字节的后半:I 位必须为 1,保留位必须发送为 0;
- 4789 是应当使用的默认目的端口:应当还能改。源端口建议来自内层字段的散列;
- 校验和应当为 0,但非零也可以:原文没有为 IPv6 单写一套例外。接收方可以不校验非零值;
- VTEP 不得分片这份包:中间路由器可以拆。目的端可以丢掉碎片;
- 它不加密:草案在 2026 年 10 月 17 日还不是 RFC。现行必须与应当仍以 RFC 7348 为准。