ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

双核心组网实战:MSTP、LACP、VRRP、DHCP、NAT五大技术协同配置与排障

双核心组网实战:MSTP、LACP、VRRP、DHCP、NAT五大技术协同配置与排障

做了这么多年网络项目,我越来越觉得,最能拉开工程师水平差距的,不是会不会配某个协议,而是能不能把多个协议放到一张拓扑里,让它们协同工作不出乱子。MSTP、LACP、VRRP、DHCP、NAT这五个技术,单拎出来每个都有标准配置教程,真要把它们揉进同一个网络综合实验里,你会碰到生成树阻塞聚合口、VRRP切不动、DHCP拿不到地址、NAT回包丢了一半这类连环坑。这篇文章整理的是我最近在实验室完整复现的一套综合实验实例,从拓扑规划、配置命令到联调排障全都有,适合刚学完交换路由想动手做综合实验的初学者,也适合准备真实项目割接前想练兵的网络工程师。

1. 实验设计:为什么这五个技术必须放一起

1.1 需求分析与拓扑规划

这套实验的需求来自一个非常典型的中型双核心组网模型。内网划分三个业务VLAN:办公网192.168.10.0/24、服务器区192.168.20.0/24、无线访客段192.168.30.0/24。接入层两台交换机分别下挂不同区域的终端,汇聚层用两台三层交换机组成双核心互为备份,出口再接一台路由器负责连接外部网络。

我在规划拓扑时给自己定了三条硬性要求:

  • 接入层到核心层必须用双链路,既要带宽叠加又要链路冗余,这是LACP要解决的。
  • 核心层两台设备必须为三个VLAN提供虚拟网关,网关要能自动切换,这是VRRP的职责。
  • 双核心和接入之间的二层域必须启用MSTP,既要防环路,又要让不同VLAN走不同路径,做到负载均衡。

这三条要求合在一起,其实就是网络工程师常说的那句口诀:二层防环靠生成树,二层加带宽靠链路聚合,三层网关冗余靠VRRP。把这三件事先想清楚,后面配置起来才不会东一榔头西一棒子。

VLAN和IP规划表我直接列出来,后面所有配置都围绕这个表展开:

网段用途VLAN网段虚拟网关主设备群备设备
办公网VLAN 10192.168.10.0/24192.168.10.254核心A核心B
服务器区VLAN 20192.168.20.0/24192.168.20.254核心A核心B
访客网络VLAN 30192.168.30.0/24192.168.30.254核心B核心A
出口外网-203.0.113.0/24-路由器-

这里我把VLAN 30的主设备故意设为核心B,是为了让三个VLAN的流量在三层也能分担,而不是全压在一台设备上。这个思路会贯穿到后面的MSTP实例划分和VRRP优先级配置中。

1.2 技术协同关系拆解

动手配置之前,我建议一定要先画一条完整的数据流,把每个协议在路径上的位置标出来。终端发出一个访问外网的请求,经过的完整路径是:终端发出报文→接入交换机打上VLAN标签→LACP聚合链路送到核心交换机→核心交换机根据VRRP虚IP完成网关转发→核心交换机查路由表送到出口路由器→出口路由器做NAT源地址转换→报文发往外部网络。

这条路径上每个协议负责一段:

MSTP工作在接入和核心之间的二层域,切断物理环路,同时让VLAN 10和VLAN 20走核心A的链路、VLAN 30走核心B的链路,避免单条上联链路成为瓶颈。LACP同样工作在二层,把两条物理链路合并成一条逻辑链路,对生成树来说它只看到一条逻辑链路,所以生成树计算时不会把聚合口的两条成员链路当成环路。VRRP工作在三层,提供一个虚拟IP作为全网终端的网关,主设备宕机或上行故障时自动切换到备用设备。DHCP负责给终端分配IP、掩码、网关和DNS,其中分配的网关地址必须指向VRRP虚IP,三者配合才能让终端拿到地址后直接上网。NAT工作在网络出口,把内网私网地址转换成公网地址,解决私网路由不可达的问题。

