
Hat
译者
⚠️ 注意
如果您发现了错误,欢迎 参与贡献。
💡 摘要 (Powered by OpenAI)
本文是 BIRD 用户指南的第六章第四节,介绍了 BIRD 的静态路由协议 (Static),包括路由定义语法、每下一跳选项、FlowSpec 流规范支持以及完整示例配置,以便您更好地理解相关内容。
静态路由协议 (Static) 不与其他路由器通信,而是允许你手动定义路由。这常用于以下场景:
静态协议配置中有三类定义:全局选项、静态路由定义和每路由选项。通常,协议定义主要包含一个静态路由列表。
静态路由没有特定的属性,但 igp_metric 属性用于比较具有相同偏好值的静态路由。
静态路由列表中可包含同一网络的多条路由(通常但不必须通过 preference 或 igp_metric 区分),但由于静态协议只有一个通道,仅允许同一网络类型的路由。例如,要同时拥有 IPv4 和 IPv6 静态路由,需定义两个静态协议,各自配备相应的路由和通道。
静态协议可配置为MPLS 感知(通过同时定义主通道和 MPLS 通道)。此时,静态协议会为 IP 路由分配标签,并为每条带标签路由自动宣告相应的 MPLS 路由。
check link 开关
若启用,硬件链路状态将被纳入考量。当链路消失(例如以太网电缆被拔下)时,指向该接口的静态路由会被移除。部分硬件驱动或平台可能未实现此功能。默认值:off
igp table 名称
指定用于递归路由的路由表查询表。默认值:与协议连接的表相同。
每条路由定义还可包含一个每路由选项块。请注意:prefix 语法 取决于网络类型。
route prefix [mpls 数值] via ip|"接口名" [每下一跳选项] [via ...]
常规路由可携带一个或多个 下一跳。每个下一跳前以 via 引导。
当静态协议为 MPLS 感知时,可选的 mpls 语句(位于 prefix 之后)为带标签路由指定静态标签,以替代动态分配的标签。
route prefix [mpls 数值] recursive ip [mpls 数值[/数值[/数值[...]]]]
递归下一跳在配置的 IGP 表中解析给定 IP 并使用该路由的下一跳。MPLS 标签栈会拼接在一起:上层为 IGP 的下一跳栈,下层为本路由的栈。
route prefix [mpls 数值] blackhole|unreachable|prohibit
特殊路由,分别指定:静默丢弃数据包、以不可达信息返回、以管理性禁止信息返回。前两者亦可用 drop 和 reject 代替。
当特定目的地不可达时(接口关闭或路由的下一跳当前不是邻居),静态协议会简单地从其连接的表中卸载该路由,并在目的地再次变为邻接状态后立即重新添加。
在多路径路由中,以下选项属于每下一跳级别(即可对一条路由多次使用,每次对应一个下一跳)。语法上它们不是独立选项,而是 route 语句中每个 via 语句之后的组成部分,不以分号分隔。例如,route 10.0.0.0/8 via 192.0.2.1 bfd weight 1 via 192.0.2.2 weight 2; 描述了一条包含两个下一跳的路由:第一个下一跳有两个每下一跳选项(bfd 和 weight 1),第二个下一跳仅有 weight 2。
bfd 开关
静态协议可使用 BFD 协议进行下一跳活跃度检测。启用后,会创建到路由下一跳的 BFD 会话,静态路由变为 BFD 控制——仅当 BFD 确认下一跳活跃时才宣告该路由。
若 BFD 会话失败,静态路由(或多下一跳中受影响的那一跳)会被移除。注意:这与其他协议略有不同——其他协议可能将 BFD 用作快速故障检测的辅助机制,但即使 BFD 会话未建立也会忽略它。
使用此选项还需要配置 BFD 协议。默认值:no
dev 文本
与下一跳关联的出站接口。适用于链路本地下一跳地址或多个接口使用相同网络前缀的场景。默认情况下,出站接口从下一跳地址解析得出。
mpls 数值[/数值[/数值[...]]]
应推送到通过该路由转发数据包的 MPLS 标签。此选项可用于 IP 路由(在 MPLS 入口路由器上)和 MPLS 交换规则(在 MPLS 中转路由器上)。默认值:无标签。
onlink 开关
onlink 标志表示指定下一跳在(指定的)接口上可达,无论该接口的 IP 前缀如何。接口必须使用链路本地作用域格式附加到下一跳 IP 地址(例如 192.0.2.1%eth0)。默认值:no
weight 数值
对于多路径路由,此值指定下一跳的相对权重。允许值:1-256。默认值:1
ROA 配置即为不带下一跳的 route prefixmaxintasint 语句。
ASPA 配置为不带下一跳的 route aspa intprovidersint[,int ...] 语句。第一个 ASN 是客户,后续为提供商列表。对于中转场景,也可写为 route aspa int transit 以表示无提供商 ASPA。
流规范 (Flowspec) 是用于路由器及防火墙的过滤规则,定义于 RFC 8955 和 RFC 8956。有三种参数类型:inet4 或 inet6 前缀、数值匹配表达式和位掩码匹配表达式。
数值匹配是一组以逗号 (,) 分隔的数字和范围序列(如 10,20,30)。范围可用双点 .. 表示法(如 80..90,120..124)。另一种表示法是使用一个或多个关系运算符与值的配对,以逻辑运算符 && 或 || 连接。允许的关系运算符有:=、!=、<、<=、>、>=、true 和 false。
位掩码匹配以 value/mask 或 !value/mask 对表示,意为 (data & mask) 等于或不等于 value。也可使用多个 value/mask 对以逻辑运算符 && 或 || 连接。注意:对于否定匹配,value 必须为零或等于位掩码(如 !0x0/0xf 或 !0xf/0xf,但不能是 !0x3/0xf)。
dst inet4 设置匹配的目标前缀(如 dst 192.168.0.0/16)。IPv4 Flowspec 中仅有此项为必选。
src inet4 设置匹配的源前缀(如 src 10.0.0.0/8)。
proto 数值匹配 设置匹配的 IP 协议号(如 proto 6)。
port 数值匹配 设置匹配的源或目标 TCP/UDP 端口号(如 port 1..1023,1194,3306)。
dport 数值匹配 设置匹配的目标端口号(如 dport 49151)。
sport 数值匹配 设置匹配的源端口号(如 sport = 0)。
icmp type 数值匹配 设置匹配的 ICMP 数据包类型字段号(如 icmp type 3)。
icmp code 数值匹配 设置匹配的 ICMP 数据包代码字段号(如 icmp code 1)。
tcp flags 位掩码匹配 设置匹配 TCP 头部标志(控制位)的位掩码(如 tcp flags 0x03/0x0f;)。掩码最大长度 12 位 (0xfff)。
length 数值匹配 设置匹配的数据包长度(如 length > 1500)。
dscp 数值匹配 设置匹配的 DiffServ Code Point 号(如 dscp 8..15)。
fragment 分片类型 设置匹配的数据包分片类型。允许的分片类型:dont_fragment、is_fragment、first_fragment、last_fragment(如 fragment is_fragment && !dont_fragment)。
protocol static {
flow4;
route flow4 {
dst 10.0.0.0/8;
port > 24 && < 30 || 40..50,60..70,80 && >= 90;
tcp flags 0x03/0x0f;
length > 1024;
dscp = 63;
fragment dont_fragment, is_fragment || !first_fragment;
};
}IPv6 Flowspec 与 IPv4 Flowspec 大致相同,但有若干例外:
offset 数值 (如 ::1234:5678:9800:0000/101 offset 64)。Offset 表示忽略前 数值 位的匹配。next header 6)。dont_fragment 作为分片类型。dst inet6 [offset 数值] 设置匹配的目标 IPv6 前缀(如 dst ::1c77:3769:27ad:a11a/128 offset 64)。
src inet6 [offset 数值] 设置匹配的源 IPv6 前缀(如 src fe80::/64)。
next header 数值匹配 设置匹配的 IP 协议号(如 next header != 6)。
label 数值匹配 设置匹配 IPv6 数据包中 20 位 Flow Label 字段的数值(如 label != 1234)。
protocol static {
flow6 { table myflow6; };
route flow6 {
dst fec0:1122:3344:5566:7788:99aa:bbcc:ddee/128;
src 0000:0000:0000:0001:1234:5678:9800:0000/101 offset 63;
next header = 23;
sport > 24 && < 30 || = 40 || 50,60,70..80;
dport = 50;
tcp flags 0x03/0x0f && !0/0xff || 0x33/0x33;
fragment !is_fragment || !first_fragment;
label > 1111 && != 1234;
};
}过滤表达式
这是一个特殊选项,允许在每路由基础上配置过滤表达式,可多次使用。这些表达式在路由起源时被求值,类似于静态协议的 import 过滤器。这对于配置路由属性尤为有用,例如可对将导出到 OSPF 协议的路由设置 ospf_metric1 = 100;。
protocol static {
ipv4 { table testable; }; # 连接到非默认路由表
check link; # 仅在链路正常时宣告路由
route 0.0.0.0/0 via 198.51.100.130; # 默认路由
route 10.0.0.0/8 # 多路径路由
via 198.51.100.10 weight 2
via 198.51.100.20 bfd # BFD 控制的下一跳
via 192.0.2.1;
route 203.0.113.0/24 blackhole; # 沉没路由
route 10.2.0.0/24 via "arc0"; # 直连路由
route 10.2.2.0/24 via 192.0.2.1 dev "eth0" onlink; # 同时指定下一跳和接口
route 192.168.10.0/24 via 198.51.100.100 {
ospf_metric1 = 20; # 设置扩展属性
};
route 192.168.11.0/24 via 198.51.100.100 {
ospf_metric2 = 100; # 设置扩展属性
ospf_tag = 2; # 设置扩展属性
};
route 192.168.12.0/24 via 198.51.100.100 {
bgp_community.add((65535, 65281)); # 设置扩展 BGP 属性
bgp_large_community.add((64512, 1, 1)); # 设置扩展 BGP 属性
};
}
protocol static {
ipv6; # 通道是必选的
route 2001:db8:10::/48 via 2001:db8:1::1; # 全局下一跳路由
route 2001:db8:20::/48 via fe80::10%eth0; # 链路本地下一跳路由
route 2001:db8:30::/48 via fe80::20%'eth1.60'; # 含特殊字符的接口
route 2001:db8:40::/48 via fe80::30 dev "eth1"; # 另一种链路本地下一跳
route 2001:db8:50::/48 via "eth2"; # 指向 eth2 的直连路由
route 2001:db8::/32 unreachable; # 不可达路由
route ::/0 via 2001:db8:1::1 bfd; # BFD 控制的默认路由
}
译者
原文作者: <Ondrej Filip>, <Martin Mares>, <Maria Matejka>, <Ondrej Zajicek>
原文链接: https://bird.network.cz/?get_doc&v=20&f=bird-6.html#ss6.4
原文标题: 6.4 Static
遵循协议: CC BY-NC-SA 4.0
译者: hat
翻译时间: 2026-05-01
更新时间: 2026-05-01
本文链接: https://bird.xmsl.dev/docs/user-guide/6-4-static.html