双向转发检测 - BFD

BFD 提供低开销和快速检测两个网络设备之间路径中的故障。它为所有媒体和协议层上的链路检测提供统一的机制。使用 BFD 检测任何两个网络设备之间 IPv4 和 IPv6 单跳或多跳路径的故障,包括单向路径故障检测。

Cumulus Linux 不支持

  • BFD 按需模式
  • 现有会话上的动态 BFD 计时器协商。对计时器值的任何更改仅在会话关闭并重新启动时生效。

BFD 多跳路由路径

BFD 多跳会话构建在两个系统之间的任意路径之上,这会导致单跳会话不存在的复杂性。为了避免多跳路径的欺骗,请为每个对等方配置最大跳数 (max_hop_cnt),这限制了 BFD 会话的跳数。交换机丢弃所有超过最大跳数的 BFD 数据包。

Cumulus Linux 支持 IPv4 和 IPv6 对等方的多跳 BFD 会话。

配置 BFD

您可以使用 NVUE 或 vtysh 命令配置 BFD,或者通过在 PTM `topology.dot` 文件中指定配置来配置 BFD。但是,拓扑文件有一些限制

  • 拓扑文件仅支持 BFD IPv4 和 IPv6单跳会话;您不能在拓扑文件中指定 IPv4 或 IPv6多跳会话。
  • 拓扑文件仅支持链路本地 IPv6 对等方的 BFD 会话;不创建链路上发现的全局 IPv6 对等方的 BFD 会话。

使用 FRRPTM 和 BFD 注册多跳对等方,并监控与远程 BGP 多跳对等方的连接。当启用 BFD 的对等方连接开始或停止时,FRR 可以使用 BFD 动态注册和注销 IPv4 和 IPv6 对等方。此外,您可以为每个 BGP 或 OSPF 对等方配置 BFD 参数。

对于拓扑文件和 FRR 创建的 BFD 会话,拓扑文件中的 BFD 参数优先于客户端配置的 BFD 参数。

每个 BFD 接口都需要一个 IP 地址。单跳 BFD 会话的邻居 IP 地址必须存在于 ARP 表中,BFD 才能开始发送控制数据包。

配置 BFD 时,您可以为 IPv4 和 IPv6 会话设置以下参数。如果您未设置这些参数,Cumulus Linux 将使用默认值。

  • 接收到的 BFD 控制数据包之间所需的最小间隔。默认值为 300 毫秒。
  • 传输 BFD 控制数据包的最小间隔。默认值为 300 毫秒。
  • 检测时间乘数。默认值为 3。

BGP 中的 BFD

在 BGP 中配置 BFD 时,PTM 会动态注册和注销邻居。

要在 BGP 中配置 BFD,请运行以下命令。

您可以为对等组或单个邻居配置 BFD。

以下示例为 swp51 配置 BFD 并使用默认间隔。

cumulus@switch:~$ nv set vrf default router bgp neighbor swp51 bfd enable on
cumulus@switch:~$ nv config apply

以下示例为对等组 fabric 配置 BFD,并将间隔乘数设置为 4,接收到的 BFD 控制数据包之间的最小间隔设置为 400,发送 BFD 控制数据包的最小间隔设置为 400。

cumulus@switch:~$ nv set vrf default router bgp neighbor fabric bfd enable on
cumulus@switch:~$ nv set vrf default router bgp neighbor fabric bfd detect-multiplier 4 
cumulus@switch:~$ nv set vrf default router bgp neighbor fabric bfd min-rx-interval 400 
cumulus@switch:~$ nv set vrf default router bgp neighbor fabric bfd min-tx-interval 400
cumulus@switch:~$ nv config apply

以下示例为 swp1 配置 BFD 并使用默认间隔

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# router bgp 65000
switch(config-router)# neighbor swp1 bfd
switch(config-router)# exit
switch(config)# exit
switch# write memory
switch# exit

以下示例为对等组 fabric 配置 BFD,并将间隔乘数设置为 4,接收到的 BFD 控制数据包之间的最小间隔设置为 400,发送 BFD 控制数据包的最小间隔设置为 400。

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# router bgp 65000
switch(config-router)# neighbor fabric bfd 4 400 400
switch(config-router)# exit
switch(config)# exit
switch# write memory
switch# exit

vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

...
router bgp 65101 vrf default
bgp router-id 10.10.10.1
! Neighbors
neighbor fabric peer-group
neighbor fabric remote-as external
neighbor fabric bfd 4 400 400
...

要查看 BGP 中的邻居信息,包括 BFD 状态,请运行 vtysh show ip bgp neighbor <interface> 命令。例如

cumulus@switch:~$ sudo vtysh 
switch# show ip bgp neighbor swp51
...
BFD: Type: single hop
  Detect Mul: 4, Min Rx interval: 400, Min Tx interval: 400
  Status: Down, Last update: 0:00:00:08
...

OSPF 中的 BFD

在 OSPF 中启用或禁用 BFD 时,PTM 会动态注册和注销邻居。在接口上启用 BFD 后,当双向邻接关系开始时,邻居会向 BFD 注册,并在邻接关系断开时注销。BFD 配置是按接口进行的,在该接口上发现的任何 IPv4 和 IPv6 邻居都将继承该配置。

以下示例为接口 swp1 中的 OSPF 配置 BFD,并将间隔乘数设置为 4,接收到的 BFD 控制数据包之间的最小间隔设置为 400,发送 BFD 控制数据包的最小间隔设置为 400。

cumulus@switch:~$ nv set interface swp1 router ospf bfd detect-multiplier 4
cumulus@switch:~$ nv set interface swp1 router ospf bfd min-receive-interval 400
cumulus@switch:~$ nv set interface swp1 router ospf bfd min-transmit-interval 400
cumulus@switch:~$ nv config apply
cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# interface swp1
switch(config-if)# ipv6 ospf6 bfd 4 400 400
switch(config-if)# exit
switch(config)# exit
switch# write memory
switch# exit

vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

...
interface swp1
  ipv6 ospf6 bfd 4 400 400
  ...

您可以运行不同的命令来显示 OSPF 中的邻居信息,包括 BFD 状态。

  • 要显示 IPv6 OSPF 接口信息,请运行 vtysh show ip ospf6 interface <interface> 命令。

  • 要显示 IPv4 OSPF 接口信息,请运行 vtysh show ip ospf interface <interface> 命令。

    以下示例显示 IPv6 OSPF 接口信息。

    cumulus@switch:~$ sudo vtysh
    switch# show ip ospf6 interface swp2s0
      swp2s0 is up, type BROADCAST
    Interface ID: 4
    Internet Address:
      inet : 11.0.0.21/30
      inet6: fe80::4638:39ff:fe00:6c8e/64
    Instance ID 0, Interface MTU 1500 (autodetect: 1500)
    MTU mismatch detection: enabled
    Area ID 0.0.0.0, Cost 10
    State PointToPoint, Transmit Delay 1 sec, Priority 1
    Timer intervals configured:
      Hello 10, Dead 40, Retransmit 5
    DR: 0.0.0.0 BDR: 0.0.0.0
    Number of I/F scoped LSAs is 2
      0 Pending LSAs for LSUpdate in Time 00:00:00 [thread off]
      0 Pending LSAs for LSAck in Time 00:00:00 [thread off]
    BFD: Detect Mul: 3, Min Rx interval: 300, Min Tx interval: 300
    
  • 要显示 IPv6 OSPF 邻居详细信息,请运行 vtysh show ip ospf6 neighbor detail 命令。

  • 要显示 IPv4 OSPF 接口信息,请运行 vtysh show ip ospf neighbor detail 命令。

    以下示例显示 IPv6 OSPF 邻居详细信息。

    cumulus@switch:~$ sudo vtysh
    switch# show ip ospf6 neighbor detail
      Neighbor 0.0.0.4%swp2s0
        Area 0.0.0.0 via interface swp2s0 (ifindex 4)
        His IfIndex: 3 Link-local address: fe80::202:ff:fe00:a
        State Full for a duration of 02:32:33
        His choice of DR/BDR 0.0.0.0/0.0.0.0, Priority 1
        DbDesc status: Slave SeqNum: 0x76000000
        Summary-List: 0 LSAs
        Request-List: 0 LSAs
        Retrans-List: 0 LSAs
        0 Pending LSAs for DbDesc in Time 00:00:00 [thread off]
        0 Pending LSAs for LSReq in Time 00:00:00 [thread off]
        0 Pending LSAs for LSUpdate in Time 00:00:00 [thread off]
        0 Pending LSAs for LSAck in Time 00:00:00 [thread off]
        BFD: Type: single hop
          Detect Mul: 3, Min Rx interval: 300, Min Tx interval: 300
          Status: Up, Last update: 0:00:00:20
    