这里有个顺序问题很重要:配置时先做LACP链路聚合,再启用MSTP。因为生成树是在逻辑接口上计算生成树角色的,如果先把物理接口暴露给生成树,再把它加入聚合组,物理接口在加入的瞬间可能处于转发状态,存在环路风险窗口。正确顺序是先完成聚合,让物理口在逻辑上归属Eth-Trunk,生成树只在Eth-Trunk口上算,环路天然被阻断。

2. 二层高可用:MSTP与LACP的部署细节

2.1 MSTP实例划分与根桥规划

先说为什么不用RSTP而是用MSTP。RSTP只能生成一棵树,所有VLAN的流量都沿同一棵树的转发路径走。双核心组网里,如果两台核心分别有一根上联链路到接入,RSTP必然会阻塞其中一条,被阻塞链路上的带宽完全浪费。MSTP的核心思想是把VLAN映射到不同的生成树实例,每个实例独立计算生成树转发路径,这样VLAN 10和VLAN 20可以走核心A,VLAN 30可以走核心B,两条上联链路都在转发,实现二层的负载均衡。

MSTP的配置分为四步,每一步都有必须注意的细节。

第一步,全局启用MSTP并配置MST域名称。域名称必须全网一致,否则各设备认为自己属于不同的MST域,生成树会在域边界震荡。我见过很多初学者在这里翻车,核心和接入的region-name拼写不同,结果display stp看到所有端口都是discarding状态。

第二步,创建VLAN实例映射表。我规划的是实例1承载VLAN 10和VLAN 20,实例2承载VLAN 30。这样实例1的根桥和VLAN 10/20的三层主设备保持一致,实例2的根桥和VLAN 30的主设备保持一致,二层和三层流量路径完全对齐。

第三步,配置根桥优先级。核心A在实例1里优先级设为4096,成为实例1的根桥;核心B在实例2里优先级设为4096,成为实例2的根桥。另一台设备保留默认优先级32768,作为备份根。

第四步,接入交换机只需要启用MSTP并配置相同的域名称,具体端口角色由生成树自动计算,不需要手动干预。

配置命令示例(以某主流企业级设备风格为例,其他品牌命令略有差异但逻辑一致):

# 核心A stp mode mstp stp region-name lab stp instance 1 priority 4096 stp instance 2 priority 32768 # 核心B stp mode mstp stp region-name lab stp instance 1 priority 32768 stp instance 2 priority 4096 # 接入交换机 stp mode mstp stp region-name lab

配置完成后,用display stp instance 1 brief查看每个交换机端口的角色。我实测中最容易遇到的问题有三个:域名称不一致、VLAN映射表不一致、接入交换机上忘记把终端端口配成边缘端口。

第三个问题特别值得展开。接入交换机下联终端的端口,在生成树计算中会被当作普通端口参与选举。终端开机、关机、插拔网线都会触发拓扑变化,导致生成树重新计算,造成几十秒的流量中断。配置边缘端口后,接入端口直接进入转发状态,不参与生成树计算。同时开启BPDU保护,一旦该端口收到任何BPDU报文,立即shutdown端口,防止有人私接交换机形成环路。

# 接入交换机终结端口配置 interface gigabitethernet 0/0/10 stp edged-port enable stp bpdu-protection

2.2 LACP聚合链路配置

LACP把两条物理链路合并成一条逻辑链路,逻辑带宽翻倍,同时任意一条物理链路断开不影响业务。综合实验中我强烈建议用LACP标准模式,也就是主动被动协商模式,而不是手工静态捆绑。原因很实际:LACP模式下两端通过LACPDU进行协商,如果两端速率、双工、VLAN配置不匹配,聚合口直接起不来,等于给你一个天然的配置校验机制。手工捆绑模式下两端即使速率不一致也能强制up,实际转发时疯狂丢包,排查起来更痛苦。

配置LACP的关键步骤是:

  1. 两端分别创建Eth-Trunk逻辑接口,配置链路聚合模式为LACP。
  2. 将物理成员端口加入Eth-Trunk,加入时物理端口会暂时shutdown再up。
  3. 把Eth-Trunk口配置为trunk类型,放行相关VLAN。

命令示例:

