VRRP网关冗余详解:从工作机制到配置排错,一文搞定网络高可用
做过网络运维的估计都怕两类事一是光缆被施工队挖断二是网关设备出问题。前者只要链路冗余到位倒还能扛后者经常是灾难点因为整片网络的默认路由都指到那一台上它一掉其他设备再健康也没用。解决这个问题的标准手段就是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到254255保留给“真实拥有虚拟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.18TTL固定为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优先级120Track的降低值配置为40降到80低于Backup的100Backup就会在协商后接管。注意降低值一定要大于两台设备的优先级差值否则降了也白降。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 v2VRRP v3支持的地址族IPv4IPv4、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能做的只是把单点网关变成双点把单点故障的影响降到最低真正的高可用还需要链路、设备、应用、路由几个层面一起配合。先把网关这块兜住网络稳定性就已经迈出了一大步。