脚本

当 BFD 会话关闭时,ptmd 执行 /etc/ptm.d/bfd-sess-down 中的脚本;当 BFD 会话启动时,执行 /etc/ptm.d/bfd-sess-up 中的脚本。根据需要修改这些默认脚本。

回声功能

Cumulus Linux 仅针对 IPv4 单跳以及异步操作模式支持回声功能(Cumulus Linux 不支持按需模式)。

使用回声功能测试远程系统上的转发路径。要启用回声功能,请在拓扑文件中将 echoSupport 设置为 1

远程系统循环回声数据包后,BFD 控制数据包可以以低得多的速率发送。您可以通过在拓扑文件中将 slowMinTx 参数设置为非零值(以毫秒为单位)来配置此较低的速率。

您可以为回声数据包使用更积极的检测时间,因为往返时间更短;回声数据包访问转发路径。您可以通过在拓扑文件中设置 echoMinRx 参数来配置检测间隔。最小设置为 50 毫秒。配置此设置后,BFD 控制数据包将以此所需的最小回声 Rx 间隔发送。这向对等方指示本地系统可以环回回声数据包。如果对等方支持接收回声数据包,则会传输回声数据包。

关于回声数据包

Cumulus Linux 将 BFD 回声数据包封装到通过目标和源 UDP 端口号 3785 的 UDP 数据包中。BFD 回声数据包格式是特定于供应商的。源自 Cumulus Linux 的 BFD 回声数据包长度为八个字节,并具有以下格式

0123
版本长度已保留已保留
我的鉴别符

其中

  • 版本是 BFD 回声数据包的版本。
  • 长度是 BFD 回声数据包的长度。
  • 我的鉴别符是一个非零值,用于唯一标识发送端的 BFD 会话。当始发节点在被接收系统环回后接收到数据包时,此值唯一地标识 BFD 会话。

传输和接收回声数据包

仅当对等方在 BFD 会话开始时在 BFD 控制数据包中通告所需的最小回声接收间隔(echoMinRx 设置)的非零值时,Cumulus Linux 才会为 BFD 会话传输 BFD 回声数据包。交换机根据对等方在控制数据包中通告的回声接收值来确定回声数据包的传输速率。

仅当您在本地将 echoMinRxechoSupport 配置为非零值时,Cumulus Linux 才会将 BFD 回声数据包环回给 BFD 会话的始发节点。

回声功能参数

您可以通过在拓扑文件的全局、模板和端口级别设置以下参数来配置回声功能

  • echoSupport 启用和禁用回声模式。设置为 1 以启用回声功能。默认值为 0(禁用)。
  • echoMinRx 是本地系统能够接收的回声数据包之间的最小间隔。BFD 控制数据包通告此值。当您启用回声功能时,默认值为 50。如果您禁用回声功能,则此参数自动为 0,这表示端口或节点无法处理或接收回声数据包。
  • slowMinTx 是交换机交换回声数据包时传输 BFD 控制数据包之间的最小间隔。

故障排除

要对 BFD 进行故障排除,请运行 Linux ptmctl -b 命令。

cumulus@switch:~$ ptmctl -b

----------------------------------------------------------------------------------------
port  peer                 state  local  type       diag  det   tx_timeout  rx_timeout
                                                          mult
----------------------------------------------------------------------------------------
swp1  fe80::202:ff:fe00:1  Up     N/A    singlehop  N/A   3     300         900
swp1  3101:abc:bcad::2     Up     N/A    singlehop  N/A   3     300         900

#continuation of output
---------------------------------------------------------------------
echo        echo        max      rx_ctrl  tx_ctrl  rx_echo  tx_echo
tx_timeout  rx_timeout  hop_cnt
---------------------------------------------------------------------
0           0           N/A      187172   185986   0        0
0           0           N/A      501      533      0        0