# 接入交换机 interface eth-trunk 1 port link-type trunk port trunk allow-pass vlan 10 20 30 mode lacp-static interface gigabitethernet 0/0/1 eth-trunk 1 interface gigabitethernet 0/0/2 eth-trunk 1 # 核心交换机 interface eth-trunk 1 port link-type trunk port trunk allow-pass vlan 10 20 30 mode lacp-static interface gigabitethernet 0/0/1 eth-trunk 1 interface gigabitethernet 0/0/2 eth-trunk 1

实际操作中有三个细节必须盯紧。

两端Eth-Trunk接口编号不需要相同,但成员口的速率、双工、PVID和放行VLAN必须一致。我在实验里踩过一次特别典型的坑:核心交换机侧Eth-Trunk的trunk放行VLAN漏了VLAN 30,结果访客段终端通过聚合链路完全不通,但单独用一根物理网线测试却是通的。这种问题用display eth-trunk能看到聚合口状态是up,但流量走不通,最容易误判为上层配置问题。

负载分担策略默认基于源目MAC,对于终端到服务器的流量,如果大部分报文源目MAC相同,分担效果会不理想。实验环境里流量模型简单,保持默认问题不大,但真实项目中建议改成基于源目IP,分担粒度更细。

生成树和链路聚合的配合也值得说一句。Eth-Trunk在MSTP中只是一个逻辑端口,生成树对这个逻辑端口计算角色。所以先做链路聚合后启用MSTP,是最安全的顺序。如果反过来,物理成员口先以独立端口身份参与生成树计算,再加入Eth-Trunk,加入瞬间可能出现环路风险窗口。

3. 三层网关冗余:VRRP部署实录

3.1 VRRP组设计与优先级策略

VRRP的价值在于让终端网关不再依赖某台物理设备的接口IP。双核心架构下,如果VLAN 10的终端把网关指向核心A物理接口地址,核心A宕机时整个VLAN 10断网。VRRP让两台核心共享一个虚拟IP,终端永远指向这个虚IP,由协议决定由哪台设备实际转发流量。

我实验里为三个VLAN各建了一个VRRP组,主备分配如前面的表格所示:VLAN 10和VLAN 20的Master是核心A,VLAN 30的Master是核心B。这个分配和MSTP实例的根桥分配保持一致,确保二层流量路径和三层网关路径都指向同一台设备,避免流量在核心间绕行。

VRRP配置要点主要有三个。

虚拟IP必须与VLANIF接口地址同网段,这是硬性条件。很多实验出错是因为虚IP网段和实际地址池网段不一致,终端明明收到了地址,但网关指向一个不存在的IP。

优先级默认是100,Master设备建议设为120左右,不必设成255。优先级差20已经足够保证主备关系明确,同时保留空间给后续的track联动降级。如果直接设255,一旦需要联动降级,没有下降余量。

抢占模式需要保留,但要配合抢占延迟使用。没有延迟时,主设备故障恢复后会立即抢占回流量,可能造成网络抖动。加一个3到5秒的延迟,让网络先稳定再切换,体验会好很多。

配置命令示例:

# 核心A interface vlanif 10 ip address 192.168.10.1 255.255.255.0 vrrp vrid 10 virtual-ip 192.168.10.254 vrrp vrid 10 priority 120 vrrp vrid 10 preempt-mode timer delay 5 interface vlanif 20 ip address 192.168.20.1 255.255.255.0 vrrp vrid 20 virtual-ip 192.168.20.254 vrrp vrid 20 priority 120 vrrp vrid 20 preempt-mode timer delay 5 interface vlanif 30 ip address 192.168.30.1 255.255.255.0 vrrp vrid 30 virtual-ip 192.168.30.254 vrrp vrid 30 priority 100 vrrp vrid 30 preempt-mode timer delay 5 # 核心B interface vlanif 10 ip address 192.168.10.2 255.255.255.0 vrrp vrid 10 virtual-ip 192.168.10.254 vrrp vrid 10 priority 100 vrrp vrid 10 preempt-mode timer delay 5 interface vlanif 20 ip address 192.168.20.2 255.255.255.0 vrrp vrid 20 virtual-ip 192.168.20.254 vrrp vrid 20 priority 100 vrrp vrid 20 preempt-mode timer delay 5 interface vlanif 30 ip address 192.168.30.2 255.255.255.0 vrrp vrid 30 virtual-ip 192.168.30.254 vrrp vrid 30 priority 120 vrrp vrid 30 preempt-mode timer delay 5

