VXLAN/EVPN 里的 MAC 地址:数据中心把二层寻址藏到了哪一层

企业网络

在企业网里,MAC 地址几乎就是二层的全部:交换机靠它建转发表,靠泛洪把未知单播送达,靠 MAC 地址表 定位一台设备接在哪个口。到了数据中心,这套逻辑被一个 overlay 包了起来。VXLAN 用 MAC-in-UDP 把租户的二层帧装进 IP 包,跑在大三层 Clos 网络上;一台主机的 MAC 不再由物理交换机直接学到,而是由隧道端点(VTEP)代理学习,或者干脆由 BGP EVPN 的控制面分发。这篇文章讲清楚一件事:在一张 VXLAN/EVPN fabric 里,同一个 MAC 地址分别出现在哪几层、谁在学它、出故障时该去哪张表里查。

一个 MAC 在 VXLAN 报文里有几份

VXLAN 的封装常被称作 MAC-in-UDP,更准确的说是内层以太帧被套进了 UDP/IP 再套进外层以太帧。一台主机 A 发往主机 B 的帧,被 VTEP 封装后大致是这样的层次:

  • 外层以太头(外层 SMAC/DMAC):underlay 上两跳设备之间的物理地址,每经过一跳路由就被重写一次,和终端设备无关。
  • 外层 IP 头:源是源 VTEP 的 IP(通常是专用 loopback),目的是目的 VTEP 的 IP。
  • UDP 头:目的端口固定 4789(IANA 分配给 VXLAN,厂商实现里不可配置)。
  • VXLAN 头:核心是 24 位 VNI(VXLAN Network Identifier),最多 1600 万个租户段,用来替代只有 4094 个的 VLAN ID。
  • 内层以太头(内层 SMAC/DMAC):这才是租户真正的二层帧头,也就是主机 A 和主机 B 的 MAC。

所以同一个报文里同时存在两份 MAC:外层 MAC 属于物理网络,内层 MAC 属于租户虚拟网络。这是理解后面一切的前提——underlay 的 spine/leaf 在做 IP 转发时只看外层,终端 MAC 对它们完全不可见。

泛洪学习:VXLAN 最初怎么学 MAC

VXLAN 的原生做法和经典二层网桥一样,靠 flood-and-learn(泛洪-学习)。当 VTEP 收到一个不知道目的在哪的帧(广播、未知单播、组播,合称 BUM),就把它送到该 VNI 下所有成员 VTEP——早期用 IP 组播,后来更常用头端复制(HER,Head-End Replication)逐份单播复制。

收端 VTEP 解封装后看到内层帧,做两件事:按内层 DMAC 转发,以及把内层 SMAC 学到外层源 IP 上。也就是说,VTEP 的转发表里,"某个 MAC 在哪"记的是"在哪个 VTEP 后面"。下次反向流量就能直接单播到那个 VTEP,不必再泛洪。这和经典交换机"按 SMAC 学到入端口"完全是同一个思路,只不过端口变成了隧道。

这套机制的毛病是规模。二层广播域从一台交换机扩大到了整张 fabric,任何 BUM 都要复制到所有成员 VTEP,主机一多,泛洪成本就压不住了。Cisco 的配置文档把这点写得很直接:flood-and-learn 的固有泛洪"在端主机数量增长时带来严重的规模挑战"。

BGP EVPN:把 MAC 学习交给控制面

解决办法是把 MAC 的学习从数据面(泛洪)挪到控制面(路由协议)。这就是 BGP EVPN:EVPN 最初由 RFC 7432 定义(面向 MPLS),RFC 8365 定义了基于 VXLAN 的 NVO(Network Virtualization Overlay)场景,用 MP-BGP 的 NLRI 同时携带二层 MAC 与三层 IP 的可达性信息。

关键路由类型里,与 MAC 直接相关的是 Type 2 路由(MAC/IP Advertisement Route)。VTEP 把本地学到的 MAC(以及可选的主机 IP、VNI)通过 Type 2 通告给其他 VTEP;对端收到后直接写进本地表项,指向源 VTEP 的 IP。结果是不再需要靠泛洪去学 MAC——这正是 EVPN fabric 相对纯 flood-and-learn 的根本收益:规模和收敛都更好。

于是 fabric 里的"MAC 地址表"有了新形态:本地 MAC(接在自己端口上)与远端 MAC(remote MAC,指向某个 VTEP 的 IP)。厂商的 CLI 会明确区分这两类,H3C 的 VXLAN 配置指南里甚至提供"禁止远端 MAC 学习""本地 MAC 日志"等开关来管理这张表的边界。

MAC 移动性:EVPN 里最重要的运维语义

MAC 移动性(MAC Mobility)是 EVPN 最容易被忽视、却和排障最相关的一块。当一个 MAC 从一台 VTEP 后面换到另一台后面(虚机迁移、主机漂移,或者干脆是环路与欺骗),新 VTEP 会发出新的 Type 2 通告,并携带一个递增的 MAC Mobility Sequence Number。所有 VTEP 比较序列号,大的胜出,从而把流量归属切换到新位置。

