链路断了半天没人发现?华为BFD毫秒级检测联动接口一起断

有一种故障特别隐蔽:两台交换机中间隔着二层传输设备,光纤或者说传输链路出了问题,两边的物理口看不出来——接口还是 UP 的,灯还是绿的,业务却已经不通了。要等上层协议自己的 Hello 报文超时才能发现,而这个检测时间普遍在 1 秒以上;更糟的是静态路由,压根没有自己的检测机制,链路断了它还捧着那条路由不放。华为官方文档把 BFD 的来历讲得很清楚:BFD 提供了一个通用的、标准化的、介质无关和协议无关的快速故障检测机制,毫秒级的链路感知与切换,特别适合对丢包、延迟敏感的环境。简单说,它就是给设备之间装的一根神经,专门负责第一时间喊「断了」。

华为官方配置指南给了一个 BFD 状态与接口状态联动的示例。SwitchA 和 SwitchB 网络层直连,链路中间存在二层传输设备 SwitchC 和 SwitchD,用户希望两端能够快速感知链路故障,触发路由快速收敛。配置思路两步:先在 SwitchA 和 SwitchB 上分别配置 BFD 会话检测链路;会话 Up 之后再配置 BFD 状态与接口状态联动。

配置步骤

第一步,直连接口 IP。以 SwitchA 为例(SwitchB 同理,地址为 10.1.1.2):

<HUAWEI> system-view
[HUAWEI] sysname SwitchA
[SwitchA] vlan 10
[SwitchA-vlan10] quit
[SwitchA] interface gigabitethernet 1/0/1
[SwitchA-GigabitEthernet1/0/1] port link-type hybrid   //其中V200R005C00及之后版本,默认接口类型不是hybrid,需要手动配置
[SwitchA-GigabitEthernet1/0/1] port hybrid pvid vlan 10
[SwitchA-GigabitEthernet1/0/1] port hybrid untagged vlan 10
[SwitchA-GigabitEthernet1/0/1] quit
[SwitchA] interface vlanif 10
[SwitchA-Vlanif10] ip address 10.1.1.1 24
[SwitchA-Vlanif10] quit

第二步,BFD 单跳检测。SwitchA 上使能 BFD 并配置与 SwitchB 之间的会话 atob:

[SwitchA] bfd   //全局使能BFD
[SwitchA-bfd] quit
[SwitchA] bfd atob bind peer-ip default-ip interface gigabitethernet 1/0/1   //配置BFD会话atob
[SwitchA-bfd-session-atob] discriminator local 10   //配置BFD会话的本地标识符,SwitchA上的本地标识符需要与SwitchB上的远端标识符一致
[SwitchA-bfd-session-atob] discriminator remote 20   //配置BFD会话的远端标识符,SwitchA上的远端标识符需要与SwitchB上的本地标识符一致
[SwitchA-bfd-session-atob] commit   //提交BFD会话配置,使配置生效
[SwitchA-bfd-session-atob] quit

SwitchB 上配对向会话 btoa,注意标识符正好对调:

[SwitchB] bfd
[SwitchB-bfd] quit
[SwitchB] bfd btoa bind peer-ip default-ip interface gigabitethernet 1/0/1   //配置BFD会话btoa
[SwitchB-bfd-session-btoa] discriminator local 20
[SwitchB-bfd-session-btoa] discriminator remote 10
[SwitchB-bfd-session-btoa] commit
[SwitchB-bfd-session-btoa] quit

标识符的对应关系是官方注意事项里的头号坑:本端的本地标识符必须与对端的远端标识符相同,不对应会话就无法 Up,而且标识符配置成功后不可修改。commit 这条也别省,不提交配置不生效。

第三步,联动接口状态。会话 Up 之后:

[SwitchA] bfd atob
[SwitchA-bfd-session-atob] process-interface-status
[SwitchA-bfd-session-atob] quit
[SwitchB] bfd btoa
[SwitchB-bfd-session-btoa] process-interface-status
[SwitchB-bfd-session-btoa] quit

验证

配置完成后 display bfd session all verbose,关键看「Proc interface status」字段从 Disable 变成 Enable,会话 State 为 Up:

Session MIndex : 16384     (One Hop) State : Up        Name : atob
  Local Discriminator    : 10               Remote Discriminator   : 20
  Bind Interface         : GigabitEthernet1/0/1
  Proc interface status  : Enable           Process PST            : Disable

真正的重头戏是故障演练。对 SwitchB 的 GE1/0/1 执行 shutdown,模拟链路故障:

[SwitchB] interface gigabitethernet 1/0/1
[SwitchB-GigabitEthernet1/0/1] shutdown
[SwitchB-GigabitEthernet1/0/1] quit

再到 SwitchA 上看:BFD 会话 State 变成 Down,而 GE1/0/1 接口显示 UP(BFD status down)——物理口本身没断,是 BFD 把协议层状态打了下来,联动就是这么个效果:

[SwitchA] display bfd session all verbose
Session MIndex : 16384     (One Hop) State : Down      Name : atob
[SwitchA] display interface gigabitethernet 1/0/1
GigabitEthernet1/0/1 current state : UP
Line protocol current state : UP(BFD status down)

接口协议层一 Down,依赖接口状态的路由立刻跟着撤,收敛不再等上层协议慢慢数秒。中间隔着传输设备的链路、跑着关键业务的核心互联,都值得配上这一对会话。贵州诚鑫致达科技在做客户核心链路改造时,BFD 加接口联动是给关键互联上的保险。你被「接口 UP 业务不通」坑过吗?评论区说说排了多久。