
Hat
译者
⚠️ 注意
如果您发现了错误,欢迎 参与贡献。
💡 摘要 (Powered by OpenAI)
本文是 BIRD 用户指南的第六章第九节,介绍了 BIRD 的双向转发检测 (BFD),包括其工作原理、接口/多跳会话配置、认证机制和完整示例,以便您更好地理解相关内容。
双向转发检测 (Bidirectional Forwarding Detection, BFD) 本身并非路由协议,而是一个提供活跃度和故障检测的独立工具。
OSPF 和 BGP 等路由协议使用内建的周期性 "Hello" 消息监测邻居的活跃度,但这些机制的检测时间较长(例如 OSPF 默认 40 秒,最低可调至数秒)。BFD 提供了一种通用、快速且低开销的故障检测机制,可作为辅助角色附加到任何路由协议上。
BFD 由大体上独立的 BFD 会话组成。每个会话监控两个启用 BFD 的路由器之间的一条单播双向路径,通过在两个方向上周期性发送控制数据包来实现。BFD 不负责邻居发现——BFD 会话由其他协议(如 OSPF 或 BGP)按需请求创建,这些协议提供相应的信息(如 IP 地址和关联接口)。当会话状态改变时,相关协议会收到通知并做出相应反应(例如 BFD 会话中断时断开 OSPF 邻接关系)。
BIRD 实现了以下标准:
💡 提示
BFD 数据包使用动态源端口号发送。Linux 系统默认使用的动态端口范围与 IANA 批准的范围(49152-65535)略有不同。如遇到兼容性问题,请调整 /proc/sys/net/ipv4/ip_local_port_range。
BFD 配置主要由多个接口定义组成,大多数 BFD 配置选项是会话级别的。当新会话被请求并动态创建时,它根据以下定义之一进行配置:
interface 定义multihop 定义因此,一个空的 BFD 配置通常是足够的。
💡 提示
要将 BFD 用于 OSPF 或 BGP 等其他协议,这些协议也必须配置为请求 BFD 会话(通常通过 bfd 选项)。在 BGP 中,还可以在 bfd 选项中指定每对等体级别的 BFD 会话选项(如 RX/TX 间隔)。
VRF 注意事项:未关联任何 VRF 的 BFD 实例处理来自所有其他协议的会话请求(包括关联了 VRF 的协议)。对于单跳 BFD 会话,若启用了 net.ipv4.udp_l3mdev_accept sysctl,此设置可正常工作,但多跳会话目前不支持。另一种方案是配置多个 BFD 实例,每个 VRF 一个(包括默认 VRF)。关联到 VRF(常规或默认)的每个 BFD 实例仅处理来自同一 VRF 中协议的会话请求。
部分 BFD 会话选项需要时间值,必须指定合适的单位:数值 s|ms|us。虽然支持微秒为单位,但实际最小值通常在数十毫秒的量级。
protocol bfd [<名称>] {
accept [ipv4|ipv6] [direct|multihop];
strict bind <开关>;
zero udp6 checksum rx <开关>;
interface <接口模式> {
interval <时间>;
min rx interval <时间>;
min tx interval <时间>;
idle tx interval <时间>;
multiplier <数值>;
passive <开关>;
authentication none;
authentication simple;
authentication [meticulous] keyed md5|sha1;
password "<文本>";
password "<文本>" {
id <数值>;
generate from "<日期>";
generate to "<日期>";
accept from "<日期>";
accept to "<日期>";
from "<日期>";
to "<日期>";
};
};
multihop {
interval <时间>;
min rx interval <时间>;
min tx interval <时间>;
idle tx interval <时间>;
multiplier <数值>;
passive <开关>;
};
neighbor <IP> [dev "<接口>"] [local <IP>] [multihop <开关>];
}accept [ipv4|ipv6] [direct|multihop]
BFD 协议实例默认接受(在 VRF 限制范围内,详见上文)所有 BFD 会话请求。此选项控制是否接受 IPv4/IPv6 及直连/多跳会话请求(以及打开哪些监听套接字)。可用于分别为 IPv4 和 IPv6 会话配置独立的 BFD 协议实例。
strict bind 开关
指定每个 BFD 接口是否应使用绑定到其本地地址的独立监听套接字,还是使用接受所有地址的共享监听套接字。绑定到特定地址适用于在一台机器上运行多个 BIRD 实例、每个实例处理不同接口集合的场景。默认值:disabled
zero udp6 checksum rx 开关
IPv4 中 UDP 校验和计算是可选的,而 IPv6 中是强制的。部分 BFD 实现即使在 IPv6 情况下也发送校验和为零(空白)的 UDP 数据报。此选项配置 BFD 监听套接字以接受此类数据报。仅在支持相关套接字选项的平台(如 Linux 的 UDP_NO_CHECK6_RX)上可用。默认值:disabled
interface 模式 [, ...] { 选项 }
接口定义允许为关联到这些接口的会话指定选项,也可包含接口级别的特定选项。接口模式的详细说明参见 interface 通用选项。
注意:与其他协议的 interface 定义行为不同,BFD 协议在默认配置下也会接受未涵盖在此类定义中的接口上的会话。
multihop { 选项 }
多跳定义允许为多跳 BFD 会话指定选项,方式与 interface 定义用于直连会话相同。当前仅可使用一个多跳定义(适用于所有多跳会话)。
neighbor IP [dev "接口"] [local IP] [multihop 开关]
BFD 会话通常由其他协议(如 OSPF 或 BGP)按需请求创建。此选项允许显式添加一条到指定邻居的 BFD 会话,无论是否有请求。
会话由邻居 IP 地址标识,可选指定使用的接口和本地 IP。默认情况下,邻居必须是直连的,除非会话被配置为多跳。注意:多跳会话必须指定本地 IP。
以下选项属于 interface 和 multihop 定义的一部分:
interval 时间
BFD 通过在两个方向上周期性发送控制数据包来确保与会话关联的转发路径可用。此类数据包的速率由 min rx interval 和 min tx interval(见下文)两个选项控制。此选项是同时设置两者的简写形式。
min rx interval 时间
指定最小 RX 间隔,该值会通告给邻居并用于限制邻居生成 BFD 控制数据包的速率。默认值:10 ms
min tx interval 时间
指定期望的 TX 间隔,控制生成 BFD 控制数据包的速率(与邻居通告的 min rx interval 一起)。注意:此值仅当 BFD 会话处于 Up 状态时使用,否则使用 idle tx interval 的值。默认值:100 ms
idle tx interval 时间
为限制在邻居不可用或未运行 BFD 时不必要的数据传输,BFD 会话未建立时生成的控制数据包速率较低。此选项指定在此类情况下替代 min tx interval 的期望 TX 间隔。默认值:1 s
multiplier 数值
BFD 会话的故障检测时间基于已建立的 BFD 控制数据包速率(min rx/tx interval)乘以此倍数。本质上(忽略抖动),此倍数表示在判定会话中断前允许丢失的数据包数量。注意:速率和倍数在 BFD 会话的两个方向上可以不同。默认值:5
passive 开关
通常,BFD 会话的两端都尝试通过向对方发送控制包来建立会话。此选项允许启用被动模式,即路由器在收到对方发来的 BFD 数据包之前不会发送 BFD 数据包。默认值:disabled
authentication none 不发送密码。默认值。
authentication simple 每个数据包携带 16 字节的密码。缺少此密码的接收数据包将被忽略。此机制非常薄弱。
authentication [meticulous] keyed md5|sha1 每个数据包附加一个认证码。加密算法为 Keyed MD5 或 Keyed SHA-1。注意:算法对所有密钥通用(在同一接口上),不同于 OSPF 或 RIP 中每密钥独立的做法。密码(密钥)不会通过网络明文发送。
meticulous 变体意味着加密序列号对每个发送数据包递增,而在基本变体中大约每秒递增一次。一般来说,meticulous 变体对重放攻击有更好的抵抗力,但可能需要更多计算。
password "文本" 指定用于认证的密码。详见 password 通用选项。注意:BFD 协议中密码选项 algorithm 不可用,算法由 authentication 选项为所有密码统一选择。
protocol bfd {
interface "eth*" {
min rx interval 20 ms;
min tx interval 50 ms;
idle tx interval 300 ms;
};
interface "gre*" {
interval 200 ms;
multiplier 10;
passive;
};
multihop {
interval 200 ms;
multiplier 10;
};
neighbor 192.168.1.10;
neighbor 192.168.2.2 dev "eth2";
neighbor 192.168.10.1 local 192.168.1.1 multihop;
}
译者
原文作者: <Ondrej Filip>, <Martin Mares>, <Maria Matejka>, <Ondrej Zajicek>
原文链接: https://bird.network.cz/?get_doc&v=20&f=bird-6.html#ss6.9
原文标题: 6.9 BFD
遵循协议: CC BY-NC-SA 4.0
译者: hat
翻译时间: 2026-05-01
更新时间: 2026-05-01
本文链接: https://bird.xmsl.dev/docs/user-guide/6-9-bfd.html