这里有厂商差异需要说明:第一,部分厂商的设备默认开启抢占,参数名称类似preempt-mode disable或preempt-mode timer delay,配置时看清设备帮助信息即可;第二,VRRP协议报文组播地址是224.0.0.18,需要保证VLANIF接口所在的二层域能正常泛洪组播报文,如果接入交换机上有组播过滤策略,VRRP协商会失败。

3.2 与MSTP的联动防坑

VRRP和MSTP的联动,是我认为这套实验里最有价值也最容易被忽略的部分。

考虑这样一个场景:VLAN 10的Master是核心A,MSTP实例1的根桥也是核心A。如果核心A到接入交换机的聚合链路断开,会发生什么?从二层看,核心A到接入的路径已经断了,MSTP会阻塞核心A在这个实例中的端口,接入交换机切换到核心B的路径转发。但从三层看,VRRP的VLANIF接口还健在,Master依然是核心A。终端网关依然指向核心A,可核心A到接入的二层路径已经不通,流量全部卡死。

这就是经典问题:二层断了,三层没感知。解决办法是VRRP与上行链路联动,也就是track机制。当核心A的上联Eth-Trunk接口down掉时,VRRP优先级自动降低,低于核心B后触发主备切换,终端网关漂移到核心B,流量恢复。

命令示例:

# 核心A interface vlanif 10 vrrp vrid 10 track interface eth-trunk 1 reduced 40

当Eth-Trunk 1 down掉,核心A的VRRP优先级从120降到80,核心B的优先级是100,自动成为Master。加这个配置后,故障切换时间能控制在秒级甚至毫秒级,不配的话就只能等VRRP的Master_Down定时器超时,默认要等好几秒。

我实际测试中,只有配上track联动,双核心架构的故障自愈才算真正完整。没有track的VRRP只防设备宕机不防链路中断,和真实项目需求相差很大。

4. 业务下发与出口转换:DHCP与NAT配置

4.1 DHCP地址池规划与中继

DHCP在整套实验里负责给终端分配地址。我把DHCP服务直接开在核心A上,因为核心A同时是VLAN 10和VLAN 20的主网关设备,地址池网关参数可以精确指向VRRP虚IP,保证终端拿到的网关就是可用的虚拟网关。

地址池规划我坚持一个原则:服务器和打印机这类需要固定地址的设备,不要放在动态地址池里,预先保留独立的静态地址段。我在VLAN 20里把192.168.20.1到192.168.20.50保留给服务器静态配置,动态地址池只分配192.168.20.50到192.168.20.100,避免DHCP把服务器地址分给其他终端导致IP冲突。

命令示例:

# 核心A dhcp enable ip pool vlan10 network 192.168.10.0 mask 255.255.255.0 gateway-list 192.168.10.254 dns-list 192.168.10.5 223.5.5.5 lease day 1 ip pool vlan20 network 192.168.20.0 mask 255.255.255.0 gateway-list 192.168.20.254 dns-list 192.168.10.5 223.5.5.5 lease day 1 ip pool vlan30 network 192.168.30.0 mask 255.255.255.0 gateway-list 192.168.30.254 dns-list 223.5.5.5 lease day 1 interface vlanif 10 dhcp select global interface vlanif 20 dhcp select global interface vlanif 30 dhcp select global

命令里223.5.5.5是常用的公共DNS。内网如果自建了DNS服务器,应该优先指向内网DNS,实验里VLAN 10和VLAN 20除了公共DNS之外还指了一个内网DNS,这样能验证内网域名解析流程。

这里的DHCP分配有一个前提需要说明:VLANIF接口和终端在同一个广播域内,DHCP的DISCOVER报文可以到达,所以不需要中继。但真实组网里如果DHCP服务器不在用户VLAN的三层接口上,而是在独立的服务器区,用户VLAN的VLANIF接口就必须配置DHCP中继,把广播的DHCP报文转成单播发给DHCP服务器。这也是综合实验经常考察的一个变体,值得动手验证一次。

