为什么 QFX 的 MAC 出现在 EVPN 中,却不在转发表里
EVPN 数据库中的 MAC 是控制平面的事实,并不能证明转发表已经编程。在归咎于 BGP 之前,请按顺序读完四个阶段。
在 EVPN 数据库里找到一条 MAC,只能证明它作为路由被通告或收到,仅此而已。转发表是另一套结构,写入时间更晚,因此同一条 MAC 可以出现在其中一张表里、却缺席于另一张,而所有协议都工作正常。把这两个输出当成彼此的副本,会让工程师去追 BGP 故障,而真正的缺口其实是导入策略或未解析的下一跳。值得问的问题不是 fabric 是否知道这条 MAC,而是 在哪一个环节停止了向下传递。
两张回答不同问题的表
在 Junos EVPN 上,数据库按实例列出 MAC 地址,并说明每一条的来源:从接入端口学到、在 Type 2 路由中收到,或标记为多宿主组的成员。Juniper 的 show evpn database 参考 涵盖了按 MAC 和按实例的过滤条件,让视图易于阅读。它是按实例和 MAC 索引的控制平面摘要,不是硬件交换帧所用的那张表。
交换表才是真正的转发状态。两个输出都把 MAC 列在 VLAN 或 VNI 上下文旁边,这正是它们被逐行比较的原因,也正是这种比较会误导人的原因。数据库中的条目说明路由存在且已被实例接受;它并不说明平台是否把它安装进了转发。
Type 2 路由携带 MAC、可选 IP、标签或 VNI、路由区分符,以及指定远端 VTEP 的下一跳。从线缆到这条路由之间可能有四个环节出问题:主机从未被学习、路由从未被通告、在导入时被拒绝,或下一跳无法解析。每种失败留下的表集合都不同,这正是该序列可以被诊断的原因。
本地学习仍然先发生
常见的假设是 EVPN 接管了 MAC 学习,所以数据库为空就一定是 overlay 问题。本地学习仍在接入侧运行,与 VXLAN 出现之前完全一样:交换机在正确的 VLAN 和服务中学习到允许帧的源 MAC,然后才为它产生 Type 2。 没有发送过相关帧的主机没有任何东西可以通告。因 VLAN 成员关系、过滤器或聚合链路成员 down 而被丢弃帧的主机,从 overlay 的角度看完全一样。
从接入点开始,用只读命令逐层推进。目标是证明主机的帧确实穿过了预期的服务,因为下游没有任何东西能补偿一个从未到达的帧。
show interfaces ge-0/0/1.0
show ethernet-switching interface ge-0/0/1.0
show lacp interfaces ae0
被选中的 LACP 成员比 bundle 是否 up 更重要,因为聚合链路可能在一个成员上保持 up,而主机流量却被哈希到一条 down 或阻塞的链路上。接口计数器能把沉默的主机与丢帧的主机区分开,因为从不发送的主机和因分类而被丢帧的主机留下的是同一张空表。
远端 MAC 在哪里丢失
远端 MAC 的失败发生在相反方向,而且悄无声息。Type 2 路由会到达,但只有当它的 route target 和 VNI 与本地配置匹配时才会进入实例,只有当下一跳解析为可达的 VTEP 时才可用。route target 不匹配会在 BGP 表中留下一条有效路由,而没有任何实例会去请求它。
按顺序读取三个视图:路由是否存在、数据库条目、转发条目。下面的命令在每个阶段查询同一条 MAC,示例地址让输出保持可比。
show evpn database instance blue mac-address 02:00:00:00:00:5c extensive
show route table bgp.evpn.0 | match 02:00:00:00:00:5c
show route table bgp.evpn.0 | match 02:00:00:00:00:5c extensive
这些输出回答三个不同的问题。bgp.evpn.0 中有路由却没有数据库条目,指向导入策略、route target 或实例配置。有数据库条目却没有转发条目,指向平台编程,属于另一条升级路径。下一跳无法解析的活动路由是传输或标签问题,再怎么调试 MAC 也修不好。
一次重启修好了问题,证明力非常有限
当重启让症状消失时,诱人的结论是配置一定没问题。重启会把每张表从头重新编程,因此也掩盖了陈旧条目遮蔽策略错误的情况;故障往往会在下一次变动、链路抖动或路由撤销时回来。
在任何维护窗口之前,先记录重启会清掉什么。这三条命令足以做前后对比,而且不会改动设备上的任何东西。
show evpn database instance blue
show route table bgp.evpn.0
show version
把这些输出连同日期和软件版本一起归档。事后报告说同样的重启以前也有效,那只是线索而不是证据;只有有人保存了早先的输出,差异才会显现。
四个观察可以定下大多数情况
四个观察几乎覆盖所有情况:接入点及其服务、作为示例值的 MAC、路由与数据库的状态,以及正在使用的版本。选一条明显是示例的 MAC,以免被误认为生产地址:首字节 02 表示本地管理的单播地址,其余字节可自由使用,因此 02:00:00:00:00:5c 是安全的占位符。
然后让答案指向失败的那个环节。接入点没有学习就是接入侧;有路由没有数据库条目就是导入;有数据库条目没有转发状态就是编程。无论结论是什么,把收集到的输出连同主机、接口、服务和版本一起交接,下一位工程师就能复现路径,而不必重复查询。