做网关高可用的人,迟早会遇到这样一幕:Master 的出口链路悄悄断了,但 VRRP 心跳报文还在正常收发,Backup 以为一切无恙,只能慢吞吞等着 Master Down 定时器超时。三秒、四秒过去,整条业务流量已经全部堵在断口上,上层应用早就开始告警。这个坑我在华为 eNSP 模拟器里反复验证过,后来把 VRRP 与 BFD 联动起来,故障切换才真正从秒级压缩到毫秒级。
这篇文章就围绕 eNSP 中 VRRP 与 BFD 联动的完整实验来写,包括原理、拓扑、配置命令、实测过程和排查经验。适合正在备考网络认证、做园区网关高可用方案,或者想把 VRRP 和 BFD 真正玩明白的工程师。我会直接给出可复现的配置,也会把那些文档里不常写的坑一并说清。
1. 项目背景与核心需求解析
1.1 VRRP 的固有短板
VRRP 是一个很成熟的第一跳冗余协议,核心任务就是给终端提供一个不会中断的虚拟网关。一组路由器共享一个虚拟 IP,正常情况下只有 Master 在转发流量,Backup 只负责监听。终端把网关指向虚拟 IP,无论 Master 怎么切换,终端侧的配置都不用改。
但它有个天然的短板:故障检测太依赖 VRRP 报文。默认情况下 Master 每 1 秒发一次 Advertisement 报文,Backup 连续 3 次没有收到报文,才会认为 Master 失效,也就是所谓的 Master Down Timer,默认值通常接近 3 秒。在业务要求高的网络里,3 秒的故障窗口完全不可接受。
更要命的是另一个场景:如果 Master 的上联链路断了,比如出口路由器到核心的线被切断,但 Master 本机仍然活着,VRRP 报文照常发给 Backup,Backup 根本不会主动接管。结果就是终端网关还在,但流量出去就石沉大海,这种故障靠 VRRP 自身机制根本发现不了。
1.2 BFD 的出现与联动思路
BFD,也就是双向转发检测,是专门为快速检测转发路径故障设计的。它和 VRRP 报文机制最大的区别在于,BFD 可以做到毫秒级检测,会话建立后,双方按照协商好的时间间隔互相发送检测报文,一旦连续几次收不到,就立刻判定链路故障。
BFD 可以帮助 VRRP 感知到“VRRP 报文无法感知”的故障。核心思路其实很简单:让 Master 与上游设备建立 BFD 会话,用 BFD 监控自己的上联链路;同时把这条 BFD 会话关联到 VRRP 备份组上,也就是 track。一旦 BFD 会话状态变为 Down,就立即降低本机在 VRRP 备份组里的优先级,让 Backup 抢占成为 Master,流量立刻改走备用路径。
这个设计解决了两件事:一是把故障检测时间从秒级降到毫秒级,二是把检测范围从上联接口一直到对端设备,链路断了、对端设备故障了、中间转发异常了,都能被发现。整个联动的关键点在于 track 机制和优先级降低的配合,原理清楚之后,后面的配置就一通百通。
2. 实验环境与拓扑设计
2.1 环境准备与设备选型
我使用的环境是 eNSP 模拟器,设备选型用的是 AR2220 路由器和 S3700 交换机。这个组合在 eNSP 里很常见,VRRP、BFD、OSPF 这些特性都支持,纯软件模拟,不需要额外许可。
需要的设备如下:
- R1、R2:两台 AR2220,组成 VRRP 备份组,同时也是 PC 的网关路由器。
- R3:一台 AR2220,模拟上游核心设备,用于和 R1、R2 建立 BFD 会话并转发跨网段流量。
- SW1:一台 S3700,作为二层接入交换机,把 PC 和两台网关路由器连在一起。
- PC1:模拟终端,IP 固定,网关指向虚拟 IP。
eNSP 版本差异不大,我用的是常规稳定版本。如果你手里的版本稍微旧一点,某些命令的写法可能有差异,比如 BFD 会话的创建句法,这个后面排查部分会专门提。
2.2 拓扑结构与 IP 规划
拓扑按照经典的双网关形态搭建。SW1 下联 PC1,上联 R1 和 R2 的 GE0/0/0 接口。R1 和 R2 分别用自己的 GE0/0/1 接口连接 R3,形成两条独立的上联路径。这样设计有一个明显好处:当 R1 的上联断开时,R2 到 R3 的路径仍然正常,Backup 接管后才能把流量完整送出去。
具体网段规划如下表:
| 设备 | 接口 | IP 地址 | 用途 |
|---|---|---|---|
| R1 | GE0/0/0 | 192.168.10.1/24 | 接入侧,VRRP 成员 |
| R1 | GE0/0/1 | 10.0.13.1/24 | 上联 R3,BFD 检测 |
| R2 | GE0/0/0 | 192.168.10.2/24 | 接入侧,VRRP 成员 |
| R2 | GE0/0/1 | 10.0.23.2/24 | 上联 R3,备用路径 |
| R3 | GE0/0/0 | 10.0.13.3/24 | 连接 R1 |
| R3 | GE0/0/1 | 10.0.23.3/24 | 连接 R2 |
| R3 | LoopBack0 | 3.3.3.3/32 | 模拟外部测试目标 |
| SW1 | VLAN10 | 不配 IP | 二层转发 |
| PC1 | 网卡 | 192.168.10.10/24 | 终端,网关 192.168.10.254 |
VRRP 虚拟 IP 规划为 192.168.10.254,VRRP 备份组编号为 1。正常情况下 R1 的优先级设为 120,是 Master;R2 的优先级保持默认 100,是 Backup。
2.3 协议设计与联动方案
这里有一个容易忽略的细节:只把 VRRP 切换做好还不够,数据流量要能真正走出去,必须保证上游设备知道如何回包。所以在 R1、R2、R3 之间我启用了 OSPF,让三台设备动态学习路由。R1 和 R2 会把 192.168.10.0/24 网段通告进 OSPF,R3 把 3.3.3.3/32 通告出去。当 R1 上联断开后,R3 和 R1 的 OSPF 邻居关系也会随之消失,回程路由自然收敛到 R2 这条路径。
BFD 联动的检测目标定为 R3。R1 上建立一条 BFD 会话,监控 R1 到 R3 的直连链路;然后把这条 BFD 会话绑定到 VRRP 备份组,降低值设置为 40。这样 R1 的优先级从 120 降到 80,低于 R2 的 100,Backup 立即抢占成 Master。
3. 配置实操与核心实现
3.1 基础接口与 OSPF 配置
先把三台路由器的基础 IP 接口和 OSPF 配置好。R1 的配置如下:
sysname R1 interface GigabitEthernet0/0/0 ip address 192.168.10.1 255.255.255.0 quit interface GigabitEthernet0/0/1 ip address 10.0.13.1 255.255.255.0 quit ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 192.168.10.0 0.0.0.255 network 10.0.13.0 0.0.0.255 quitR2 的配置基本对称,只是网段不同:
sysname R2 interface GigabitEthernet0/0/0 ip address 192.168.10.2 255.255.255.0 quit interface GigabitEthernet0/0/1 ip address 10.0.23.2 255.255.255.0 quit ospf 1 router-id 2.2.2.2 area 0.0.0.0 network 192.168.10.0 0.0.0.255 network 10.0.23.0 0.0.0.255 quitR3 上除了互联地址,还要加一个 LoopBack 地址作为测试目标,并把这个地址通告到 OSPF 里:
sysname R3 interface GigabitEthernet0/0/0 ip address 10.0.13.3 255.255.255.0 quit interface GigabitEthernet0/0/1 ip address 10.0.23.3 255.255.255.0 quit interface LoopBack 0 ip address 3.3.3.3 255.255.255.255 quit ospf 1 router-id 3.3.3.3 area 0.0.0.0 network 10.0.13.0 0.0.0.255 network 10.0.23.0 0.0.0.255 network 3.3.3.3 0.0.0.0 quitSW1 基本不需要配置路由功能,只要保证三个接口在同一个二层域内。默认情况下 eNSP 的 S3700 各接口处于 VLAN 1,直接可以通。如果你习惯建 VLAN,可以把三个接口都划到 VLAN 10。PC1 的 IP 地址设置为 192.168.10.10/24,网关指向 192.168.10.254,注意不要写成某个具体路由器接口地址。
3.2 VRRP 基础配置
接下来在 R1 和 R2 的接入接口上配置 VRRP。这里最核心的命令是 virtual-ip,所有成员路由器必须放在同一个备份组里,虚拟 IP 也必须一致。
R1 配置如下:
interface GigabitEthernet0/0/0 vrrp vrid 1 virtual-ip 192.168.10.254 vrrp vrid 1 priority 120 vrrp vrid 1 preempt-mode timer delay 20 quitR2 配置如下:
interface GigabitEthernet0/0/0 vrrp vrid 1 virtual-ip 192.168.10.254 vrrp vrid 1 priority 100 vrrp vrid 1 preempt-mode timer delay 20 quit这里有两个点要说清楚。优先级决定了谁是 Master,120 比 100 高,所以 R1 会成为 Master。preempt-mode timer delay 20 不是必须的,但建议加上,它表示抢占发生时延迟 20 秒执行。这个参数在后面故障恢复时会非常有用,能避免 R1 一恢复就立刻抢占,导致双路径震荡。配置完成后,可以用 display vrrp 查看状态,R1 应该是 Master,R2 是 Backup。
3.3 BFD 会话配置
BFD 配置是整个联动的核心。先配置 R1,让它和 R3 之间建立 BFD 会话:
bfd bfd 1 bind peer-ip 10.0.13.3 interface GigabitEthernet0/0/1 discriminator local 1 discriminator remote 3 min-tx-interval 100 min-rx-interval 100 commit quitR3 上配置对端:
bfd bfd 1 bind peer-ip 10.0.13.1 interface GigabitEthernet0/0/0 discriminator local 3 discriminator remote 1 min-tx-interval 100 min-rx-interval 100 commit quitdiscriminator 是 BFD 会话的本地标识和对端标识,可以理解为会话的身份证。R1 的本地标识是 1,远端标识是 3;R3 的本地标识是 3,远端标识是 1,两端必须相互匹配,否则会话建立不起来。min-tx-interval 和 min-rx-interval 设置的是报文发送和接收的最小间隔,单位是毫秒,100 毫秒是生产环境中比较常用的值,既能保证快速检测,又不会太消耗 CPU。
配置完成后,用 display bfd session 查看,状态应该显示 Up。如果显示 Down,先检查两端接口是不是能互相 ping 通,再检查 discriminator 是否匹配,这是最常见的两个原因。
3.4 VRRP 联动 BFD 的关键命令
BFD 会话建立成功后,最后一步就是把 BFD 和 VRRP 绑定到一起。回到 R1 的接入接口下,执行:
interface GigabitEthernet0/0/0 vrrp vrid 1 track bfd-session 1 reduced 40 quit这条命令的意思很明确:VRRP 备份组 1 跟踪 BFD 会话 1,如果 BFD 会话故障,本机 VRRP 优先级降低 40。R1 原来优先级是 120,降低之后变成 80,小于 R2 的 100,Backup 自然就有资格抢占成为新的 Master。
这里降低值的选择有讲究。如果 R1 的优先级设置得非常高,比如 150,那么 reduced 40 之后变成 110,仍然比 Backup 的 100 高,就无法触发切换。所以 reduced 的值必须大于 Master 与 Backup 的优先级差值,一般建议留出至少 20 的余量,避免因其他 track 项同时生效造成意外。
我在这个实验里只让 R1 跟踪 BFD,因为故障模拟的是 R1 的上联断开。如果你做对称设计,R2 也要配置自己的 BFD 会话并 track,方法完全一样,只是检测 R2 到 R3 的链路。这样不管哪一台路由器的上联出问题,都能自动切到另一条链路。
3.5 故障切换实测记录
配置全部完成后,用持续 ping 3.3.3.3 的方式来观察切换效果。在 PC1 上执行 ping 3.3.3.3 -t 持续发包,然后到 R1 的上联接口执行 shutdown,模拟网线被拔掉。这里要快一点,先观察没有配置 BFD 联动的表现,再配置联动后对比。
没有配置 BFD 联动的表现是:R1 上联口 shutdown 后,虽然 R3 和 R1 的 OSPF 邻居已经断开,但 VRRP 仍然认为 R1 是 Master,PC1 的网关在 R1 上,流量继续发给 R1,然后再从断掉的接口丢弃。PC 端 ping 3.3.3.3 会连续丢包,直到手动干预或者等待很久。这是因为 VRRP 备份组根本感知不到上联故障。
配置 BFD 联动后的表现则完全不同:
display vrrp在 R1 上联口 shutdown 后立刻执行,你会发现 R1 的状态从 Master 变成了 Backup,优先级从 120 降到了 80。同时到 R2 上查看,R2 已经成为 Master。整个过程非常快,PC1 端 ping 最多丢失一两包,甚至有些场景完全不丢。把 R1 的上联接口恢复后,BFD 会话重建,R1 的优先级恢复 120,但因为配置了抢占延迟 20 秒,所以不会立即抢回 Master,等 20 秒后再恢复原状。
我在实测时还有个习惯,就是用 display bfd session 和 display track 两条命令交叉确认。display bfd session 看的是 BFD 会话本身的状态,display track 看的是 BFD 状态是否被 track 模块正确接收。如果 BFD 状态是 Down,但 track 显示 Up,说明绑定或参数传递有问题,要重点检查命令是否写错。
4. 故障排查与常见问题实录
4.1 BFD 会话一直处于 Down
这是配置 BFD 联动时遇到最多的问题。BFD 会话建立不起来,后面的 track 自然无法生效。排查思路按顺序走:
- 两端接口能不能直接 ping 通。如果直连 ping 都不通,BFD 肯定通不了。检查接口 IP、掩码、物理状态。
- discriminator 是否匹配。华为的 BFD 会话要求本地标识和远端标识一一对应,R1 配了 remote 3,R3 就必须配 local 3;两边反了或者写成同一个数字,会话都会失败。
- 对端设备是否配置了对应会话。BFD 是双向协商协议,只有单端配置根本无法完成握手。
- 配置后是否执行 commit。华为 BFD 会话配置完成后需要 commit 才能生效,忘了这一步,会话就停留在初始状态。
经验上,只要先 ping 通,再仔细核对 discriminator,八成问题都能解决。
4.2 VRRP 联动不生效,Master 不切换
BFD 会话是 Up 的,但断掉上联后 VRRP 角色纹丝不动,这种问题同样常见。重点检查这几个方向:
- 优先级降低后的值是否足够低。比如 R1 优先级 120,reduced 40 后是 80,低于 R2 的 100,这样才会切换。如果你把 reduced 配成了 10,降低后是 110,R2 永远抢不过。
- VRRP 抢占是否被关闭。默认是开启抢占的,但有些配置模板里会输入 preempt-mode disable,一旦关闭,即使 Backup 优先级更高,也不会主动接管。
- track 的 BFD 会话编号是否正确。有时候现场有多条 BFD 会话,配置时不小心引用了错误的编号,状态显示 Up 的会话其实是另一条。
检查这三项时,配合 display vrrp 看最终 Priority 值,配合 display track bfd-session 1 看 BFD 状态和 Track 状态是否一致,思路会清晰很多。
4.3 故障恢复后的主备震荡
配置完联动后,第一次测试可能遇到另一个问题:R1 的上联一恢复,R1 立刻抢回 Master,但此时 OSPF 邻居和路由还没完全收敛,流量一到 R1 上联,仍然可能短暂丢包。这会造成一种震荡现象,主备反复切换,客户端访问时断时续。
解决办法就是开头配置过的抢占延迟。在 VRRP 成员接口下配置 preempt-mode timer delay 20,让 R1 恢复后等 20 秒再去抢占。20 秒足够让 OSPF 完成收敛,也足够让 BFD 会话稳定下来。注意抢占延迟只影响回切,不影响故障时的快速切换,所以对业务几乎没有副作用。
4.4 eNSP 模拟器特有的注意事项
eNSP 毕竟不是物理设备,有些现象在模拟器里会比真机更奇怪,但原理是一样的。
第一,模拟器的 BFD 检测时间通常比真机慢一些。你在 PC 上观察丢包,可能不是真正的一个不丢,这是正常的,重点看是否有明显改善。第二,关闭接口后不要立刻执行 display vrrp,可以等待一两秒再查,因为模拟器内部的事件刷新节奏和真实设备不完全一致。第三,BFD 会话在重新开启接口后需要重新协商,如果发现回复 Master 后 BFD 状态还是 Down,先用 ping 验证接口链路,再等几秒重新查看。
还有一个容易忽视的点:不同版本的 eNSP,AR 路由器对 BFD 配置的句法支持有细微差别。有些旧版本要求使用 bfd 1 bind peer-ip 10.0.13.3 interface GigabitEthernet0/0/1 这种写法,有些新版本支持更简洁的写法。遇到命令报错,优先用问号查看当前版本支持的参数,不要照搬网上的老配置。
5. 扩展实践与个人体会
VRRP 与 BFD 联动不只是学一个配置实验,它在生产环境里的扩展空间非常大。如果你在真实网络里做双网关,建议把 R1 和 R2 都配置上各自的 BFD 检测,形成对称结构。R1 检测自己的上联,R2 检测自己的上联,任何一侧的上联故障都会让对应路由器主动让位。否则可能出现一种尴尬情况:R1 上联断了,切换到 R2,但 R2 的上联其实也是坏的,流量接管过来还是出不去。
另外,BFD 不只服务于 VRRP。它同样可以和静态路由联动,比如 ip route-static 0.0.0.0 0.0.0.0 10.0.13.3 track bfd-session 1,一旦链路故障,静态路由自动撤销。也可以配合策略路由使用,实现基于链路状态的智能选路。原理都是同一个,BFD 做快速感知,track 机制做联动处理,学会一个场景,其他场景都能举一反三。
我个人在实际操作中的体会是,VRRP 本身已经算稳定,但它的默认故障检测机制在真实复杂的组网里太被动。很多网络工程师习惯性地认为只要配了 VRRP,网关就高可用了,实际上 Master 上联故障这种典型的单点风险,VRRP 根本无法感知。BFD 补齐的正是这块短板。
拿 eNSP 做实验的最大价值,就是可以放心地拔线、关接口,反复验证故障切换和恢复的全过程。建议你也搭一个一模一样的拓扑,先跑通基础 VRRP,再叠加 BFD 联动,对比一下切换时间的差异。等你在模拟器里亲手看到优先级从 120 掉到 80,看到 Backup 瞬间上位,再回到生产环境配置时,心里就有底了。