1. 双归组网怎么会环路的:先说结论再复盘
EVN(Ethernet Virtual Network)双归组网在现网里很常见,尤其用在数据中心接入侧的网关虚拟化改造上。所谓双归,就是一台接入设备或服务器同时连接两台核心设备,一来做链路冗余,二来分摊流量。设计初衷很清晰:断掉一条链路,另一条顶上,不用等生成树收敛。
但双归组网有个天然的坑:如果协议设计层面没有做水平分割,BUM流量(广播、未知单播、组播)就会在这两条链路上来回转圈,最终演变成环路风暴。这不是理论推演,是真实项目里踩过的坑。某次数据中心做架构调整,双归接入的交换机全线广播流量飙升,核心交换机CPU异常升高,部分服务器出现间歇性断连。刚开始大家都以为是设备故障,换了光纤、重启了端口,问题依旧。
这次项目里,我负责从现象到根因的完整定位,最终确认问题出在EVN双归场景下的环回转发机制和一串配置细节的叠加上。这篇文章就把这个问题的成因、排查链路、解决方案和可复用的设计原则一次性讲清楚。内容适合正在做数据中心网络、双归网关虚拟化、EVN/VXLAN场景的工程师,也适合刚接触双归组网、想提前避坑的运维同学。
先说结论:双归本身不会环路,环路往往是因为"双活网关的转发规则"和"下联链路上的二层域隔离"没有配套设计好,导致本应被抑制的报文被二次转发。
2. 故障现象的完整记录:从广播风暴到MAC漂移
这次出问题的环境并不复杂,拓扑可以理解为标准的三层结构:两台核心交换机作为双归网关,中间通过聚合链路互联,下联端口分别接入若干个接入交换机。接入交换机同时向两台核心建立链路,形成双归。整个网络运行着EVN实例,承载多个业务VLAN,部分VLAN开启了分布式网关,部分VLAN用的是集中式网关。
故障不是瞬间爆发的,而是渐进式恶化。最初只是偶尔有接入交换机上报广播报文增多,不仔细看根本不会当回事。大约一个小时后,核心设备CPU占用率从正常的百分之十几一路攀升到百分之八十以上,连管理面登录都出现了明显的延迟。紧接着,接入交换机上的MAC地址表开始频繁变化,同一台服务器的MAC一会儿出现在这个端口,一会儿出现在另一个端口,MAC漂移告警刷屏。
这里有个很关键的观察点:MAC漂移集中在双归链路所涉及的端口之间,而且漂移频率和网络中的广播包数量呈正相关。换句话说,有某种机制把广播包不停地在两条上连链路之间弹来弹去,顺带把MAC地址的学习表项也搅乱了。
为了确认环路是否存在,我们直接在接入交换机上连续抓包,重点观察广播帧(目的MAC全F)和ARP请求帧。结果发现同一广播帧会以极快的速度反复出现在同一条物理链路上,每次出现之间的间隔极其短,完全不符合正常广播复制的特征。正常广播一次只会发一份到每个端口,如果反复看到同一帧出现在同一个方向,基本可以断定有报文在被循环转发。
同时我们在核心交换机上也抓了报文,发现一个更微妙的现象:一部分广播流量是从peer-link方向回来的,另一部分是从下联口方向回来的。两条路径都在跑BUM流量,而且流量在两端都在被重新注入到EVN实例里。看到这里,问题的性质已经清楚了——不是偶然的硬件故障,而是EVN双归架构下的环路转发缺陷被某类特定报文触发了。
这个阶段需要特别提醒:遇到CPU飙升和MAC漂移,不要一上来就怀疑环路以外的原因。先把广播/组播流量方向和速率确认清楚,再动配置。当时我们有同事第一反应是关掉所有接入端口,试图用"断开所有可疑链路"的方式止血,结果反而把故障面扩大了——因为广播流量已经积压,端口一关一开之间又要重新泛洪,风暴反而加剧。
2.1 为什么双归链路会成为BUM报文的天然环路
要理解这个故障,先得把双归链路的工作机制讲透。假设一台接入交换机同时上连到核心A和核心B,且两台核心之间有互联链路(无论是否做聚合)。当接入交换机收到一个广播包时,它会向两条上连链路各复制一份。正常情况下,核心A收到广播包后,会依据EVN实例的转发规则,把它往该实例下的所有其他端口复制,其中就包括与核心B的互联链路;核心B收到来自核心A的广播包后,同样会把它复制到自己的所有EVN端口,其中又包含了接入交换机所在的下联口。
如果没有任何抑制机制,这个广播包就相当于在三台设备之间进行永无止境的"乒乓球对打":接入交换机发给核心A,核心A发给核心B,核心B又发回接入交换机,接入交换机再把新收到的这份继续发给核心A和核心B,循环往复。哪怕只有一份广播包,也会滚雪球式地变成成千上万份。
正常网络里,这个循环会被阻断机制按住。常见的阻断手段有三种:
- 传统的STP(生成树协议):在物理拓扑上人为阻塞某条链路,打破环路。但EVN这种多活网关场景下,STP对于peer-link和双归虚拟口往往不生效或者被旁路,因为架构本身就要求两条链路同时转发。
- 水平分割规则:从哪个接口方向收到的BUM流量,不再往同一个方向或同一个来源域里转发。EVN网关如果正确实现了水平分割,能挡掉很大一部分环回。
- 组播/广播复制优化:通过组成员关系和组播树只复制一次,避免在多个网关上重复泛洪。
这次的故障核心在于,EVN实例的泛洪范围覆盖了双归链路和网关之间的互联链路,而水平分割规则对来自特定方向的BUM流量没有被正确匹配,导致本该被丢弃的环回流量继续进入转发流程。
2.2 EVN双归场景和STP/环路抑制机制的"错位"
在传统园区网络,环路靠STP解决,简单粗暴、沿用多年。但在EVN双归场景,STP往往处于一种尴尬状态:覆盖转发路径上看得见摸得着的物理端口,但它无法识别overlay层面的虚拟拓扑。你看到的是两台核心之间的一个peer链路和两条下联链路,STP会把其中一条阻塞掉,但这恰恰违背了双归要"两条同时用"的初衷。
所以很多EVN部署会在网关互联口上关闭STP,或者启用一些特殊的环路避免扩展。问题就出在这种"既要双活、又要不环路"的折中地带——如果设备自身的水平分割做不彻底,或者某个边缘配置破坏了水平分割的匹配条件,STP又帮不上忙,环路就钻空子了。
我们这次的项目里,网关互联链路在最初部署时确实配置了STP的旁路策略,这是双活网关的标准做法,本身没问题。问题在于接入交换机侧的双归端口上,我们启用了某种端口级的快速转发优化,这个优化会把收到的BUM流量绕过一些常规的入向策略检查,直接进入EVN实例泛洪。等于在水平分割生效之前,流量就被"抄近路"重新灌进了转发管道。
这就是典型的"两个机制都没坏,但组合在一起出了问题"的案例。
3. 完整排查链路:从抓包到配置比对,一步步锁定根因
很多人问,排查环路有没有捷径?说实话,现在设备都有环路检测工具,但EVN双归场景里的环路,往往不是"有没有环路"的问题,而是"流量在哪一层被循环注入"的问题。所以我更建议按下面的链路逐步排查,每一步都有明确目的,不需要靠直觉瞎试。
3.1 第一步:确认流量特征,锁定是广播风暴还是组播黑洞
最开始的输入信号是CPU偏高和MAC漂移。这时候不要急着分析配置,先在关键路径上做流量采样。我在接入交换机的上联口做了双向抓包,抓到三层信息:
- 广播帧占比超过百分之七十;
- 同一帧(以源MAC、以太类型、内部上层字段做指纹)在两百毫秒内重复出现超过三百次;
- 出现频率不随时间衰减,排除广播流的正常自然消亡;
- ARP请求占据了广播帧中的大头,说明这类流量最容易触发环路。
这一步的核心价值,是把"系统的、持续的环路流量"和"突发的、可收敛的广播突发"区分开。如果是后者,多半是某个终端在疯狂发广播,不一定是环路。如果是前者,并且报文指纹反复出现,基本可以说网络里存在循环转发行为。
3.2 第二步:分析MAC漂移方向,画出流量传播路径
MAC漂移不是目的,漂移方向才是关键线索。登录接入交换机,连续查看MAC地址表,记录同一个MAC在不同端口的出现顺序。我们这次观察到一个典型规律:服务器MAC先在核心A方向端口出现,接着在核心B方向端口出现,然后回到核心A方向端口,来回交替,间隔极短。
这说明这台服务器发出的帧,在核心A和核心B之间被来回反射。更准确地说,接入交换机从核心B方向收到了来自A的转发副本,又从核心A方向收到了来自B的转发副本,两个方向都在绕圈。
同时要关注MAC漂移涉及的端口集合。如果漂移只发生在两台核心和下联交换机之间,基本可以排除终端自身的ARP攻击嫌疑,把重心放到设备间转发逻辑上。
3.3 第三步:检查EVN实例的泛洪组成员关系和水平分割状态
抓包和MAC表只能证明"有那么一条循环路径存在",但还不足以指出根因。接下来要走进EVN实例的内部,看三样东西:
- 该EVN实例下包含了哪些端口,双归链路和对端互联口是否同时在这个实例里;
- 实例下广播/组播成员端口列表,看有没有出现非预期的端口被纳入泛洪范围;
- 设备日志里是否有水平分割规则被绕过或匹配失败的痕迹。
重点检查第一样。这次项目里,两台核心之间的互联端口、两组下联端口、以及到接入交换机的所有端口,全部都在同一个EVN实例的泛洪范围内。而EVN支持一种"隔离模式",理论上可以把上下行方向的流量隔开,但由于配置时图省事,这个模式没有被开启,于是两条链路之间的互灌没有任何隔离屏障。
这一步给我们的结论是:不是某个硬件坏了,也不是终端攻击,而是EVN实例的泛洪域设计超出了双归链路的安全边界。
3.4 第四步:配置回归比对,找出和"标准双归配置"的差异
拿到根因方向后,需要做一件事:把所有涉及EVN、双归、网关互联端口的配置完整导出来,和正常的参考基线逐行比对。
我们这次比对下来,发现了三个可疑点:
- 两台核心间的互联口上,某条入向策略没有放行EVN管理帧,导致设备间链路状态协议交互异常;
- 接入交换机双归端口上启用了边缘端口优化,这个优化默认跳过了一些泛洪抑制检查;
- 网关互联口所在的二层域,被同时纳入到了多个EVN实例中,其中一个实例的广播域配置存在交叉。
这三个点单独看都算不上致命失误,但叠加在一起,就把水平分割机制从内部瓦解了。值得强调的是,排查结论不能只靠一条证据,必须把配置、抓包、MAC表三个维度统一起来看。我们最终确认,第二点是直接触发因素,第一点和第三点是放大因素。
4. 解决思路与落地配置:把环路的每一层出口都堵死
根因锁定后,解决方案的思路就很清楚了:不只要"让当前流量消失",还要保证在后续所有双归场景下,BUM流量都不会再走回头路。我从三个层面做了整改。
4.1 强制开启EVN实例的水平分割与域隔离机制
核心动作是调整EVN实例的配置,明确指定泛洪边界和方向隔离。在EVN体系里,可以在实例中启用某种隔离策略,让从网关侧收到的BUM流量不再向另一个网关侧转发,同时也限制从接入侧收到的广播流量在两个核心之间互灌。
配置层面,具体做法是把双归链路和对端互联口放到不同的转发域中,并开启实例级隔离选项。这样,接入交换机发来的广播帧,在核心A上只会被复制到下联口和必要的组播复制端口,不会复制到通往核心B的互联口。同理,核心B不会再收到那些"从A方向来的、还要继续向外泛洪"的流量。
这里有一个基础但极其重要的命令逻辑要理解:隔离手段不是简单地把端口从实例里踢出去,而是给端口的流量转发方向打上标签,让设备在转发时能识别哪些方向是内部互联、哪些方向是用户接入。双归场景里,只有正确区分这两类方向,水平分割才能生效。
4.2 在接入交换机侧关闭"伪边缘端口"式转发优化
前面提到,接入交换机的双归端口启用了快速转发优化,这个优化在普通接入场景是好的,但在EVN双归场景就是隐患。它的副作用是让入方向的BUM流量绕过入向环路检测和泛洪抑制机制。
整改时,我把双归端口上与该优化相关的配置全部移除,恢复为标准的EVN接入端口行为。更稳的做法,是在接入交换机的入向接口上额外加一条环路保护策略:当入向广播速率超过阈值时,自动断开该端口一段时间并告警。虽然不能从根本上解决协议层级的问题,但能保证下次即使配置再被改坏,也不会直接风暴到全网。
4.3 校验网关互联链路的STP旁路策略与EVN管理帧放行
由于故障中还存在互联链路状态协议交互异常的问题,我对网关互联口的策略做了整体梳理。需要确保的是:既保留双活网关特有的STP旁路行为,又不对EVN管理帧产生拦截。
具体来说,我在互联口上调整了入向策略,明确放行了EVN协议交互所需的报文,同时保留了对未知单播泛洪的限速。调整完后,在两端核心上都验证了互联关系的稳定性:协议状态正常、邻居关系稳定、无震荡。
4.4 实际配置片段参考
下面给出一段简化后的核心思路(不是完整配置,仅作演示关键点):
evpn instance 100 vlan 100-110 encapsulation vxlan ! replication-mode ingress-replication ! ! 开启域隔离,防止双归方向互灌 unknown-unicast-suppression enable broadcast-suppression enable ! flood-domain isolation enable interface Ethernet1/1 description Up-link to Core-Switch-A switchport mode trunk ! ! 关闭边缘快速转发优化,避免绕过入向泛洪抑制 no ip dhcp snooping trust storm-control broadcast level 10 ! evn flood-domain boundary这段配置有三个关键点:
flood-domain isolation enable是核心动作,启用后该实例内的泛洪会在指定边界处截断;storm-control broadcast level 10是兜底策略,即使配置出现意外,广播速率超过阈值时端口会自动抑制;evn flood-domain boundary把接入侧端口明确划为泛洪域的边界,而不是内部互联域的一部分。
这种"协议隔离+策略兜底"的组合,比单纯改一个参数要可靠得多。
5. 验证过程与效果:不只看CPU降下来,更要看流量路径收敛
整改完成后,验证工作不能只停留在"CPU降回正常值"这种粗粒度层面,必须确认流量路径确实收敛了。
5.1 验证步骤一:广播/组播流量速率回落
我在接入交换机的双归上联口持续抓包三十分钟,对比整改前后的广播帧数量。结果显示,广播帧占比从百分之七十多降到不到百分之五,ARP请求不再以极高频率反复出现,同一报文的重复指纹基本消失。同时核心设备的CPU占用率在十分钟内回落到正常区间,管理面操作恢复流畅,MAC漂移告警完全停止。
这个效果说明环路已经被从"泛洪域隔离"层面切断,而不是仅仅被降速掩盖了。
5.2 验证步骤二:流量路径可预期
更好的验证方式是做一次可控的广播注入测试。我在接入交换机的一个测试端口上人为构造了少量广播帧,然后在核心A、核心B、互联口、双归口四个观察点同时抓包,检查广播帧的传播路径。
整改后的预期结果:
| 观察点 | 整改前行为 | 整改后行为 |
|---|---|---|
| 接入交换机上联到核心A | 广播帧反复回灌 | 只出现一次 |
| 接入交换机上联到核心B | 广播帧反复回灌 | 只出现一次 |
| 核心A到核心B互联口 | 频繁出现循环帧 | 不应出现或被丢弃 |
| 核心B到核心A互联口 | 频繁出现循环帧 | 不应出现或被丢弃 |
实际抓包结果和预期完全一致,互联口方向不再出现来自另一台核心转发的广播帧。这说明水平分割真正生效了,流量知道了"哪些方向不能回去"。
5.3 验证步骤三:跨机柜故障切换演练
单纯复现广播风暴只能证明"当前环路消失了",不能证明"双归的冗余能力还在"。所以我又做了一次故障切换测试:手动断开接入交换机到核心A的链路,观察业务是否快速切换到核心B路径。
结果业务在秒级内完成切换,没有出现长中断,MAC漂移告警也没有大量出现。这说明双归的冗余价值和环路的消除并不冲突——我们不是用"关掉一条路"来换稳定,而是让每条路都在自己的职责范围内正常工作。
6. 这类双归场景的通病清单:设计阶段就该避开的五个坑
经历过这次故障,我总结了五个在EVN双归组网里最容易踩的坑,每一条都是真实世界里反复出现的。如果你正在规划或维护类似网络,建议逐条对照。
6.1 泛洪域范围过大,"隔离"变成"连通"
很多双归设计图看着很漂亮——两台核心、多台接入、几条链路,但一落到配置上,通通装进一个大EVN实例里,端口全默认纳入泛洪域。这相当于把一个商场里所有店铺的消防通道都打通,一旦起火,全楼串烟。
设计阶段就应该明确:哪些端口是用户侧的泛洪域边界,哪些端口是设备间互联的内部域,两者必须有清晰的分界。如果分不清,宁可多拆几个实例,也不要把所有流量塞进同一个广播域。
6.2 把接入侧的快速转发优化照搬到双归口
接入端口上的快速转发类优化,在单归接入场景下确实能降低延迟、减少CPU开销,但在双归场景里,它可能让设备跳过环路保护的入向检查。双归端口的定位是"多活冗余路径"而不是"边缘快速口",配置选型时要有意识地做区分,不能一套配置打天下。
6.3 STP旁路之后没有补上等价的安全阀
双活网关场景下,STP在这个链路上确实可能被旁路,但旁路不等于放任。必须补上至少一种等价的安全阀,比如风暴控制、入向广播限制、泛洪域隔离。如果STP没了、安全阀也没有,环路一来就是裸奔,没有任何自动拦截机制。
6.4 网关互联口承担了额外泛洪压力而不自知
两台核心间的互联口,在EVN双归里本来应该是"同步信息、少量控制流量"的通道,但配置不当就会变成BUM流量的高速通道。设计时要对互联口做流量预算,明确它只承载哪些协议和同步流量,避免被广播泛洪占用。
6.5 验证时只看连通性,不看流量方向
很多项目验收只做ping通、业务可用的测试,这对环路类问题毫无意义。建议以"广播帧复制次数"和"特定端口上的流量方向"为验收指标,至少在改动后的网络里做一次抓包验证,确认BUM流量不会走回头路。
7. 后续运维建议:监测、基线、变更三板斧
这个问题解决后,为了防止类似问题再次出现,运维侧也需要做配套建设。我把这次的经验拆成三个可落地的动作,团队可以根据自己的环境参考调整。
7.1 建立BUM流量基线与异常告警
对每台关键设备,建议在正常运行一周后,统计各端口的广播/组播流量基线。以后只要检测到广播流量连续三分钟超过基线两倍以上,就自动触发告警。很多人设备上的风暴控制阈值是出厂默认的,未必适合双归场景。基线数据比任何默认值都更贴合实际业务。
7.2 改动配置前做环路风险评估
改动EVN实例、双归端口、互联口策略之前,先问三个问题:
- 这个改动会不会让BUM流量的泛洪范围变大?
- 这个改动会不会让某个方向的流量回流?
- 这个改动的生效范围是否影响到水平分割规则?
只要有一个答案是"会",就必须在变更窗口内准备好回退方案。不要指望"改完了再抓包看",出问题的网络往往抓包机会都没有。
7.3 保留"标准配置模板"并做定期比对
我们这次排查之所以效率不高,部分原因是现场配置和标准基线差异很大,而且没有任何文档记录为什么某条命令要这么配。建议把EVN双归的标准配置沉淀为模板文件,每次变更后都做一次配置diff,把非预期差异挑出来。读配置的时候,不只要看"配了什么",更要理解"为什么这样配"。
这次故障给我最大的收获就是:双归组网本质上是一个"妥协设计"——它既想要冗余,又想要负载分担,还要防止环路,这三者天然存在张力。协议机制能帮我们实现大部分目标,但配置细节如果不和架构设计对齐,机制就会失效。回归到本文标题那句核心:EVN双归组网环路问题,真正解决的其实不是某一个命令,而是把"泛洪路径、方向隔离、兜底策略"这三件事统一起来。希望这篇复盘,能让正在做类似网络的你少走几趟弯路。