
Hat
译者
⚠️ 注意
如果您发现了错误,欢迎 参与贡献。
💡 摘要 (Powered by OpenAI)
本文是 BIRD 用户指南的第六章第五节,介绍了 BIRD 的内核协议 (Kernel),包括与内核同步的机制、配置选项、路由属性和多表支持,以便您更好地理解相关内容。
内核协议 (Kernel) 并非一个真正的路由协议。它不与其他路由器通信,而是在 BIRD 的路由表与操作系统内核之间执行同步。
本质上,它会将所有路由表更新发送到内核,并定时扫描内核表以检查以下情况:
learn 开关的设置,此类路由可被忽略或接受到 BIRD 表中)💡 提示
操作系统内核自身创建的路由(即代表关联接口 IP 子网的直连路由)仅在启用 learn all 时才会被导入。
如果操作系统仅支持单个路由表,则只能配置一个内核协议实例。如果支持多表(例如 Linux,用于策略路由),则可以运行任意数量的实例,但每个实例必须连接到不同的 BIRD 路由表和不同的内核表。
由于内核协议与连接的路由表部分集成,存在两个限制:
这两个限制均可通过另一张路由表配合管道协议 (Pipe) 来绕过。
内核协议支持 IPv4 和 IPv6 通道,每个协议实例仅可配置一个通道。在 Linux 上,还支持 IPv6 SADR 和 MPLS 通道。
persist 开关
告知 BIRD 在退出时保留其在路由表中的所有路由(而非清理它们)。
scan time 数值
两次连续扫描内核路由表之间的间隔时间(秒)。
learn 开关|all
启用对由其他路由守护进程或系统管理员添加到内核路由表中的路由的学习。仅在支持识别路由来源的系统上可用。
默认情况下,内核创建的路由(标记为 "proto kernel")不会被导入。使用 learn all 选项可导入这些路由。
kernel table 数值
选择此内核协议实例应在哪个内核表上工作。仅在支持多路由表的系统上可用。
metric 数值(Linux)
为所有发送到内核的路由使用指定的内核度量值(优先级)。当同一网络有多条路由位于内核路由表中时,Linux 内核选择度量值较低的一条。
此外,不同度量值的路由之间不会冲突,因此使用专用的度量值是避免覆盖其他来源(如内核设备路由)路由的可靠方法。度量值 0 具有特殊含义,表示未定义度量值——此时要么使用操作系统默认值,要么可通过 krt_metric 属性设置每条路由的度量值。默认值:32
graceful restart 开关
参与优雅重启恢复。如果启用此选项且优雅重启恢复处于活动状态,内核协议将推迟路由表同步,直到恢复期结束。注意:内核路由向 BIRD 的导入不受影响。
merge paths 开关 [limit 数值]
通常情况下,仅最佳路由会被导出到内核协议。启用路径合并后,最佳路由和等效的非最佳路由会在导出时合并,为每个网络生成一条 ECMP(等价多路径) 路由。
这对 BGP 多路径等场景非常有用。需要注意的是,最佳路由仍是路由导出的核心(决定了生成 ECMP 路由的大部分属性),而导出的非最佳路由仅负责提供额外的多路径下一跳。
此选项还允许指定一条路由中下一跳的最大数量限制。默认情况下,多路径合并处于禁用状态。若启用,限制默认值为 16。
netlink rx buffer 数值(Linux)
设置 netlink 套接字的内核接收缓冲区大小(字节)。默认值依赖于操作系统(来自 /proc/sys/net/core/rmem_default 文件)。如果出现 "Kernel dropped some netlink message ..." 警告,可增大此值。
内核协议定义了一些属性。这些属性会被转换为相应的系统(OS 特定)路由属性。支持的属性如下:
int krt_source
导入内核路由的原始来源。该值与系统相关。在 Linux 上,为路由协议字段的值(参见 /etc/iproute2/rt_protos 了解常用值)。在 BSD 上,基于 STATIC 和 PROTOx 标志。此属性为只读。
int krt*metric *(Linux)_
路由的内核度量值。当同一网络有多条路由位于内核路由表中时,Linux 内核选择度量值较低的一条。注意:设置内核度量值的推荐方式是使用协议选项 metric,除非需要按路由分别设置。
ip krt*prefsrc *(Linux)_
首选源地址。用于出站数据包的源地址选择,必须为路由器自身的 IP 地址之一。
int krt*realm *(Linux)_
路由的领域 (Realm) 值,可用于流量分类。
int krt*scope *(Linux IPv4)_
路由的作用域 (Scope)。有效值为 0-254,尽管 Linux 内核可能根据路由类型和下一跳拒绝部分值。该属性旨在表示路由的"间接程度"——路由的下一跳通过具有更高作用域的路由来解析。但在当前内核中,低于 link (253) 的所有值均被视为 global (0)。未设置时,除设备路由默认使用 link 作用域外,所有路由均隐式使用 global 作用域。
在 Linux 上,还存在大量较为冷门的路由属性,主要用于调优本地连接的 TCP 性能。BIRD 支持其中大部分属性,其含义请参见 Linux 或 iproute2 文档。
krt_lock_* 和 krt_feature_* 系列属性类型为 bool,krt_congctl 类型为 string,其余类型为 int。支持的属性包括:
krt_mtu、krt_lock_mtu、krt_window、krt_lock_window、 krt_rtt、krt_lock_rtt、krt_rttvar、krt_lock_rttvar、 krt_ssthresh、krt_lock_ssthresh、krt_cwnd、krt_lock_cwnd、 krt_advmss、krt_lock_advmss、krt_reordering、krt_lock_reordering、 krt_hoplimit、krt_lock_hoplimit、krt_rto_min、krt_lock_rto_min、 krt_initcwnd、krt_lock_initcwnd、krt_initrwnd、krt_lock_initrwnd、 krt_quickack、krt_lock_quickack、krt_congctl、krt_lock_congctl、 krt_fastopen_no_cookie、krt_lock_fastopen_no_cookie、 krt_feature_ecn、krt_feature_allfrag
简单配置如下:
protocol kernel {
export all;
}对于具有两张路由表的系统:
protocol kernel { # 主路由表
learn; # 从内核学习外来路由
persist; # BIRD 关闭时不删除路由
scan time 10; # 每 10 秒扫描内核路由表
ipv4 {
import all;
export all;
};
}
protocol kernel { # 辅路由表
kernel table 100;
ipv4 {
table auxtable;
export all;
};
}
译者
原文作者: <Ondrej Filip>, <Martin Mares>, <Maria Matejka>, <Ondrej Zajicek>
原文链接: https://bird.network.cz/?get_doc&v=20&f=bird-6.html#ss6.5
原文标题: 6.5 Kernel
遵循协议: CC BY-NC-SA 4.0
译者: hat
翻译时间: 2026-05-01
更新时间: 2026-05-01
本文链接: https://bird.xmsl.dev/docs/user-guide/6-5-kernel.html