前阵子搭了一套三层结构的网络实验环境,核心两台、汇聚两台、接入一台,实验目标很明确:把三层架构里的各路冗余手段都配上,然后人为制造故障,看流量到底能不能自己绕过去。做完最大的感受是——冗余两个字说起来容易,真正配置起来要同时搞定网关、链路、路由三个层面,少一个都不行。这篇文章就按这个踩坑顺序展开,先说明每层冗余到底防什么,再给出一套可以照抄的拓扑和IP规划,然后是VRRP、浮动路由、Eth-Trunk、STP这几类配置,最后用拔线、断口、关设备三种方式实测切换效果。适合正在学组网、准备网络认证实验,或者想系统梳理冗余设计原理的读者。1. 三层架构的冗余需求拆解:核心、汇聚、接入各自要防什么1.1 单点故障到底在哪里三层架构的职责划分很清楚:核心层负责高速转发,汇聚层是VLAN的网关、策略控制点和路由收敛点,接入层负责终端接入和VLAN划分。但正因为分了层,每一层都可能成为单点故障源。先说最容易理解的核心层。如果全网只有一台核心交换机,那这台设备一宕,所有跨网段通信全部中断。核心的上联链路、下联链路同样重要,核心设备活着但链路断了,效果跟设备宕机差不多。再说汇聚层。汇聚交换机承载的是下面所有终端的网关,它一旦故障,接入交换机下面挂着的几十个终端会同时失联。这里有个常见误解:很多人以为核心做了双机,汇聚挂了也没事,实际上汇聚是VLAN的网关所在地,网关消失了,终端连ARP都解析不出来,核心再冗余也没用。接入层的单点主要在两头:一是接入交换机本身,单台接入宕机,底下终端全掉;二是接入到汇聚的上联链路,如果只拉了一根线,汇聚坏了交换机还在,但上联断了,接入完全失联。所以在三层架构的冗余实验里,接入也要做双上联。这引出一个核心观点:冗余不是多放一台设备那么简单。设备在,不代表流量会自动过去。真正困难的是故障发生之后,由哪个协议触发切换、切换需要多长时间、切换后的路径是否和网关、路由收敛结果保持一致。如果只堆设备不配协议,故障时网络该断还是断。1.2 每层该用什么手段去兜底不同层面的故障,要由不同协议来解决,不存在一个万能协议包办所有冗余。我习惯把整个实验的冗余任务拆成四块:故障点典型故障影响范围对应冗余手段汇聚交换机网关汇聚宕机,VLAN网关消失接入层所有终端无法跨网段通信VRRP虚拟网关冗余汇聚到核心的上联链路上联断线,二层/三层路径失效终端有网关但访问不了服务器和外网双核心互联 + 浮动静态路由汇聚到核心的物理线路单根物理线故障带宽下降或链路中断Eth-Trunk链路聚合接入到汇聚的双上联二层链路构成环路广播风暴、MAC漂移RSTP/MSTP防环选路这套任务拆解出来之后,实验的配置顺序也天然定下来了:先做VRRP保证网关不丢,再做路由冗余保证三层有备胎,然后做Eth-Trunk和STP保证物理链路和二层的可用性。后面几章完全按这个顺序来,因为每一步都是在给前面的方案做支撑。2. 实验拓扑与地址规划:理清冗余路径再动手配置2.1 拓扑怎么搭场景用到的设备一共五台交换机和三台终端:两台核心交换机,名字就叫CORE-1、CORE-2;两台汇聚交换机,叫DIST-1、DIST-2;一台接入交换机ACCESS-1。终端方面,PC-A属于VLAN 10,PC-B属于VLAN 20,另外有一台服务器SERVER直连在CORE-1上。连接关系按冗余思路铺:CORE-1和CORE-2之间用一根三层链路互联,保证核心层可以互通。DIST-1上联CORE-1,DIST-2上联CORE-2,但汇聚之间也拉了一根三层链路,这样每台汇聚都有一条备用路径绕到对方核心。DIST-1到CORE-1之间用两条物理链路做Eth-Trunk,DIST-2到CORE-2之间同样用两条物理链路做Eth-Trunk。ACCESS-1分别接DIST-1和DIST-2各一根Trunk链路,形成接入双归。PC-A、PC-B分别接在ACCESS-1的下行口,SERVER接在CORE-1的一个三层口上。这里有个设计取舍要解释一下:接入层到汇聚层为什么不做Eth-Trunk跨设备聚合?因为普通链路聚合要求成员口必须接到同一台设备上,ACC-ESS-1的两根线分别接DIST-1和DIST-2,不是同一台设备,在没有堆叠/集群的情况下无法直接用Eth-Trunk把两条链路捆起来。所以接入双归采用STP冗余方案,让RSTP自动阻塞一条路径,另一条作为工作链路。这个点后面专门展开。2.2 IP地址与VLAN规划表地址规划直接影响后续配置能不能一次通过。我习惯先把互联地址、VLAN接口地址、网关虚拟地址分开列成一张表,再动手配。区域网段说明CORE-1 与 CORE-2 互联10.0.10.0/30CORE-1用.1,CORE-2用.2DIST-1 与 DIST-2 互联10.0.11.0/30DIST-1用.1,DIST-2用.2CORE-1 与 DIST-1 互联10.0.12.0/30CORE-1用.1,DIST-1用.2CORE-2 与 DIST-2 互联10.0.13.0/30CORE-2用.1,DIST-2用.2VLAN 10192.168.10.0/24PC-A所在网段VLAN 20192.168.20.0/24PC-B所在网段SERVER 直连网段10.0.200.0/24SERVER地址10.0.200.10VLAN的三层接口地址也要单独规划,因为VRRP需要一个真实接口地址和一个虚拟网关地址,两者不能冲突:设备Vlanif10 地址Vlanif20 地址虚拟网关DIST-1192.168.10.251192.168.20.251192.168.10.254 / 192.168.20.254DIST-2192.168.10.252192.168.20.252同上真实接口地址用.251和.252,虚拟网关用.254,既保留了终端习惯里的"网关是254",又不会和物理接口地址冲突。这是VRRP配置里很基础也很容易踩的坑——有些人直接把虚拟IP配成某个接口的地址,结果是接口起不来或者VRRP状态异常。2.3 为什么汇聚之间用三层互联而不是二层互联这是一个架构上的关键决策。如果汇聚之间走二层Trunk,那整个二层广播域就会从接入层一直连到汇聚层再到汇聚间链路,环路链路一下子变得复杂,STP的阻塞点选择也更难预测。更关键的是,两台汇聚之间的三层互联可以让跨汇聚的流量走三层路由,而不是靠二层交换绕来绕去。本实验里DIST-1和DIST-2之间是三层口,CORE-1和CORE-2之间也是三层口,接入双归形成的二层环路被严格限制在"ACCESS-1到两台汇聚"这一段。这样做的好处是:STP只需要处理一个很小的二层次拓扑,VRRP网关冗余在汇聚层独立工作不会互相干扰,三层路由冗余由静态路由或动态路由统一负责。这是现网里很经典的做法,也是这个实验想验证的核心架构。3. 网关冗余配置:VRRP让两台汇聚共用一个虚拟网关3.1 VRRP原理与角色选择终端设备上配置的网关通常是一个IP地址,这个IP必须始终有人应答。VRRP的思想是让两台汇聚设备共享一个虚拟IP,通过优先级决定谁是主设备(Master),谁是备份设备(Backup)。Master负责响应ARP请求和转发流量,Backup在Master故障时接替,整个过程中终端的网关IP不变,所以终端完全无感知。VRRP协议有几个默认行为要心里有数:优先级默认100,范围是1到254,数值越大越优先;Master默认每秒发送一次VRRP通告报文,Backup连续3个通告周期没收到Master报文,就会切换成Master,这个时间大约是3秒出头。生产环境里一般会配合BFD或者track联动来缩短切换时间。3.2 DIST-1和DIST-2完整配置VLAN 10和VLAN 20的网关设计,我采用了一个简单但很稳妥的方案:所有VLAN的主网关都放在DIST-1,DIST-2全部作为备份。这样设计的原因和STP根桥选择有关,后面会细说,这里先看配置。先在DIST-1上创建VLAN并配置VRRP:vlan batch 10 20 interface Vlanif10 ip address 192.168.10.251 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 20 vrrp vrid 10 track interface Eth-Trunk 1 reduced 30 vrrp vrid 10 track interface GigabitEthernet0/0/24 reduced 30 interface Vlanif20 ip address 192.168.20.251 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 20 vrrp vrid 20 track interface Eth-Trunk 1 reduced 30 vrrp vrid 20 track interface GigabitEthernet0/0/24 reduced 30DIST-2的配置就简单得多,保持默认优先级100即可:vlan batch 10 20 interface Vlanif10 ip address 192.168.10.252 255.255.255.0 vrrp vrid 10 virtual-ip 192.168.10.254 interface Vlanif20 ip address 192.168.20.252 255.255.255.0 vrrp vrid 20 virtual-ip 192.168.20.254两条配置放在一起对比,最直观的区别就是优先级。DIST-1的120压过DIST-2的100,所以正常情况下DIST-1是Master。3.3 track联动:让VRRP感知上下游故障如果只配上面这些命令,实验做到一半就会发现问题:VRRP只能保证虚拟网关IP地址还存在,但它不知道网关设备的上行链路和下行链路是不是还活着。比如DIST-1的上联Eth-Trunk断了,DIST-1依然认为自己是Master,继续应答ARP,但流量进了DIST-1根本送不到核心,这就是典型的"假活"。解决方法是VRRP track。上面配置里的两行track,含义非常明确:vrrp vrid 10 track interface Eth-Trunk 1 reduced 30 vrrp vrid 10 track interface GigabitEthernet0/0/24 reduced 30意思是:如果Eth-Trunk 1(上联核心的聚合口)故障,优先级减30;如果连ACCESS-1的下行口故障,优先级再减30。DIST-1初始优先级120,上联断了降到90,DIST-2的100自然就超过了它,于是VRRP主动切到DIST-2。下行口断了同理,因为终端已经无法通过DIST-1二层访问网关,必须让DIST-2接管。配置preempt-mode timer delay 20也值得单独说。DIST-1恢复之后,如果立刻抢回Master,可能网络里的路由还没完全收敛,第3层路径还是指向DIST-2,网关却已经切回DIST-1,会造成短时间二次中断。延迟20秒抢占,让路由先稳定下来再切,是实际配置里的常用手段。配置完之后用display vrrp查看状态,正常应该看到VLAN 10和VLAN 20的Master都是DIST-1,Backup是DIST-2。如果看到一方状态是Initialize,多半是track的接口没起来或者虚拟IP和接口地址冲突。4. 路由冗余配置:静态浮动路由给核心-汇聚兜底4.1 静态路由还是动态路由网关由VRRP接管之后,三层的转发路径还需要单独做冗余。这个实验我选的是静态浮动路由,而不是OSPF或者静态等价负载均衡,原因是它简单直观,能让人一眼看清"主路径挂了备路径顶上"的机制。动态路由协议在生产环境确实更常用,尤其适合规模大、链路多的场景。但在这个只有五台交换机的实验里,引入OSPF反而会分散注意力,还得处理DR/BDR选举、区域设计这些细节。静态浮动路由只需要在每台设备上写两三条命令,管理距离(华为命令行里叫Preference)大的那条作为备份,故障时自动替换,配合路由表查看效果一目了然。4.2 四台设备的浮动路由配置以SERVER挂在CORE-1上为前提,看四条设备的配置。CORE-1需要能到达VLAN 10和VLAN 20,首选直接走DIST-1,备选经CORE-2再到DIST-2:ip route-static 192.168.10.0 24 10.0.12.2 ip route-static 192.168.20.0 24 10.0.12.2 ip route-static 192.168.10.0 24 10.0.10.2 preference 80 ip route-static 192.168.20.0 24 10.0.10.2 preference 80CORE-2基本上对称:ip route-static 192.168.10.0 24 10.0.13.2 ip route-static 192.168.20.0 24 10.0.13.2 ip route-static 192.168.10.0 24 10.0.10.1 preference 80 ip route-static 192.168.20.0 24 10.0.10.1 preference 80CORE-2还需要一条去往SERVER的备份路由,因为SERVER直连在CORE-1上:ip route-static 10.0.200.0 24 10.0.10.1DIST-1上,去往SERVER首选用上联CORE-1,备用路径是经DIST-2再到CORE-2:ip route-static 10.0.200.0 24 10.0.12.1 ip route-static 10.0.200.0 24 10.0.11.2 preference 80DIST-2对称配置:ip route-static 10.0.200.0 24 10.0.13.1 ip route-static 10.0.200.0 24 10.0.11.1 preference 80默认情况下静态路由的Preference是60,备选路由写成80,含义是:主路由一直存在时,备选路由不会进入路由表;主路由失效,备选路由才会被激活。这个机制和VRRP的Master切换是独立的两条线,但最终效果是配合的——VRRP负责让终端找到正确的网关,浮动路由负责让网关知道正确的出口。4.3 验证路由表配置完一定要查一下路由表,不要凭记忆认为命令敲进去就行。在DIST-1上执行路由查看命令,正常情况下到10.0.200.0/24只应该看到一条活跃路由,下一跳是10.0.12.1,Preference是60。如果你看到10.0.11.2那条还在路由表里,说明主链路已经处于故障状态,或者主路由的配置本身就有问题。这里容易犯的错误是把优先级写反了,结果变成主链路正常时流量反而走备份路径,主链路故障后网络直接中断。所以每台设备配完,先看一遍路由表确认当前活跃路径是预期的那条,再去做故障注入测试。5. 链路聚合与接入双归:Eth-Trunk和STP各自负责的段落5.1 汇聚到核心的Eth-Trunk链路聚合解决的是物理线路层面的冗余。DIST-1到CORE-1之间拉了两根线,如果不做聚合,可能会形成三层环路或者需要靠某种协议去防环。做成Eth-Trunk之后,两根物理线被当成一条逻辑链路,带宽叠加,单根线断了不影响业务。配置分两头做。CORE-1这边:interface Eth-Trunk 1 ip address 10.0.12.1 255.255.255.252 interface GigabitEthernet0/0/1 eth-trunk 1 interface GigabitEthernet0/0/2 eth-trunk 1DIST-1这边:interface Eth-Trunk 1 ip address 10.0.12.2 255.255.255.252 interface GigabitEthernet0/0/1 eth-trunk 1 interface GigabitEthernet0/0/2 eth-trunk 1DIST-2到CORE-2之间的配置完全一样,只是网段换成10.0.13.0/30。配Eth-Trunk之前一定要确认成员口的属性一致,速率、双工、VLAN配置都要相同。很多人遇到聚合口起不来的情况,多半是某个成员口之前单独配过access或者trunk,和聚合组的配置冲突,直接在物理口下执行eth-trunk命令时被拒绝。稳妥的顺序是:先建Eth-Trunk接口,配好属性,再把物理口加进聚合组。5.2 接入双归为什么不用跨设备聚合这是实验里最值得停下来想清楚的一个问题。ACCESS-1有两根上联,分别接到DIST-1和DIST-2,按理说做一个Eth-Trunk把两根线捆起来最理想,带宽翻倍又有冗余。但普通以太网链路聚合有一个前提:所有成员口必须对接同一台对端设备,因为聚合组在转发层面就是一条逻辑链路,Hash选路、MAC学习都要按单链路处理。如果成员口分别接两台不同的汇聚,没有堆叠/集群把两台汇聚虚拟成一台设备,就无法正常工作。所以在不引入堆叠的简单实验里,接入双归的正确做法是走STP:让两根上联都处于Trunk转发状态,由RSTP根据根桥和路径开销自动阻塞其中一条,另一条作为工作链路。这样物理上是双归,逻辑上只有一条活跃二层路径,冗余效果靠故障时STP重新收敛来实现。5.3 链路聚合的验证与坑配置完成后在DIST-1上查看聚合组状态,应该看到Eth-Trunk 1的状态是Up,两个成员口都处于Selected状态。如果某个成员口状态是Unselected,先检查对端有没有配置、成员口是不是shutdown、物理线缆在模拟器里有没有连错设备。实测里有个现象值得记录:Eth-Trunk里断掉一根成员线,逻辑链路依然是Up的,流量完全不中断,只是总带宽减半。这正好能用来区分链路聚合和浮动路由——前者解决同一对设备之间的链路冗余,后者解决设备之间路径的冗余。如果把Eth-Trunk一根线断掉当成故障来测试,会发现VRRP和路由表都没有任何变化,因为在你设计的架构里,这个故障根本不应该引起路由切换。6. STP根桥规划与边缘端口:二层拓扑不能靠随机选举6.1 RSTP优先级与根桥选择接入双归之后,二层拓扑是ACCESS-1同时连DIST-1和DIST-2。如果不做任何STP配置,交换机会自己选举根桥,随机性很大,可能出现接入交换机自己成为根桥、或者根桥落在路径开销不理想的位置,导致冗余路径和数据流向不匹配。这个实验里我明确把根桥指定在DIST-1:DIST-1:stp mode rstp stp priority 4096DIST-2:stp mode rstp stp priority 8192ACCESS-1:stp mode rstp优先级数值越小越优先,4096小于8192小于默认的32768,所以根桥稳定落在DIST-1。这样设计的直接好处是:正常状态下接入交换机向上走DIST-1,和二层的VRRP主路径完全一致,流量路径最顺。6.2 根桥与VRRP主必须重合的理由这是我在早期实验里踩过的一个比较深的坑。一开始为了体现两台汇聚都干活,我把VLAN 10的VRRP主放在DIST-1,VLAN 20的VRRP主放在DIST-2,同时STP单实例的根桥也设了DIST-1。看起来配置互相独立,实际上一测试就有问题:VLAN 20的PC网关在DIST-2,可二层树根在DIST-1,ACCESS-1到DIST-2的那条上联很可能被STP阻塞,导致PC根本到不了自己的网关。原因在于,STP单实例的阻塞是全局统一的,它不会区分VLAN 10和VLAN 20。VRRP却可以按VLAN分别指定主备。两个机制不配合时,就会发生"网关宣告的设备在二层不可达"的尴尬。所以在这个简单实验里,我最终选择让所有VLAN的VRRP主都在DIST-1,STP根桥也在DIST-1,保证逻辑和物理完全对齐。如果能用到MSTP多实例,那可以做VLAN负载分担,每个实例指定不同的根桥,和VRRP主备交错对应起来,但那是进阶玩法,不在这个基础实验范围里。6.3 边缘端口与收敛时间接入交换机连接PC的下行口属于终端接口,下边不会再接交换设备,应该配置成边缘端口,让这些口不参与STP的Listening和Learning过程,直接进入Forwarding状态,否则PC开机后要等几十秒才能上网。在ACCESS-1的下行口上:interface GigabitEthernet0/0/1 stp edged-port enable interface GigabitEthernet0/0/2 stp edged-port enable配置RSTP之后,二层链路故障的收敛时间通常在1到3秒。如果用传统STP,默认要30到50秒才能重新收敛,这在现代网络里基本不可接受。所以实验里不要只开STP,一定要显式使用RSTP或者MSTP,边缘端口也要配上,否则故障测试的效果会很难看。配置好之后在ACCESS-1上查看STP状态,正常情况下DIST-1是根桥,接入到DIST-1的口处于转发状态,到DIST-2的口可能是备份阻塞状态,具体看路径开销和端口ID。这就说明接入双归已经完成了"一条转发、一条备份"的准备。7. 故障注入实测:拔线、断链路、关设备后的切换表现7.1 准备一个持续ping的测试终端所有冗余配置做完,进入最关键的验证环节。我在PC-A上执行持续ping命令,目标地址是SERVER的10.0.200.10,然后在模拟器里不断制造故障,观察丢包数量和恢复时间。注意,模拟器里的ping测试最好加大间隔或者设置足够多的包数,否则还没等到故障出现,测试就结束了。还有一个小技巧:测试前先确认正常情况下ping完全不丢包,再开始拔线,否则后续测出来的丢包说不清是故障导致的还是环境本身不稳定。7.2 场景A:上联链路故障先测DIST-1的上联。在DIST-1上把Eth-Trunk 1的成员口全部shutdown,模拟汇聚到核心的上联中断。预期效果是:VRRP的track感知到Eth-Trunk 1故障,把DIST-1优先级从120降到90,DIST-2成为Master,终端的网关切换到DIST-2。同时DIST-1到10.0.200.0/24的首选路由失效,备用路由10.0.11.2激活,流量经DIST-2再绕到核心。实测现象通常是:ping丢两三个包之后恢复,中断时间在几秒以内。这符合预期,因为VRRP切换需要等待track检测和状态转化,加上终端重新ARP解析网关,有一定时间开销。有个细节值得单独说:如果只断开Eth-Trunk里的其中一根成员线,Eth-Trunk整体依然是Up的,VRRP和路由都不会切换,ping也不会丢包。这就是链路聚合与路由冗余的边界——普通物理线冗余要靠聚合,聚合口整体故障才轮到路由层去切换。7.3 场景B:下联接入链路故障再测DIST-1连ACCESS-1的那根下行线,直接在DIST-1的下行口上shutdown。这个场景如果没有配置track下行口,会出现一个很典型的问题:VRRP Master还留在DIST-1,但接入交换机已经无法通过二层路径访问到DIST-1,PC有网关地址却到不了网关。原因在于VRRP并不能感知下行二层路径的断裂,它只知道自己的接口还在、上联还在、报文还能发出去。我在DIST-1上配置的第二个track,也就是track GigabitEthernet0/0/24,就是专门解决这个问题的。下行口断开后,DIST-1优先级被降低,DIST-2接管网关,同时RSTP重新收敛,接入交换机的活跃上行路径切到DIST-2。实测ping中断的包数比场景A稍多一些,因为STP重新收敛和VRRP切换几乎同时发生,路径重建需要一点时间,但整体依然在可接受范围内。7.4 场景C:汇聚设备整机关闭最后做最狠的测试:直接把DIST-1整个设备关闭,模拟整台汇聚宕机。这种情况下,VRRP的Master收不到DIST-1的VRRP通告报文,默认在几个通告周期结束后切换到DIST-2;RSTP因为根桥消失,重新选举DIST-2作为根桥,接入交换机的活跃路径完全切到DIST-2;浮动路由也因为DIST-1整机不可达而切换到备用路径。三个机制各自工作,最终汇聚到同一个结果:网关在DIST-2,二层路径在DIST-2,三层出口也在DIST-2。恢复DIST-1之后,由于配置了preempt delay 20秒,DIST-1不会立即抢回Master,而是等20秒让路由、STP全部稳定后再切回来,避免网络震荡。这一步在实验里一定要观察,很多人会忽略抢占延迟,导致恢复瞬间出现二次丢包。7.5 实测结果汇总与冗余配置的优先级顺序三种故障场景的实测结果可以整理成一张表:故障场景触发机制切换结果恢复时间上联Eth-Trunk全部断开VRRP track上联 + 浮动路由网关切DIST-2,路由走备用几秒内恢复下联接入链路断开VRRP track下行口 + RSTP收敛网关切DIST-2,二层路径重建比场景A略慢DIST-1整机关闭VRRP超时 + RSTP重选根 + 浮动路由所有流量集中DIST-23秒左右恢复整个实验做完,我个人最大的体会是:网络冗余的配置顺序是有依赖关系的,VRRP要感知上下游故障必须配合track,路由冗余要等主链路失效才启用备份,STP根桥必须和VRRP主设备保持同一台。如果配置的时候把这些机制的边界和配合关系理清楚,这个三层架构的冗余实验在实际操作中会比想象中顺利很多,故障注入的每一步也都能解释得明明白白。
前阵子搭了一套三层结构的网络实验环境,核心两台、汇聚两台、接入一台,实验目标很明确:把三层架构里的各路冗余手段都配上,然后人为制造故障,看流量到底能不能自己绕过去。做完最大的感受是——冗余两个字说起来容易,真正配置起来要同时搞定网关、链路、路由三个层面,少一个都不行。这篇文章就按这个踩坑顺序展开,先说明每层冗余到底防什么,再给出一套可以照抄的拓扑和IP规划,然后是VRRP、浮动路由、Eth-Trunk、STP这几类配置,最后用拔线、断口、关设备三种方式实测切换效果。适合正在学组网、准备网络认证实验,或者想系统梳理冗余设计原理的读者。1. 三层架构的冗余需求拆解:核心、汇聚、接入各自要防什么1.1 单点故障到底在哪里三层架构的职责划分很清楚:核心层负责高速转发,汇聚层是VLAN的网关、策略控制点和路由收敛点,接入层负责终端接入和VLAN划分。但正因为分了层,每一层都可能成为单点故障源。先说最容易理解的核心层。如果全网只有一台核心交换机,那这台设备一宕,所有跨网段通信全部中断。核心的上联链路、下联链路同样重要,核心设备活着但链路断了,效果跟设备宕机差不多。再说汇聚层。汇聚交换机承载的是下面所有终端的网关,它一旦故障,接入交换机下面挂着的几十个终端会同时失联。这里有个常见误解:很多人以为核心做了双机,汇聚挂了也没事,实际上汇聚是VLAN的网关所在地,网关消失了,终端连ARP都解析不出来,核心再冗余也没用。接入层的单点主要在两头:一是接入交换机本身,单台接入宕机,底下终端全掉;二是接入到汇聚的上联链路,如果只拉了一根线,汇聚坏了交换机还在,但上联断了,接入完全失联。所以在三层架构的冗余实验里,接入也要做双上联。这引出一个核心观点:冗余不是多放一台设备那么简单。设备在,不代表流量会自动过去。真正困难的是故障发生之后,由哪个协议触发切换、切换需要多长时间、切换后的路径是否和网关、路由收敛结果保持一致。如果只堆设备不配协议,故障时网络该断还是断。1.2 每层该用什么手段去兜底不同层面的故障,要由不同协议来解决,不存在一个万能协议包办所有冗余。我习惯把整个实验的冗余任务拆成四块:故障点典型故障影响范围对应冗余手段汇聚交换机网关汇聚宕机,VLAN网关消失接入层所有终端无法跨网段通信VRRP虚拟网关冗余汇聚到核心的上联链路上联断线,二层/三层路径失效终端有网关但访问不了服务器和外网双核心互联 + 浮动静态路由汇聚到核心的物理线路单根物理线故障带宽下降或链路中断Eth-Trunk链路聚合接入到汇聚的双上联二层链路构成环路广播风暴、MAC漂移RSTP/MSTP防环选路这套任务拆解出来之后,实验的配置顺序也天然定下来了:先做VRRP保证网关不丢,再做路由冗余保证三层有备胎,然后做Eth-Trunk和STP保证物理链路和二层的可用性。后面几章完全按这个顺序来,因为每一步都是在给前面的方案做支撑。2. 实验拓扑与地址规划:理清冗余路径再动手配置2.1 拓扑怎么搭场景用到的设备一共五台交换机和三台终端:两台核心交换机,名字就叫CORE-1、CORE-2;两台汇聚交换机,叫DIST-1、DIST-2;一台接入交换机ACCESS-1。终端方面,PC-A属于VLAN 10,PC-B属于VLAN 20,另外有一台服务器SERVER直连在CORE-1上。连接关系按冗余思路铺:CORE-1和CORE-2之间用一根三层链路互联,保证核心层可以互通。DIST-1上联CORE-1,DIST-2上联CORE-2,但汇聚之间也拉了一根三层链路,这样每台汇聚都有一条备用路径绕到对方核心。DIST-1到CORE-1之间用两条物理链路做Eth-Trunk,DIST-2到CORE-2之间同样用两条物理链路做Eth-Trunk。ACCESS-1分别接DIST-1和DIST-2各一根Trunk链路,形成接入双归。PC-A、PC-B分别接在ACCESS-1的下行口,SERVER接在CORE-1的一个三层口上。这里有个设计取舍要解释一下:接入层到汇聚层为什么不做Eth-Trunk跨设备聚合?因为普通链路聚合要求成员口必须接到同一台设备上,ACC-ESS-1的两根线分别接DIST-1和DIST-2,不是同一台设备,在没有堆叠/集群的情况下无法直接用Eth-Trunk把两条链路捆起来。所以接入双归采用STP冗余方案,让RSTP自动阻塞一条路径,另一条作为工作链路。这个点后面专门展开。2.2 IP地址与VLAN规划表地址规划直接影响后续配置能不能一次通过。我习惯先把互联地址、VLAN接口地址、网关虚拟地址分开列成一张表,再动手配。区域网段说明CORE-1 与 CORE-2 互联10.0.10.0/30CORE-1用.1,CORE-2用.2DIST-1 与 DIST-2 互联10.0.11.0/30DIST-1用.1,DIST-2用.2CORE-1 与 DIST-1 互联10.0.12.0/30CORE-1用.1,DIST-1用.2CORE-2 与 DIST-2 互联10.0.13.0/30CORE-2用.1,DIST-2用.2VLAN 10192.168.10.0/24PC-A所在网段VLAN 20192.168.20.0/24PC-B所在网段SERVER 直连网段10.0.200.0/24SERVER地址10.0.200.10VLAN的三层接口地址也要单独规划,因为VRRP需要一个真实接口地址和一个虚拟网关地址,两者不能冲突:设备Vlanif10 地址Vlanif20 地址虚拟网关DIST-1192.168.10.251192.168.20.251192.168.10.254 / 192.168.20.254DIST-2192.168.10.252192.168.20.252同上真实接口地址用.251和.252,虚拟网关用.254,既保留了终端习惯里的"网关是254",又不会和物理接口地址冲突。这是VRRP配置里很基础也很容易踩的坑——有些人直接把虚拟IP配成某个接口的地址,结果是接口起不来或者VRRP状态异常。2.3 为什么汇聚之间用三层互联而不是二层互联这是一个架构上的关键决策。如果汇聚之间走二层Trunk,那整个二层广播域就会从接入层一直连到汇聚层再到汇聚间链路,环路链路一下子变得复杂,STP的阻塞点选择也更难预测。更关键的是,两台汇聚之间的三层互联可以让跨汇聚的流量走三层路由,而不是靠二层交换绕来绕去。本实验里DIST-1和DIST-2之间是三层口,CORE-1和CORE-2之间也是三层口,接入双归形成的二层环路被严格限制在"ACCESS-1到两台汇聚"这一段。这样做的好处是:STP只需要处理一个很小的二层次拓扑,VRRP网关冗余在汇聚层独立工作不会互相干扰,三层路由冗余由静态路由或动态路由统一负责。这是现网里很经典的做法,也是这个实验想验证的核心架构。3. 网关冗余配置:VRRP让两台汇聚共用一个虚拟网关3.1 VRRP原理与角色选择终端设备上配置的网关通常是一个IP地址,这个IP必须始终有人应答。VRRP的思想是让两台汇聚设备共享一个虚拟IP,通过优先级决定谁是主设备(Master),谁是备份设备(Backup)。Master负责响应ARP请求和转发流量,Backup在Master故障时接替,整个过程中终端的网关IP不变,所以终端完全无感知。VRRP协议有几个默认行为要心里有数:优先级默认100,范围是1到254,数值越大越优先;Master默认每秒发送一次VRRP通告报文,Backup连续3个通告周期没收到Master报文,就会切换成Master,这个时间大约是3秒出头。生产环境里一般会配合BFD或者track联动来缩短切换时间。3.2 DIST-1和DIST-2完整配置VLAN 10和VLAN 20的网关设计,我采用了一个简单但很稳妥的方案:所有VLAN的主网关都放在DIST-1,DIST-2全部作为备份。这样设计的原因和STP根桥选择有关,后面会细说,这里先看配置。先在DIST-1上创建VLAN并配置VRRP:vlan batch 10 20 interface Vlanif10 ip address 192.168.10.251 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 20 vrrp vrid 10 track interface Eth-Trunk 1 reduced 30 vrrp vrid 10 track interface GigabitEthernet0/0/24 reduced 30 interface Vlanif20 ip address 192.168.20.251 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 20 vrrp vrid 20 track interface Eth-Trunk 1 reduced 30 vrrp vrid 20 track interface GigabitEthernet0/0/24 reduced 30DIST-2的配置就简单得多,保持默认优先级100即可:vlan batch 10 20 interface Vlanif10 ip address 192.168.10.252 255.255.255.0 vrrp vrid 10 virtual-ip 192.168.10.254 interface Vlanif20 ip address 192.168.20.252 255.255.255.0 vrrp vrid 20 virtual-ip 192.168.20.254两条配置放在一起对比,最直观的区别就是优先级。DIST-1的120压过DIST-2的100,所以正常情况下DIST-1是Master。3.3 track联动:让VRRP感知上下游故障如果只配上面这些命令,实验做到一半就会发现问题:VRRP只能保证虚拟网关IP地址还存在,但它不知道网关设备的上行链路和下行链路是不是还活着。比如DIST-1的上联Eth-Trunk断了,DIST-1依然认为自己是Master,继续应答ARP,但流量进了DIST-1根本送不到核心,这就是典型的"假活"。解决方法是VRRP track。上面配置里的两行track,含义非常明确:vrrp vrid 10 track interface Eth-Trunk 1 reduced 30 vrrp vrid 10 track interface GigabitEthernet0/0/24 reduced 30意思是:如果Eth-Trunk 1(上联核心的聚合口)故障,优先级减30;如果连ACCESS-1的下行口故障,优先级再减30。DIST-1初始优先级120,上联断了降到90,DIST-2的100自然就超过了它,于是VRRP主动切到DIST-2。下行口断了同理,因为终端已经无法通过DIST-1二层访问网关,必须让DIST-2接管。配置preempt-mode timer delay 20也值得单独说。DIST-1恢复之后,如果立刻抢回Master,可能网络里的路由还没完全收敛,第3层路径还是指向DIST-2,网关却已经切回DIST-1,会造成短时间二次中断。延迟20秒抢占,让路由先稳定下来再切,是实际配置里的常用手段。配置完之后用display vrrp查看状态,正常应该看到VLAN 10和VLAN 20的Master都是DIST-1,Backup是DIST-2。如果看到一方状态是Initialize,多半是track的接口没起来或者虚拟IP和接口地址冲突。4. 路由冗余配置:静态浮动路由给核心-汇聚兜底4.1 静态路由还是动态路由网关由VRRP接管之后,三层的转发路径还需要单独做冗余。这个实验我选的是静态浮动路由,而不是OSPF或者静态等价负载均衡,原因是它简单直观,能让人一眼看清"主路径挂了备路径顶上"的机制。动态路由协议在生产环境确实更常用,尤其适合规模大、链路多的场景。但在这个只有五台交换机的实验里,引入OSPF反而会分散注意力,还得处理DR/BDR选举、区域设计这些细节。静态浮动路由只需要在每台设备上写两三条命令,管理距离(华为命令行里叫Preference)大的那条作为备份,故障时自动替换,配合路由表查看效果一目了然。4.2 四台设备的浮动路由配置以SERVER挂在CORE-1上为前提,看四条设备的配置。CORE-1需要能到达VLAN 10和VLAN 20,首选直接走DIST-1,备选经CORE-2再到DIST-2:ip route-static 192.168.10.0 24 10.0.12.2 ip route-static 192.168.20.0 24 10.0.12.2 ip route-static 192.168.10.0 24 10.0.10.2 preference 80 ip route-static 192.168.20.0 24 10.0.10.2 preference 80CORE-2基本上对称:ip route-static 192.168.10.0 24 10.0.13.2 ip route-static 192.168.20.0 24 10.0.13.2 ip route-static 192.168.10.0 24 10.0.10.1 preference 80 ip route-static 192.168.20.0 24 10.0.10.1 preference 80CORE-2还需要一条去往SERVER的备份路由,因为SERVER直连在CORE-1上:ip route-static 10.0.200.0 24 10.0.10.1DIST-1上,去往SERVER首选用上联CORE-1,备用路径是经DIST-2再到CORE-2:ip route-static 10.0.200.0 24 10.0.12.1 ip route-static 10.0.200.0 24 10.0.11.2 preference 80DIST-2对称配置:ip route-static 10.0.200.0 24 10.0.13.1 ip route-static 10.0.200.0 24 10.0.11.1 preference 80默认情况下静态路由的Preference是60,备选路由写成80,含义是:主路由一直存在时,备选路由不会进入路由表;主路由失效,备选路由才会被激活。这个机制和VRRP的Master切换是独立的两条线,但最终效果是配合的——VRRP负责让终端找到正确的网关,浮动路由负责让网关知道正确的出口。4.3 验证路由表配置完一定要查一下路由表,不要凭记忆认为命令敲进去就行。在DIST-1上执行路由查看命令,正常情况下到10.0.200.0/24只应该看到一条活跃路由,下一跳是10.0.12.1,Preference是60。如果你看到10.0.11.2那条还在路由表里,说明主链路已经处于故障状态,或者主路由的配置本身就有问题。这里容易犯的错误是把优先级写反了,结果变成主链路正常时流量反而走备份路径,主链路故障后网络直接中断。所以每台设备配完,先看一遍路由表确认当前活跃路径是预期的那条,再去做故障注入测试。5. 链路聚合与接入双归:Eth-Trunk和STP各自负责的段落5.1 汇聚到核心的Eth-Trunk链路聚合解决的是物理线路层面的冗余。DIST-1到CORE-1之间拉了两根线,如果不做聚合,可能会形成三层环路或者需要靠某种协议去防环。做成Eth-Trunk之后,两根物理线被当成一条逻辑链路,带宽叠加,单根线断了不影响业务。配置分两头做。CORE-1这边:interface Eth-Trunk 1 ip address 10.0.12.1 255.255.255.252 interface GigabitEthernet0/0/1 eth-trunk 1 interface GigabitEthernet0/0/2 eth-trunk 1DIST-1这边:interface Eth-Trunk 1 ip address 10.0.12.2 255.255.255.252 interface GigabitEthernet0/0/1 eth-trunk 1 interface GigabitEthernet0/0/2 eth-trunk 1DIST-2到CORE-2之间的配置完全一样,只是网段换成10.0.13.0/30。配Eth-Trunk之前一定要确认成员口的属性一致,速率、双工、VLAN配置都要相同。很多人遇到聚合口起不来的情况,多半是某个成员口之前单独配过access或者trunk,和聚合组的配置冲突,直接在物理口下执行eth-trunk命令时被拒绝。稳妥的顺序是:先建Eth-Trunk接口,配好属性,再把物理口加进聚合组。5.2 接入双归为什么不用跨设备聚合这是实验里最值得停下来想清楚的一个问题。ACCESS-1有两根上联,分别接到DIST-1和DIST-2,按理说做一个Eth-Trunk把两根线捆起来最理想,带宽翻倍又有冗余。但普通以太网链路聚合有一个前提:所有成员口必须对接同一台对端设备,因为聚合组在转发层面就是一条逻辑链路,Hash选路、MAC学习都要按单链路处理。如果成员口分别接两台不同的汇聚,没有堆叠/集群把两台汇聚虚拟成一台设备,就无法正常工作。所以在不引入堆叠的简单实验里,接入双归的正确做法是走STP:让两根上联都处于Trunk转发状态,由RSTP根据根桥和路径开销自动阻塞其中一条,另一条作为工作链路。这样物理上是双归,逻辑上只有一条活跃二层路径,冗余效果靠故障时STP重新收敛来实现。5.3 链路聚合的验证与坑配置完成后在DIST-1上查看聚合组状态,应该看到Eth-Trunk 1的状态是Up,两个成员口都处于Selected状态。如果某个成员口状态是Unselected,先检查对端有没有配置、成员口是不是shutdown、物理线缆在模拟器里有没有连错设备。实测里有个现象值得记录:Eth-Trunk里断掉一根成员线,逻辑链路依然是Up的,流量完全不中断,只是总带宽减半。这正好能用来区分链路聚合和浮动路由——前者解决同一对设备之间的链路冗余,后者解决设备之间路径的冗余。如果把Eth-Trunk一根线断掉当成故障来测试,会发现VRRP和路由表都没有任何变化,因为在你设计的架构里,这个故障根本不应该引起路由切换。6. STP根桥规划与边缘端口:二层拓扑不能靠随机选举6.1 RSTP优先级与根桥选择接入双归之后,二层拓扑是ACCESS-1同时连DIST-1和DIST-2。如果不做任何STP配置,交换机会自己选举根桥,随机性很大,可能出现接入交换机自己成为根桥、或者根桥落在路径开销不理想的位置,导致冗余路径和数据流向不匹配。这个实验里我明确把根桥指定在DIST-1:DIST-1:stp mode rstp stp priority 4096DIST-2:stp mode rstp stp priority 8192ACCESS-1:stp mode rstp优先级数值越小越优先,4096小于8192小于默认的32768,所以根桥稳定落在DIST-1。这样设计的直接好处是:正常状态下接入交换机向上走DIST-1,和二层的VRRP主路径完全一致,流量路径最顺。6.2 根桥与VRRP主必须重合的理由这是我在早期实验里踩过的一个比较深的坑。一开始为了体现两台汇聚都干活,我把VLAN 10的VRRP主放在DIST-1,VLAN 20的VRRP主放在DIST-2,同时STP单实例的根桥也设了DIST-1。看起来配置互相独立,实际上一测试就有问题:VLAN 20的PC网关在DIST-2,可二层树根在DIST-1,ACCESS-1到DIST-2的那条上联很可能被STP阻塞,导致PC根本到不了自己的网关。原因在于,STP单实例的阻塞是全局统一的,它不会区分VLAN 10和VLAN 20。VRRP却可以按VLAN分别指定主备。两个机制不配合时,就会发生"网关宣告的设备在二层不可达"的尴尬。所以在这个简单实验里,我最终选择让所有VLAN的VRRP主都在DIST-1,STP根桥也在DIST-1,保证逻辑和物理完全对齐。如果能用到MSTP多实例,那可以做VLAN负载分担,每个实例指定不同的根桥,和VRRP主备交错对应起来,但那是进阶玩法,不在这个基础实验范围里。6.3 边缘端口与收敛时间接入交换机连接PC的下行口属于终端接口,下边不会再接交换设备,应该配置成边缘端口,让这些口不参与STP的Listening和Learning过程,直接进入Forwarding状态,否则PC开机后要等几十秒才能上网。在ACCESS-1的下行口上:interface GigabitEthernet0/0/1 stp edged-port enable interface GigabitEthernet0/0/2 stp edged-port enable配置RSTP之后,二层链路故障的收敛时间通常在1到3秒。如果用传统STP,默认要30到50秒才能重新收敛,这在现代网络里基本不可接受。所以实验里不要只开STP,一定要显式使用RSTP或者MSTP,边缘端口也要配上,否则故障测试的效果会很难看。配置好之后在ACCESS-1上查看STP状态,正常情况下DIST-1是根桥,接入到DIST-1的口处于转发状态,到DIST-2的口可能是备份阻塞状态,具体看路径开销和端口ID。这就说明接入双归已经完成了"一条转发、一条备份"的准备。7. 故障注入实测:拔线、断链路、关设备后的切换表现7.1 准备一个持续ping的测试终端所有冗余配置做完,进入最关键的验证环节。我在PC-A上执行持续ping命令,目标地址是SERVER的10.0.200.10,然后在模拟器里不断制造故障,观察丢包数量和恢复时间。注意,模拟器里的ping测试最好加大间隔或者设置足够多的包数,否则还没等到故障出现,测试就结束了。还有一个小技巧:测试前先确认正常情况下ping完全不丢包,再开始拔线,否则后续测出来的丢包说不清是故障导致的还是环境本身不稳定。7.2 场景A:上联链路故障先测DIST-1的上联。在DIST-1上把Eth-Trunk 1的成员口全部shutdown,模拟汇聚到核心的上联中断。预期效果是:VRRP的track感知到Eth-Trunk 1故障,把DIST-1优先级从120降到90,DIST-2成为Master,终端的网关切换到DIST-2。同时DIST-1到10.0.200.0/24的首选路由失效,备用路由10.0.11.2激活,流量经DIST-2再绕到核心。实测现象通常是:ping丢两三个包之后恢复,中断时间在几秒以内。这符合预期,因为VRRP切换需要等待track检测和状态转化,加上终端重新ARP解析网关,有一定时间开销。有个细节值得单独说:如果只断开Eth-Trunk里的其中一根成员线,Eth-Trunk整体依然是Up的,VRRP和路由都不会切换,ping也不会丢包。这就是链路聚合与路由冗余的边界——普通物理线冗余要靠聚合,聚合口整体故障才轮到路由层去切换。7.3 场景B:下联接入链路故障再测DIST-1连ACCESS-1的那根下行线,直接在DIST-1的下行口上shutdown。这个场景如果没有配置track下行口,会出现一个很典型的问题:VRRP Master还留在DIST-1,但接入交换机已经无法通过二层路径访问到DIST-1,PC有网关地址却到不了网关。原因在于VRRP并不能感知下行二层路径的断裂,它只知道自己的接口还在、上联还在、报文还能发出去。我在DIST-1上配置的第二个track,也就是track GigabitEthernet0/0/24,就是专门解决这个问题的。下行口断开后,DIST-1优先级被降低,DIST-2接管网关,同时RSTP重新收敛,接入交换机的活跃上行路径切到DIST-2。实测ping中断的包数比场景A稍多一些,因为STP重新收敛和VRRP切换几乎同时发生,路径重建需要一点时间,但整体依然在可接受范围内。7.4 场景C:汇聚设备整机关闭最后做最狠的测试:直接把DIST-1整个设备关闭,模拟整台汇聚宕机。这种情况下,VRRP的Master收不到DIST-1的VRRP通告报文,默认在几个通告周期结束后切换到DIST-2;RSTP因为根桥消失,重新选举DIST-2作为根桥,接入交换机的活跃路径完全切到DIST-2;浮动路由也因为DIST-1整机不可达而切换到备用路径。三个机制各自工作,最终汇聚到同一个结果:网关在DIST-2,二层路径在DIST-2,三层出口也在DIST-2。恢复DIST-1之后,由于配置了preempt delay 20秒,DIST-1不会立即抢回Master,而是等20秒让路由、STP全部稳定后再切回来,避免网络震荡。这一步在实验里一定要观察,很多人会忽略抢占延迟,导致恢复瞬间出现二次丢包。7.5 实测结果汇总与冗余配置的优先级顺序三种故障场景的实测结果可以整理成一张表:故障场景触发机制切换结果恢复时间上联Eth-Trunk全部断开VRRP track上联 + 浮动路由网关切DIST-2,路由走备用几秒内恢复下联接入链路断开VRRP track下行口 + RSTP收敛网关切DIST-2,二层路径重建比场景A略慢DIST-1整机关闭VRRP超时 + RSTP重选根 + 浮动路由所有流量集中DIST-23秒左右恢复整个实验做完,我个人最大的体会是:网络冗余的配置顺序是有依赖关系的,VRRP要感知上下游故障必须配合track,路由冗余要等主链路失效才启用备份,STP根桥必须和VRRP主设备保持同一台。如果配置的时候把这些机制的边界和配合关系理清楚,这个三层架构的冗余实验在实际操作中会比想象中顺利很多,故障注入的每一步也都能解释得明明白白。