另外强烈建议在接入交换机上开启DHCP Snooping。实验环境里经常有人私接小路由器当DHCP服务器,一旦接上网线,整个VLAN的终端都会拿到错误的地址配置,排查起来非常头疼。DHCP Snooping的思路很简单:配置信任连接核心交换机的上联口,其他所有端口丢弃DHCP OFFER报文,从源头掐断非法DHCP。

# 接入交换机 dhcp snooping enable interface eth-trunk 1 dhcp snooping trusted interface gigabitethernet 0/0/10 dhcp snooping enable

4.2 NAT转换规则配置

NAT是整套实验的出口环节。三个VLAN的终端要访问外网,但私网地址不能直接在公网路由,所以出口路由器上必须把源地址转换成公网地址。

实验拓扑里我用了文档保留地址段203.0.113.0/24作为外网测试网段。这个地址段是专门保留给文档和实验用的,不会和真实公网冲突,非常适合模拟外网环境。出口路由器的外网口地址是203.0.113.1,模拟公网设备地址是203.0.113.2。

NAT的配置分成三步:

第一步,用ACL抓取需要转换的内网网段。注意ACL里面的反掩码,0.0.0.255表示匹配前24位,和255.255.255.0的掩码效果等价。很多新手会把这里写成255.255.255.0,结果是ACL完全匹配不上任何流量。

第二步,定义公网地址池。如果只有一个公网地址,可以不定义地址池,直接使用接口地址做NAT,命令上不指定address-group即可。实验里我定义了一个地址池203.0.113.10到203.0.113.20,模拟一个小的公网地址段。

第三步,在内网口或外网口上应用NAT策略,关联ACL和地址池。不同厂商设备的外发NAT方向稍有差异,我习惯在外网口上配置,明确语义是所有从内网来的流量出外网口时做源地址转换。

命令示例:

# 出口路由器 acl number 3000 rule 5 permit ip source 192.168.10.0 0.0.0.255 rule 10 permit ip source 192.168.20.0 0.0.0.255 rule 15 permit ip source 192.168.30.0 0.0.0.255 nat address-group 1 203.0.113.10 203.0.113.20 interface gigabitethernet 0/0/0 ip address 203.0.113.1 255.255.255.0 nat outbound 3000 address-group 1 ip route-static 0.0.0.0 0.0.0.0 203.0.113.2

NAT配置里最容易漏的是回程路由。公网设备要能访问转换后的地址池网段,否则回包到了出口路由器却找不到去往公网目标的路径。实验里我必须要在模拟公网设备上加一条指向203.0.113.0/24的静态路由,下一跳为203.0.113.1。真实运营商网络里这部分路由由运营商自动完成,实验环境必须手动添加,否则NAT只能通一半。

还有一个常见问题是NAT与内网DNS联动。终端访问外网时,DNS请求报文也会被NAT转换,DNS服务器会把解析结果正常返回。如果ACL没有放行DNS必要的协议,或者NAT策略没有匹配到DNS流量,表现是Ping公网IP能通但域名解析失败。排查时优先确认ACL匹配和NAT会话表。

5. 联调排障:综合实验中最容易翻车的五个点

综合实验和单点实验最大的区别在于错误定位的难度。单点实验出错一定在那台设备上,综合实验出错可能在路径上的任何一个环节。下面这张速查表是我把这次实验踩过的坑整理出来的。

5.1 现象与排查对照表

故障现象可能原因优先排查手段
终端ping不通网关VLANIF未创建、VRRP虚IP错误、物理链路downdisplay vrrp、display ip interface brief
终端能通网关但无法跨VLAN通信核心交换机VLANIF路由缺失、VLAN间路由未启用display ip routing-table
终端拿不到DHCP地址DHCP Snooping拦截、地址池耗尽、VLANIF未启用DHCPdisplay ip pool、display dhcp snooping
流量通一下断一下MSTP阻塞路径与VRRP主备不一致对比display stp brief和display vrrp
外网能通但DNS解析失败DNS配置错误、ACL未放行DNS流量终端nslookup测试、display nat session
聚合口只有一个成员up两端速率/双工不一致、对端未配置LACPdisplay eth-trunk、检查物理口协商
主设备故障后VRRP不切换未配置track联动、优先级降幅不够检查track对象状态、display vrrp

