
Hat
译者
⚠️ 注意
如果您发现了错误,欢迎 参与贡献。
💡 摘要 (Powered by OpenAI)
本文是 BIRD 用户指南的第六章第二节,介绍了 BIRD 的 OSPF 协议,包括链路状态数据库机制、区域划分、外部路由导入、丰富的接口/区域/认证配置选项以及完整的示例配置,以便您更好地理解相关内容。
开放最短路径优先 (Open Shortest Path First, OSPF) 是一种较为复杂的内部网关协议 (IGP)。
OSPF 是一种链路状态(亦称最短路径优先)协议——每台路由器维护一个描述自治系统拓扑的数据库。参与的每台路由器拥有相同的数据库副本,所有路由器运行相同算法,以自身为根计算最短路径树。OSPF 选择最小开销路径作为最佳路径。
在 OSPF 中,自治系统可划分为多个区域 (Area),以降低交换路由信息的资源消耗,并保护其他区域免受错误路由数据的影响。区域拓扑对自治系统其余部分隐藏。
OSPF 的另一个重要特性是:它可以将其它协议(如 Static 或 BGP)的路由信息以外部路由的形式保留在其链路状态数据库中。每条外部路由可由通告路由器打上标签,从而在自治系统边界上的路由器之间传递附加信息。
OSPF 能快速检测自治系统中的拓扑变更(如路由器接口故障),并在短暂的收敛期后计算出新的无环路由。整个过程只涉及极少量路由通信量。
每台参与 OSPF 路由的路由器周期性向其所有接口发送 Hello 消息,这使得邻居可以被动态发现。然后邻居之间交换各自的链路状态数据库部分,并通过泛洪更新保持数据库一致。泛洪过程是可靠的,确保每台路由器检测到所有变更。
首先,可通过使用 ospf v2 或 ospf v3 指定所需的 OSPF 版本。默认使用 OSPFv2。在配置的主体部分,可以定义多个 OSPF 区域,每个具有不同的 ID。这些定义包括许多其他开关和多个接口定义。接口定义可包含许多开关、常量定义以及非广播网络上的邻居列表。
OSPFv2 需要一条 IPv4 通道。OSPFv3 需要一条 IPv6 通道或一条 IPv4 通道(RFC 5838)。因此,可以为 IPv4 和 IPv6 路由都使用 OSPFv3,但仍需两个协议实例。如果未配置通道,将以默认参数定义相应通道。
protocol ospf [v2|v3] <名称> {
rfc1583compat <开关>;
rfc5838 <开关>;
instance id <数值>;
stub router <开关>;
tick <数值>;
ecmp <开关> [limit <数值>];
merge external <开关>;
graceful restart <开关>|aware;
graceful restart time <数值>;
area <ID> {
stub;
nssa;
summary <开关>;
default nssa <开关>;
default cost <数值>;
default cost2 <数值>;
translator <开关>;
translator stability <数值>;
networks {
<前缀>;
<前缀> hidden;
};
external {
<前缀>;
<前缀> hidden;
<前缀> tag <数值>;
};
stubnet <前缀>;
stubnet <前缀> {
hidden <开关>;
summary <开关>;
cost <数值>;
};
interface <接口模式> [instance <数值>] {
cost <数值>;
stub <开关>;
hello <数值>;
poll <数值>;
retransmit <数值>;
priority <数值>;
wait <数值>;
dead count <数值>;
dead <数值>;
secondary <开关>;
rx buffer [normal|large|<数值>];
tx length <数值>;
type [broadcast|bcast|pointopoint|ptp|
nonbroadcast|nbma|pointomultipoint|ptmp];
link lsa suppression <开关>;
strict nonbroadcast <开关>;
real broadcast <开关>;
ptp netmask <开关>;
ptp address <开关>;
check link <开关>;
bfd <开关>;
ecmp weight <数值>;
ttl security [<开关>; | tx only]
tx class|dscp <数值>;
tx priority <数值>;
authentication none|simple|cryptographic;
password "<文本>";
password "<文本>" {
id <数值>;
generate from "<日期>";
generate to "<日期>";
accept from "<日期>";
accept to "<日期>";
from "<日期>";
to "<日期>";
algorithm ( keyed md5 | keyed sha1 | hmac sha1 | hmac sha256 | hmac sha384 | hmac sha512 );
};
neighbors {
<IP>;
<IP> eligible;
};
};
virtual link <ID> [instance <数值>] {
hello <数值>;
retransmit <数值>;
wait <数值>;
dead count <数值>;
dead <数值>;
authentication none|simple|cryptographic;
password "<文本>";
password "<文本>" {
id <数值>;
generate from "<日期>";
generate to "<日期>";
accept from "<日期>";
accept to "<日期>";
from "<日期>";
to "<日期>";
algorithm ( keyed md5 | keyed sha1 | hmac sha1 | hmac sha256 | hmac sha384 | hmac sha512 );
};
};
};
}rfc1583compat 开关
控制路由表计算与 RFC 1583 的兼容性。默认值:no
rfc5838 开关
基本 OSPFv3 仅限于 IPv6 单播路由。RFC 5838 扩展定义了更多地址族支持(IPv4、IPv6,单播和组播)。该扩展默认启用,但必要时可禁用(因为它限制了可用实例 ID 的范围)。默认值:yes
instance id 数值
当多条 OSPF 协议实例在同一链路上激活时,应使用不同的实例 ID 来区分其数据包。虽然可以按接口设置,但通常倾向于为整个 OSPF 域/拓扑设置一个实例 ID(例如,当多个实例用于在同一物理网络上表示不同的逻辑拓扑时)。此选项指定 OSPF 实例所有接口的实例 ID,但可被 interface 选项覆盖。默认值:0(除非使用 OSPFv3-AF 扩展地址族,该情况参见 RFC 5838)
stub router 开关
将路由器配置为存根路由器 (Stub Router),即参与 OSPF 拓扑但不允许中转流量。OSPFv2 中通过为出站链路通告最大度量值实现;OSPFv3 中通过清除路由器 LSA 中的 R 位来宣告存根行为。详见 RFC 6987。默认值:no
tick 数值
路由表计算和区域数据库清理不是在收到单个链路状态变更时立即执行。为降低 CPU 使用率,它以 数值 秒的周期间隔延后处理。默认值:1
ecmp 开关 [limit 数值]
指定 OSPF 是否允许生成 ECMP(等价多路径) 路由。当存在前往目的地的多条方向且各自具有相同(计算出的)开销时使用。此选项还允许指定每条路由中最大下一跳数限制。默认情况下若内核支持则启用。限制默认值:16
merge external 开关
指定 OSPF 是否应将来自不同路由器/LSA 的同一目的地外部路由合并。与 ecmp 同时启用时,等价外部路由将以与常规路由相同的方式合并为多路径路由。禁用时,来自不同 LSA 的外部路由即使代表同一目的地也被视为独立。默认值:no
graceful restart 开关|aware
当 OSPF 实例重启时,邻居会断开邻接关系并重新计算路由表,这即使在重启路由器的转发平面保持完整的情况下也会中断数据包转发。RFC 3623 规定了优雅重启机制以缓解此问题。
在 OSPF 优雅重启中,重启路由器生成 Grace-LSA,宣告执行优雅重启的意图。收到这些 LSA 的邻居进入 Helper 模式,忽略邻接关系的中断,表现得好像一切正常并保留旧路由。当邻接关系重建后,重启路由器清除 Grace-LSA,优雅重启结束。
此选项控制优雅重启机制,有三种状态:
注意:本地优雅重启的正确支持还需要配置其他协议。默认值:aware
graceful restart time 数值
重启时间在 Grace-LSA 中宣告,指定邻居应等待优雅重启正常结束的时间(秒),超时后将提前退出 Helper 模式。默认值:120 秒
area ID
以给定区域 ID(整数或 IPv4 地址,与路由器 ID 类似)定义一个 OSPF 区域。最重要的区域是骨干区域 (Backbone)(ID 0),每个其他区域必须连接到骨干区域。
stub
将区域配置为存根区域 (Stub Area)。外部路由不会泛洪到存根区域中。存根区域中还可限制摘要 LSA(参见 summary 选项)。默认:非存根区域。
nssa
将区域配置为 NSSA (Not-So-Stubby Area)。NSSA 是存根区域的变体,允许有限的外部路由传播方式。全局外部路由不传播到 NSSA 中,但外部路由可作为(区域级)NSSA-LSA 导入 NSSA(并可能在区域边界被翻译和/或聚合)。默认:非 NSSA。
summary 开关
控制摘要 LSA 向存根区域或 NSSA 区域的传播。启用时摘要 LSA 照常传播;否则仅传播默认摘要路由 (0.0.0.0/0)(有时称为完全存根区域)。若存根区域有多个区域边界路由器,传播摘要 LSA 可带来更高效的路由,但代价是更大的链路状态数据库。默认值:no
default nssa 开关
当 summary 选项启用时,默认摘要路由不再传播到 NSSA。此时此选项允许向 NSSA 生成默认路由作为 NSSA-LSA。默认值:no
default cost 数值
控制传播到存根区域和 NSSA 的默认路由开销。默认值:1000
default cost2 数值
当默认路由作为 NSSA-LSA 生成时,其开销可使用类型 1 或类型 2 度量值。此选项允许指定默认路由的类型 2 度量开销。默认情况下,使用类型 1 度量(default cost 选项)。
translator 开关
控制 NSSA-LSA 翻译为外部 LSA。默认情况下,每个 NSSA 自动从区域边界路由器中选举一个翻译者。若启用,此区域边界路由器将无条件翻译所有 NSSA-LSA,无论翻译者选举结果如何。默认值:no
translator stability 数值
控制翻译者稳定性间隔(秒)。当新翻译者被选出后,旧翻译者持续翻译直到间隔结束。默认值:40
networks { 集合 }
定义区域 IP 范围。用于摘要 LSA 的生成。隐藏网络 (hidden) 不传播到其他区域。
external { 集合 }
定义 NSSA 的外部区域 IP 范围。用于 NSSA-LSA 翻译。隐藏网络不翻译为外部 LSA。网络可配置路由标签。
stubnet 前缀 { 选项 }
存根网络是不作为 OSPF 路由器之间中转网络的网络,它们也通过链路状态数据库在 OSPF 区域内传播。
默认情况下,BIRD 为以下情况生成存根网络记录:
此选项允许修改本路由器传播的存根网络集合。每次使用添加具有给定网络前缀的存根网络(除非使用 hidden 选项),并抑制给定网络前缀的默认存根网络。当使用 summary 选项时,同时抑制作为给定存根网络子网的默认存根网络。这可用于聚合生成的存根网络。
interface 模式 [instance 数值]
定义指定接口属于正在定义的区域。详见 interface 通用选项。在 OSPFv2 中,使用扩展接口子句,因为每个网络前缀作为一个独立的虚拟接口处理。
可以为接口定义指定替代实例 ID,从而可以在不同选项中甚至在不同区域内拥有该接口的多个实例。对于 OSPFv2,实例 ID 支持是一个扩展(RFC 6549),应按协议设置。对于 OSPFv3,它是内置特性。
virtual link ID [instance 数值]
到具有该路由器 ID 的路由器的虚拟链路。虚拟链路作为属于骨干区域的点对点接口运行。实际区域用作传输区域。此项不能位于骨干区域中。与 interface 选项类似,你也可以使用不同实例 ID 到同一目的地的多条虚拟链路。
cost 数值
指定接口的输出开销(度量值)。默认值:10
stub 开关
若在接口上设置,则不监听任何数据包且不发送 Hello。默认值:no
hello 数值
指定发送 Hello 消息的间隔(秒)。注意:同一网络上的所有路由器需要具有相同的 Hello 间隔。默认值:10
poll 数值
指定 NBMA 网络上某些邻居的 Hello 消息发送间隔(秒)。默认值:20
retransmit 数值
指定未确认更新的重传间隔(秒)。默认值:5
transmit delay 数值
指定通过接口发送的链路状态更新的估计传输延迟。该值会加到经过接口传播的 LSA 的 LSA Age 上。默认值:1
priority 数值
在每多路访问网络上(如以太网),会选举指定路由器 (Designated Router, DR) 和备份指定路由器 (Backup DR, BDR)。这些路由器在泛洪过程中承担特殊职能。优先级越高,在选举中的偏好越大。优先级为 0 的路由器无资格。默认值:1
wait 数值
启动后,路由器等待指定秒数(在开始选举和建立邻接关系之间)。默认值:4 * hello
dead count 数值
当路由器在 dead count × hello 秒内未收到某邻居的任何消息时,认为该邻居已中断。
dead 数值
当路由器在 dead 秒内未收到某邻居的任何消息时,认为该邻居已中断。若同时使用 dead count 和 dead 指令,dead 有优先权。
rx buffer 数值
指定用于数据包处理的缓冲区大小。缓冲区大小应大于任何数据包的最大尺寸。默认情况下,缓冲区按需动态调整,但也可指定固定值。值 large 表示最大允许数据包尺寸 — 65535。
tx length 数值
包含大量信息的 OSPF 传输消息被分段为独立的 OSPF 数据包以避免 IP 分片。此选项指定生成的 OSPF 数据包长度的软上限。默认值:网络接口的 MTU。注意:如果底层 OSPF 消息无法拆分(如传播一个大型 LSA 时),仍可能生成较大的 OSPF 数据包。
type broadcast|bcast
BIRD 自动检测连接网络的类型,但有时手动强制使用不同类型也很方便。在广播网络上(如以太网),泛洪和 Hello 消息使用组播发送(单个数据包覆盖所有邻居)。选举指定路由器,负责同步链路状态数据库和生成网络 LSA。此网络类型不能用于物理 NBMA 网络和无编号网络(没有正确 IP 前缀的网络)。
type pointopoint|ptp
点对点网络仅连接两台路由器。不进行选举,不生成网络 LSA,使建立过程更简单快速。此网络类型不仅适用于物理 PtP 接口(如 PPP 或隧道),也适用于用作 PtP 链路的广播网络。此网络类型不能用于物理 NBMA 网络。
type nonbroadcast|nbma
在 NBMA 网络上,由于缺少组播能力,数据包需分别发送给每个邻居。与广播网络一样,选举指定路由器,在 LSA 传播中发挥核心作用。此网络类型不能用于无编号网络。
type pointomultipoint|ptmp
这是另一种设计用于处理 NBMA 网络的类型。在此情况下,NBMA 网络被视为 PtP 链路的集合。适用于并非每对路由器都有直接通信的情况,或 NBMA 网络用作(可能是无编号的)PtP 链路时。
link lsa suppression 开关
在 OSPFv3 中,为每个链路生成链路 LSA,向本地邻居通告路由器的链路本地 IPv6 地址。这在 PtP 或 PtMP 网络上无用,此选项允许对这些接口抑制链路 LSA 的生成。在 PtP 或 PtMP 以外的接口上忽略。默认值:no
strict nonbroadcast 开关
若设置,不向任何未定义的邻居发送 Hello。此开关在 NBMA 或 PtMP 以外的接口上忽略。默认值:no
real broadcast 开关
在 type broadcast 或 type ptp 网络配置中,OSPF 数据包作为 IP 组播数据包发送。此选项将行为更改为使用旧式的 IP 广播数据包。这在 IP 组播因某种原因不能正常工作或不可靠时可作为变通方案。这是一个非标准选项,可能与其他 OSPF 实现不兼容。默认值:no
ptp netmask 开关
在 type ptp 网络配置中,OSPFv2 实现应忽略 Hello 数据包中接收到的 netmask 字段,并应在无编号 PtP 链路上发送 netmask 字段为零的 Hello 数据包。但某些 OSPFv2 实现甚至对 PtP 链路也执行 netmask 检查。
此选项指定是否在 type ptp 接口上的 Hello 数据包中使用真实 netmask。除非遇到与此问题相关的兼容性问题,否则应忽略此选项。默认值:无编号 PtP 链路为 no,否则为 yes
ptp address 开关
在 type ptp 网络配置中,OSPFv2 实现应在路由器 LSA 的链路描述记录的数据字段中:对常规 PtP 链路使用 IP 地址,对无编号 PtP 链路使用接口 ID。此数据字段对 PtP 链路仅具有本地意义,但某些有缺陷的 OSPFv2 实现假定存在 IP 地址并将其用作 SPF 计算中的下一跳。注意:当启用优雅重启时,无编号 PtP 链路的接口 ID 对于区分具有相同本地 IP 地址的 PtP 链路是必要的。
此选项指定是否在 type ptp 接口的数据字段中使用 IP 地址,对其他接口忽略。默认值:启用优雅重启时无编号 PtP 链路为 no,否则为 yes
check link 开关
若设置,硬件链路状态(由操作系统报告)被纳入考量。链路消失时,邻居立即被视为不可达,仅传播接口地址(而非整个网络前缀)。默认值:yes
bfd 开关
OSPF 可使用 BFD 协议作为邻居活跃度和故障检测的辅助机制。启用后,BIRD 为每个 OSPF 邻居设置一个 BFD 会话并跟踪其活跃度。这具有在故障情况下检测时间低一个数量级的优势。注意:还需要配置 BFD 协议,详见 BFD 部分。默认值:no
ttl security [开关 | tx only]
TTL 安全使用 TTL 255 代替 TTL 1 发送邻居协议数据包,保护路由协议免受远程伪造数据包攻击。注意:此选项会干扰 OSPF 虚拟链路。
tx only:发送使用 TTL 255,但不检查接收数据包默认值:no
tx class|dscp|priority 数值
指定出站 OSPF 数据包的 ToS/DiffServ/流量类别/优先级。详见 tx class 通用选项。
ecmp weight 数值
当允许多路径路由时,此值指定通过该接口的下一跳的相对权重。允许值:1-256。默认值:1
authentication none
不发送密码。默认值。
authentication simple
每个数据包携带 8 字节密码。缺少此密码的接收数据包被忽略。此认证机制非常薄弱。此选项在 OSPFv3 中不可用。
authentication cryptographic
每个数据包附加认证码。具体的加密算法由每个密钥的 algorithm 选项选择。OSPFv2 密钥的默认算法为 Keyed-MD5,OSPFv3 密钥为 HMAC-SHA-256。密码不通过网络明文发送,因此此机制相当安全(攻击者仍可读取数据包)。
password "文本"
指定用于认证的密码。详见 password 通用选项。
neighbors { 集合 }
NBMA 或 PtMP 网络上要发送 Hello 消息的邻居集合。对于 NBMA 网络,部分可标记为 eligible。在 OSPFv3 中,应使用链路本地地址;使用全局地址可行但非标准,可能会出现问题。决不应混合使用链路本地和全局地址。
OSPF 定义四个路由属性:
每条内部路由有一个 metric(度量值),范围从 1 至无穷大 (65535)。外部路由使用 metric type 1 或 metric type 2:
metric 可比较internal metric 或 metric of type 1 存储在属性 ospf_metric1 中;metric type 2 存储在属性 ospf_metric2 中。当两种度量都指定了时,使用类型 2 度量。
例如,当类型 2 外部路由从一个 OSPF 域传播到另一个时:ospf_metric1 是到原始 ASBR 的内部距离,而 ospf_metric2 存储类型 2 度量。注意:在此类情况下,若 ospf_metric1 非零,ospf_metric2 会增加 1 以确保度量的单调性,因为当外部路由被通告时内部距离重置为零。
每条外部路由还可携带属性 ospf_tag(32 位整数),在将路由导出到其他协议时使用;它在 OSPF 域内部完全不影响路由。第四个属性 ospf_router_id 是通告该路由/网络的路由器 ID,为只读。
默认值:ospf_metric2 = 10000,ospf_tag = 0
protocol ospf MyOSPF {
ipv4 {
export filter {
if source = RTS_BGP then {
ospf_metric1 = 100;
accept;
}
reject;
};
};
area 0.0.0.0 {
interface "eth*" {
cost 11;
hello 15;
priority 100;
retransmit 7;
authentication simple;
password "aaa";
};
interface "ppp*" {
cost 100;
authentication cryptographic;
password "abc" {
id 1;
generate to "2023-04-22 11:00:06";
accept from "2021-01-17 12:01:05";
algorithm hmac sha384;
};
password "def" {
id 2;
generate to "2025-07-22";
accept from "2021-02-22";
algorithm hmac sha512;
};
};
interface "arc0" {
cost 10;
stub yes;
};
interface "arc1";
};
area 120 {
stub yes;
networks {
172.16.1.0/24;
172.16.2.0/24 hidden;
};
interface "-arc0" , "arc*" {
type nonbroadcast;
authentication none;
strict nonbroadcast yes;
wait 120;
poll 40;
dead count 8;
neighbors {
192.168.120.1 eligible;
192.168.120.2;
192.168.120.10;
};
};
};
}
译者
原文作者: <Ondrej Filip>, <Martin Mares>, <Maria Matejka>, <Ondrej Zajicek>
原文链接: https://bird.network.cz/?get_doc&v=20&f=bird-6.html#ss6.2
原文标题: 6.2 OSPF
遵循协议: CC BY-NC-SA 4.0
译者: hat
翻译时间: 2026-05-01
更新时间: 2026-05-01
本文链接: https://bird.xmsl.dev/docs/user-guide/6-2-ospf.html