配套的是重复 MAC 检测(Duplicate MAC Detection):如果同一个 MAC 在两个 VTEP 上以相同序列号同时出现,EVPN 判定为重复,触发告警并做保护。这套机制是经典二层"MAC 漂移/抖动"问题在 overlay 里的对应物,排查思路可以直接沿用 MAC 地址抖动排障 和 MAC 地址重复排障 里的方法,只是要多确认一步:是不是有虚机在做热迁移,而迁移本身会合法地触发 MAC 移动。

ARP/ND 抑制:MAC 表之外的邻居表

数据中心 fabric 里还有一层和 MAC 强相关的优化:ARP/ND 抑制。VTEP 之间不仅同步 MAC,还同步 IP-MAC 绑定(Type 2 路由本来就能带 IP)。这样 VTEP 可以代答 ARP,主机发出的请求不必泛洪到全网。H3C 的文档把它列为基础 VXLAN 功能之一,叫 "ARP and ND flood suppression"。

这带来一个运维后果:在 VXLAN 网络里抓 ARP 常常抓不到应答,因为它被 VTEP 代答了。想验证一台主机在不在,可能要去 VTEP 的邻居/ARP 同步表里看,而不是等 ARP 应答。经典的 ARP 协议 观察法和 ARP 欺骗防御 手段,都要按这个前提调整,否则会误判成"网络不通"。

抓包时怎么辨认

在 fabric 出口或服务器侧抓包,如果拿到的是封装后的报文,Wireshark 能解出 VXLAN 层。要点:

  • 先用 vxlan 或 udp.port==4789 过滤出隧道流量,再在解出的内层帧上按 MAC 过滤。外层 MAC 是物理下一跳,内层 MAC 才是终端。
  • VNI 决定了这是哪个租户段,等价于 VXLAN 世界的 VLAN。VLAN 标签在抓包里的位置与语义可参考 抓包里的 VLAN 标签。
  • 虚机网卡的 MAC 往往来自虚拟化平台注册的 OUI(如 VMware、Xen、Hyper-V),在 查询页 输入能看出平台归属,这与 虚拟机的 MAC 地址 讲的是同一件事。

按 MAC 过滤的具体写法见 用 Wireshark 按 MAC 过滤。

实务建议

对网络工程师。

  1. 分清两套表:underlay 路由表(外层 IP)和 VTEP 的 MAC/IP 表(内层 MAC → VTEP)。查"某 MAC 在哪"查后者,不是物理交换机。
  2. 用 EVPN 的 Type 2 路由条数反查异常:某个 VNI 下远端 MAC 数暴增,通常是泛洪或环路,而不是真的多了设备。
  3. 关注 MAC Mobility Sequence Number 的增长频率,它是虚机漂移与地址欺骗的共同信号。
  4. ARP 抓不到不等于没流量,先怀疑 VTEP 的代答抑制。
  5. 不要把 underlay 的物理 MAC 与租户 MAC 混为一谈;外层 MAC 每一跳都被重写,没有稳定身份。

对资产与运维。 VXLAN 让同一台虚机的 MAC 可以在不同物理位置出现且完全正常,所以基于物理交换机的 MAC 定位方法在 fabric 里会失效,资产盘点应转向上层的平台标识,见 用 MAC 做资产盘点。

对本站用户。 你在 fabric 里抓到"查不到厂商"的 MAC,先分清是哪一层。外层 MAC 是物理设备,通常能查到厂商;内层若是虚机或容器,很可能是本地管理地址或平台前缀,查不到、或查到云厂商前缀,都是正常现象。

一句话总结

VXLAN 把二层封装进了三层,EVPN 又把 MAC 学习从泛洪挪到了 BGP。结果是一个 MAC 地址在同一张网络里有了三种身份:外层的物理下一跳、VTEP 表里指向某条隧道的远端条目,以及控制面里带序列号的可移动路由。搞不清层次,就会在错误的表里找一个根本不存在的设备。

参考资料

  • IETF draft-ietf-nvo3-rfc7348bis-08《VXLAN》(2026-09-11 发布,取代 RFC 7348):https://www.ietf.org/archive/id/draft-ietf-nvo3-rfc7348bis-08.html
  • RFC 7432《BGP MPLS-Based Ethernet VPN》:https://www.rfc-editor.org/rfc/rfc7432.html
  • RFC 8365《A Network Virtualization Overlay Solution Using Ethernet VPN (EVPN)》:https://www.rfc-editor.org/rfc/rfc8365.html
  • Cisco《Configuring VXLAN BGP EVPN》(Catalyst 9500):https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst9500/software/release/16-9/configuration_guide/lyr2/b_169_lyr2_9500_cg/configuring_vxlan_bgp_evpn.pdf
  • Cisco《BGP EVPN VXLAN Overview》(Catalyst 9600):https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst9600/software/release/17-8/configuration_guide/vxlan/b_178_bgp_evpn_vxlan_9600_cg/bgp_evpn_vxlan_overview.pdf
  • H3C《Basic VXLAN configuration》:https://www.h3c.com/en/d_202310/1955938_294551_0.htm
  • 本站 交换机 MAC 地址表如何工作
  • 本站 MAC 地址抖动排障
  • 本站 MAC 地址重复排障
  • 本站 虚拟机的 MAC 地址
相关文章
关于作者 · Jondy

网络工程师,长期从事企业网络运维与安全工作。2017 年搭建 7n4.cn,关注 MAC 随机化对企业准入控制的影响。欢迎来信交流。

← 返回博客列表