这张表里的前三个问题是高频故障,后四个则是综合实验特有的联动问题,尤其是MSTP阻塞路径和VRRP主备不一致,单点实验完全不会出现。

5.2 排障技巧与经验心得

排障我坚持三个原则。

第一个原则是分层验证。综合实验必须从二层到三层逐层推进。我先用静态配置IP的方式验证同一VLAN内二层互通,通了再测试VRRP虚IP能否ping通,然后验证跨VLAN互访,最后测试经过NAT的外网连通性。哪一层过不去就在哪一层找问题,绝不越过当前层直接怀疑上层协议配错。

第二个原则是至少看两台设备的视角。在核心A上执行display stp brief只能看到本设备视角下的端口角色,必须再到接入交换机上执行一次同样的命令,对比两边才能确定根桥和阻塞端口是否与规划一致。很多"通一下断一下"的故障,其实就是生成树端口角色和VRRP主备角色不在同一台设备上造成的。

第三个原则是关键测试要用扩展ping。我在出口路由器上ping外网地址时,默认源地址是路由器自身接口地址,这不能验证NAT转换是否生效。正确做法是在内网终端上发起ping,或者在路由器上用扩展ping指定源地址为内网地址池中的某个IP,确认经过NAT后源地址变成了公网池地址。同样,排查DNS问题时用nslookup指定内网DNS服务器,才能区分是DNS解析问题还是网络连通问题。

6. 综合实验的整体验证脚本

验证一个综合实验不是终端能ping通外网就算结束。我每次做完实验都会跑一遍完整验证脚本,确认每个协议都按预期工作,而不是表面上通、实际上某些冗余链路从来没有被用到。

建议的验证顺序如下:

  1. 每个VLAN找一台终端,确认拿到的IP地址落在预期地址池范围,网关是VRRP虚IP地址,DNS配置正确。
  2. 从VLAN 10终端ping VLAN 20终端地址,验证跨VLAN三层互访。
  3. 断开核心A到接入交换机的聚合链路,终端持续ping网关地址,观察丢包数量和恢复时间,验证VRRP跟踪联动是否生效。
  4. 断开核心B到接入交换机的其中一条物理链路,观察LACP聚合口状态和剩余成员链路流量分担,验证链路冗余。
  5. 从内网终端访问外部模拟服务器地址,在出口路由器查看NAT会话表,确认会话建立并能正常回包。
  6. 在核心A和核心B分别执行display vrrp,确认每个VRRP组的Master与规划一致。
  7. 在接入交换机上执行display stp instance 1 brief等命令,确认端口角色和阻塞端口与规划一致。

第三步是最关键的故障演练。实测中配了track联动的情况下,断开链路瞬间丢包只有一两个;没配track时,VRRP要等Master_Down定时器超时才能切换,终端会持续丢包直到切换完成。这种差距在真实网络割接演练中直接决定业务中断时长。

第四步验证LACP时,我习惯在接入交换机上直接拔一根网线看业务是否受影响。在合适的负载分担策略下,剩余成员链路会承担全部流量,业务完全无感。这里顺便检查一下负载分担策略,如果流量全压在一个成员口上,拔线瞬间可能出现拥塞丢包。

还有一个容易忽略的验证点:把核心A的VRRP优先级恢复后,要确认抢占延迟生效,Master不会立刻切回,而是等延迟时间结束后才恢复。避免频繁切换导致网络震荡。

这套实验我做过不止一次,每次都有新收获。第一次做完只求"能通",第二次做完才理解每个参数为什么这样设,第三次做完才真正感受到二层和三层联动在故障切换里的决定性作用。如果你准备搭类似的综合环境,我的建议是别急着抄配置,先把拓扑画清楚、VLAN标好、地址池和VRRP角色规划好,多想几个"挂了会怎样"的场景,再动手敲命令。配置敲错可以重来,但思路一旦乱掉,排障成本会越来越高。希望这份实验实例能帮你把五个技术真正串起来。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进