做过网络运维的,估计都怕两类事:一是光缆被施工队挖断,二是网关设备出问题。前者只要链路冗余到位,倒还能扛;后者经常是灾难点,因为整片网络的默认路由都指到那一台上,它一掉,其他设备再健康也没用。解决这个问题的标准手段,就是VRRP(虚拟路由器冗余协议)。我第一次在真实现场用它,是在某分公司核心设备升级失败启动不起来的故障里,才意识到网关冗余不是可选项,而是必备项。这篇把VRRP的工作机制、配置方法、版本选择与排错经验一次性聊透,适合刚接触网络高可用的新人,也适合准备在生产环境做网关冗余的工程师参考。
1. 单网关是常态,但单网关的故障边界比想象中宽
1.1 网关失效的现场比你以为的常见
几乎所有传统网络里,终端上的默认网关都只指向一台三层设备。这台设备可能是核心交换机、出口路由器,也可能是防火墙。数据包只要去往其他网段,第一步就是找它。它的可用性,决定了整张网的下限。
我见过不止一次这样的复盘:凌晨某设备被远程误操作重启,几十个VLAN、几千个终端在同一个时间点哑火;又比如某个营业网点,出口路由器的电源模块老化,白天突然重启,整个收银系统全部掉线,恢复数据又花了半小时。应用层部署了一堆双机、集群、负载均衡,但网络层只有一条静态路由,相当于所有的冗余都架在一层没有备份的地基上。
单网关场景本身没有错。配置简单、行为清晰、排障路径短,运维成本低,很多中小网络几年都不出一次故障。问题在于,只要出一次,影响面就是全网。所以要不要做网关冗余,不应该看“过去几年坏没坏”,而应该看“坏了以后能不能接受”。
1.2 为什么两台设备配同一个IP解决不了问题
有人第一反应:既然网关那么重要,就给两台设备都配上同一个IP,随便挂哪台都能通。现实是行不通的。两台设备不在同一个协调机制下,无法决定谁该回应ARP、谁该转发报文。终端发一个IP冲突检测,可能两台设备都回应,也可能一台回应、另一台闷头干活,数据乱走一通。IP和MAC的一一对应关系一旦被打破,整个二层就开始飘。
VRRP的思路完全不同。两台设备不争“同一个IP”,而是共同维护一个独立的“虚拟IP”。这个虚拟IP是稳定的外部形象,真正干活的是两台物理设备中的一台。协议内部的协商机制决定谁当前是Master,谁是Backup。对外,终端只感知到虚拟IP,不知道背后的设备已经在某一秒悄悄换过。这个机制,就是解决网关单点故障的常规答案。
2. VRRP组的工作机制:虚拟IP、虚拟MAC与主备选举
2.1 虚拟路由器是怎么“造”出来的
VRRP把两台路由设备抽象成一台“虚拟路由器”。这个虚拟路由器有自己的IP,也就是虚拟IP,一般规划成网关地址。比如网段192.168.10.0/24的网关是192.168.10.254,这个地址不是某台设备的物理接口地址,而是两台设备共同声明的一个稳定标识。
终端在解析网关MAC时,会通过ARP拿到一个特殊的虚拟MAC。VRRP的虚拟MAC格式一般是00-00-5E-00-01-XX,其中XX就是VRID(虚拟路由器编号)。VRID要在一个三层接口范围内保持一致,比如VRID 1对应00-00-5E-00-01-01。主机的ARP表里,网关IP绑定的是这个虚拟MAC,而不是某台物理设备的实际MAC。
这样一来,二层交换机上的MAC表也只会记录虚拟MAC,它对应的是当前Master所在的端口。Master设备在转发时,会把报文的源MAC写成虚拟MAC,而不是自己的物理MAC。即使Master从A切到B,虚拟IP和虚拟MAC都没变,变的只是二层端口与物理设备之间的对应关系。这个机制特别像公司总机号码不变、接电话的人换了,终端不会感知到变化,只有内部机制知道发生了交接。
2.2 选举与切换:优先级、抢占、Master_Down_Interval
虚拟路由器在同一时刻只会有一台设备活跃,谁活跃由选举决定。选举依据主要有两个:优先级和接口IP。优先级默认100,范围1到254,255保留给“真实拥有虚拟IP的设备”。两台设备里优先级高者成为Master;优先级相同,则接口IP大的优先。配置时为了让某台设备稳定当主,通常把它的优先级设置成120或更高,另一台保持100。
Master会周期发送VRRP通告报文,默认间隔1秒。Backup收到通告后知道Master还在,就继续待机;一旦超过Master_Down_Interval还没收到,就判定Master出问题,自己升级为Master。这里有个容易被忽略的计算细节。Master_Down_Interval并不是简单的3倍通告间隔,而是3倍通告间隔加一个Skew_Time。Skew_Time的计算与本地优先级有关,优先级越高,等待时间越短,目的就是让高优先级设备在Master故障后更快接管。
比如通告间隔1秒、优先级120的设备,Skew_Time约等于0.53秒,它等待约3.53秒后开始切换;优先级100的设备,Skew_Time约0.61秒,等待约3.61秒。这套机制保证了低优先级设备不会误抢高优先级设备的位置。
抢占领行为也值得多说一句。当原Master恢复后,如果配置了抢占机制,它会重新把Master身份抢回来,保证流量回到预期路径。但抢占如果没有延迟,就可能在网络抖动时反复切换,造成业务震荡。所以很多生产环境会给抢占加20到30秒的延迟,让网络稳定下来再交接。
2.3 报文里藏着哪些信息
VRRP报文封装在IP报文中,协议号是112,目的地址是组播224.0.0.18,TTL固定为255。TTL这个细节挺关键。VRRP报文只在本地子网有效,跨路由器转发时TTL会减,TTL不是255的报文会被协议栈直接丢弃,这样可以防止外部构造的报文干扰虚拟路由器。
报文里有几个字段需要记牢:版本、VRID、优先级、通告间隔、IP地址列表,以及v2里可选的认证字段。IP地址列表里携带的是该备份组声明的虚拟IP。两端设备之所以要在接口下都配置虚拟IP,就是为了保证双方对虚拟路由器的认识一致。告警日志里最常见的“VRRP packet is invalid”,多数就是这些字段没对齐。
抓包看VRRP时,还要注意源IP。Master发出的通告报文,源IP通常是该接口下的真实接口IP,目的都是组播224.0.0.18。如果你在交换机端口上抓不到这些报文,就要优先怀疑二层组播被限制或ACL拦截了,这个坑在第五章排错部分会再展开。
3. 一套能直接抄的VRRP配置:从主备组到联动检测
3.1 一个网关组的最简配置
下面以两台三层设备承载一个VLAN网关为例。业务网段192.168.10.0/24,虚拟网关192.168.10.254。设备A的VLAN接口地址为192.168.10.1,设备B为192.168.10.2,两台设备之间配置互联,接入侧交换机连接这两台设备。
设备A上的关键配置示意:
interface Vlanif10 ip address 192.168.10.1 255.255.255.0 vrrp vrid 1 virtual-ip 192.168.10.254 vrrp vrid 1 priority 120 vrrp vrid 1 preempt-mode timer delay 20 vrrp vrid 1 track interface Vlanif20 reduced 30设备B上的对应配置:
interface Vlanif10 ip address 192.168.10.2 255.255.255.0 vrrp vrid 1 virtual-ip 192.168.10.254 vrrp vrid 1 priority 100 vrrp vrid 1 preempt-mode timer delay 20命令关键字在不同厂商设备上会有差异,但语义是对应的。一个VRID里,两边必须声明完全相同的虚拟IP,否则协议会一直处于不稳定状态。配置完成后,查看状态输出应该能看到类似VRID 1状态为Master、虚拟IP为192.168.10.254、优先级120、Backup等待时间等字段。
第一次上手时,别急着把所有优化都加上。先配一个最基础的主备组,把通告、抢占、优先级这些基础行为跑通,再逐步加入联动检测和BFD。上来就堆一堆功能,出了问题反而不知道是哪个环节引起的。
3.2 抢占延迟不是小事
很多工程师配置VRRP时,只设置了优先级,忽略了抢占延迟,结果在链路反复抖动时吃大亏。假设两台设备之间物理链路质量不好,优先级高的A设备与B设备之间偶发丢包,VRRP通告延迟,B短暂升级为Master;链路恢复后A又抢回来,这种倒换每隔几分钟来一次,对所有依赖该网关的终端都是灾难。
抢占延迟的意义,就是让设备在检测到Master恢复后,不要立刻抢回来,而是等一个周期。原Master恢复后也强制等待,确认链路稳定再切换。我一般建议生产环境配20到60秒,具体看业务容忍度。如果切换对业务的影响是秒级的,30秒是比较稳妥的折中;如果业务对切换非常敏感,则应该优先依靠BFD提高检测速度,而不是无限加大延迟。
还有一点容易被忽略:备份设备如果没有配置抢占,那么即使它优先级更高,也只在Master失效时才接任。而在大多数厂商实现里,抢占是默认开启的。如果你希望这台设备永远不主动抢回,要显式关闭抢占,并在设计和演练时确认故障后的角色是否符合预期。
3.3 Track接口与BFD联动:从秒级切换到毫秒级
最基础的VRRP能感知的“Master失效”只有一种:Master不再发送通告。但如果Master的上行链路断了,接口却还是UP状态,它照样会继续发通告,业务流量却已经出不去。这种情况下,站在下游终端看,网关还活着,但出口已经断了,问题会变成“能上网但不通”,排查起来更绕。
解决办法是把关键上行链路放进Track。典型配置是在Master上关联上游接口或BFD会话,只要关联对象状态变Down,就把VRRP优先级降低。比如Master优先级120,Track的降低值配置为40,降到80,低于Backup的100,Backup就会在协商后接管。注意降低值一定要大于两台设备的优先级差值,否则降了也白降。
BFD联动则是把探测速度推向极端。BFD可以在几十毫秒内确认对端不可达,再把这个状态反映到VRRP里。实际项目里,配合BFD的VRRP切换通常能控制在几百毫秒以内,相比默认的3秒级别,对视频会议、交易类业务改善非常明显。BFD需要额外的探测配置和资源开销,建议只在核心网关、跨设备核心链路上使用,不必遍地开花。
4. 选型前必须理清:VRRP v2/v3、HSRP、GLBP与堆叠的取舍
4.1 v2与v3的区别一张表说清
VRRP有两个常见版本。v2面向IPv4网络,在大量存量环境里仍然够用;v3则同时支持IPv4和IPv6,设计上更适合双栈演进。两者在同一个VRRP组里不能混用,要么都是v2,要么都是v3,这个必须在开局阶段定好,不然后面改版本会很痛苦。
| 对比项 | VRRP v2 | VRRP v3 |
|---|---|---|
| 支持的地址族 | IPv4 | IPv4、IPv6 |
| 通告间隔 | 一般为秒级 | 支持亚秒级配置 |
| 认证方式 | 可配置简单认证 | 更偏重网络安全隔离 |
| 报文格式 | 相对简单 | 面向现代网络有扩展 |
| 适用场景 | 存量IPv4组网 | 新建网络、IPv6演进 |
实际选型时,如果网络里已经有大量IPv4存量设备,v2完全够用,不必为了追新强行全换v3。新组网建议直接用v3,为IPv6保留演进空间。协议版本的一致性、通告间隔的一致性,也属于巡检时要重点比对的项目。
4.2 VRRP与HSRP、GLBP:标准与私有之争
HSRP是老牌的网关冗余协议,很多老工程师是在它上面练手的。它是私有协议,报文格式、虚拟MAC、时间机制都有自己的实现,优点是参考资料广,缺点则是跨厂商能力差。现在不少企业网络里混着多品牌设备,用私有协议就绑死了选型。
GLBP把网关冗余推到了多活模式。一个虚拟IP可以对应多个虚拟MAC,由算法把不同终端的流量分配到多台物理设备上,能做到转发负载均衡。听起来很完美,但它的控制面复杂,状态故障排查难度比VRRP高不少,而且同样不是标准协议。
VRRP赢在标准。它由公开的RFC定义,多厂商互通性好,学习成本低,网上能查到的资料也最多。在网关冗余这个场景,绝大多数需求用VRRP已经能覆盖,没必要为私有协议的附加特性增加运维复杂度。如果确实需要多活转发,可以评估多组VRRP负载均衡,或者干脆采用两套设备叠加堆叠的架构。
| 协议 | 协议性质 | 备份模式 | 多活负载均衡 | 适用场景 |
|---|---|---|---|---|
| VRRP | 标准协议 | 主备 | 可通过多组实现 | 跨厂商、生产环境 |
| HSRP | 私有协议 | 主备 | 有限 | 单一厂商老环境 |
| GLBP | 私有协议 | 主备/多活 | 支持 | 单厂商且需要网关负载分担 |
4.3 堆叠和VRRP,是替代还是搭配
也有人问:既然堆叠能把两台设备合成一台,是不是直接做堆叠就不需要VRRP了?我的观点是,堆叠和VRRP不是替代关系,更像互补关系。堆叠解决的是“两台设备变一台”的管理和转发问题,它确实能提供设备级冗余,但堆叠分裂、升级版本、跨框链路故障这些场景,仍然需要外部机制来收口。
比较稳妥的常见做法,是把两台核心设备做堆叠,对外仍然用一组VRRP提供虚拟网关,另一台更上层的出口设备作为备份网关的承载。这样堆叠内部收敛性能好,VRRP层面又提供了跨设备的逃生通道。小规模网络里,不引入堆叠、直接双机跑VRRP,反而更清爽,少一个故障域,理解成本和排障成本都更低。
5. 生产环境踩坑记录:双主、MAC不老化、路径不对称
5.1 双主脑裂:从抓包开始的完整排查链路
协议层面来说,如果两台设备都认为自己是Master,就是脑裂。这种现象一旦出现,终端会随机把流量交给其中一台,网络表现为时通时断。我第一次遇到时,两台设备的状态输出里都显示Master,业务时好时坏,排查了半个多小时。
我的排查顺序是这样的:先在每台设备上查看VRRP状态,确认状态和虚拟IP;然后在两端同时抓包,看是否收到对方发来的VRRP通告。如果收不到,问题就出在通信管道上。下一步分别检查两端配置里的VRID、虚拟IP、优先级、通告间隔和认证字段是否完全一致。接着看中间的二层设备,确认组播地址224.0.0.18没有被策略丢弃、IGMP Snooping没有把未知组播过滤掉。最后再看接口物理状态和错误计数。
这个链路走下来,大部分双主都能定位。常见原因无非这么几类:ACL拦截了VRRP报文;两台设备VRID或虚拟IP不一致;认证密钥写错;物理链路半通;中间交换机某端口过滤了未知组播。最容易被忽视的是最后一种,因为VRRP报文通常是组播,如果交换机端口组播抑制策略过于激进,报文的到达率就会下降,两台设备都等不到对方的通告,陆续抢占成Master。
双主的底层逻辑,可以理解为两个人同时认为自己是门卫,因为他们都没收到对方发来的“换岗通知”。排查的核心,永远是先确认通告报文到底有没有到达对方设备。
5.2 主备切换成功了,业务却还在卡顿
另一种常见场景是:VRRP状态切换很顺利,Master已经变成了备份设备,但业务还是断了很久。这往往是VRRP下面的二层世界没有跟上。终端网关IP没有变,虚拟MAC也没有变,但对应的二层交换机端口已经变了。交换机里的MAC地址表如果还记录着旧端口,数据帧就会被发到已经不再是Master的那台设备上。
正常情况下,VRRP切换后,Master会主动发送免费ARP,帮助终端和交换机刷新表项。但有些改进不彻底或老旧的实现里,这个动作不够及时;也有时候是二层环境里的MAC表老化时间设置过长,或者有MAC防漂移策略,把新端口的学习给挡了。
处理思路有几个角度。一是缩短二层交换机的动态MAC老化时间,二是检查与接入交换机之间的端口安全、MAC漂移保护是否允许虚拟MAC快速切换,三是把VRRP组和接入链路规划得尽量简单,避免跨过多级二层设备。遇到过很多现场,问题其实不在VRRP本身,而是接入侧对MAC漂移太敏感,VRRP切换被当成MAC攻击给拦住了。
5.3 多组VRRP做负载均衡,NAT会话却断流
用多个VRRP组做负载均衡是很常见的优化手段。比如两台设备各当两组的Master,流量理论上分摊到两台设备上。但如果这两台设备还承担NAT或状态防火墙功能,问题就来了:某个内网用户的TCP连接从A设备出去,回程流量却因为上层路由的原因走了B设备,B上没有这条会话的NAT映射,回包直接被丢弃。
这类问题的本质是路径不对称,与VRRP协议本身无关。解决办法也有几条路:让内外网流量严格保持对称,出接口和入接口交由同一台设备;在两台设备之间做会话同步,主备切换时把NAT表项带过去;或者接受简化架构,用单主备模式,牺牲一些吞吐利用率,换取路径可预期。实际项目里,很多大流量场景最终都选择VRRP结合对称访问控制,而不是多组负载分担,因为排障成本低得多。
这也提醒我们,VRRP的冗余是一层收口,不是整条业务链路的冗余。如果上层路由策略、NAT策略、安全策略没有同步配合,再稳的协议也会被业务路径上的其他问题拖累。
6. 部署前的交底惯例:VIP规划、主动演练与状态监控
6.1 虚拟IP规划与现场交底
最后聊点软性的经验。第一,虚拟IP的规划要预留独立地址,不要和现有真实接口IP撞车。很多网段规划时把.254当网关,但虚拟IP再配成.254,就可能与某台设备物理接口地址冲突,协议状态会异常。我习惯在规划表里专门留一列标注“VRID + VIP”,开局交底时重点提醒。
另外,不同VLAN如果用不同的VRID,最好做一个全局规划,避免某台设备上VRID对应的虚拟IP列表出现混乱。交底的时候把Master倾向、优先级差值、Track降低值、BFD关联都写清楚,现场两三个人一起核对一遍。网络设备配置这种东西,最怕的就是“看起来都一样,实际差一个参数”。
6.2 主动演练与持续监控
第二,配置完成后一定要主动演练。不要等故障时才验证备份设备能不能接管。找一个维护窗口,手工把主设备的VRRP优先级临时调低,或者直接关闭Master的上行接口,观察备份设备是否在规定时间内完成接管、业务丢包是否在可接受范围。演练一次,比看十遍协议文档都管用。
第三,巡检时关注VRRP状态变化次数。很多设备都支持查看VRRP状态统计,如果发现主备切换次数异常增长,即使每次都能切回来,也要排查底层链路质量,这些问题往往预告着更严重的隐患。
我在实际项目里还有个习惯:切换测试时用一台笔记本长时间ping虚拟IP,配合网络监控软件记录丢包数量和恢复时间。这样每次优化后,切换耗时是变快还是变慢,可以量化对比。VRRP能做的只是把单点网关变成双点,把单点故障的影响降到最低;真正的高可用,还需要链路、设备、应用、路由几个层面一起配合。先把网关这块兜住,网络稳定性就已经迈出了一大步。