
Hat
译者
⚠️ 注意
如果您发现了错误,欢迎 参与贡献。
💡 摘要 (Powered by OpenAI)
本文是 BIRD 用户指南的第六章第一节,介绍了 BIRD 的边界网关协议 (BGP),包括其作为互联网骨干路由协议的工作原理、路由选择算法、大量 IETF 标准支持、全面的协议/通道级配置选项和丰富的 BGP 路由属性,以便您更好地理解相关内容。
边界网关协议 (Border Gateway Protocol, BGP) 是当今互联网骨干级路由所使用的路由协议。与其他协议不同,BGP 的收敛不依赖于所有路由器遵循相同的路由选择规则,因此可以在网络中任意路由器上实施任意路由策略。唯一限制是:如果某路由器通告了一条路由,它必须接受并按照该路由转发数据包。
BGP 以自治系统 (Autonomous System, AS) 的概念运行。每个 AS 是具有统一管理和统一路由策略的网络部分,由一个唯一的 16 位编号 (ASN) 标识。
AS 内的路由器通常使用内部网关协议(IGP,如 OSPF 或 RIP)相互交换 AS 内部的路由信息。位于 AS 边界的边界路由器通过外部 BGP (eBGP) 与相邻 AS 中的邻居交换全局(跨 AS)网络可达性信息,并通过内部 BGP (iBGP) 将收到的信息分发给 AS 内的其他路由器。
每台 BGP 路由器向其邻居发送其希望导出的路由表部分的更新,并附带完整的路径信息(数据包如果使用该路由将经过的 AS 列表),以避免路由环路。
BGP 没有简单的度量值,因此多条具有相同偏好的 BGP 路由之间的最佳路由选择规则较为复杂,按照以下算法实现。从第一条规则开始,如果有多条"最佳"路由,则使用第二条规则进一步筛选,依此类推。
BGP 主要关注全局网络可达性和到其他自治系统的路由。当这些路由通过 BGP 分发给 AS 内的路由器时,它们包含边界路由器的 IP 地址(NEXT_HOP 属性中)。BGP 依赖现有的 IGP 路由表(包含 AS 内部路由)来确定路由的直接下一跳,并了解其到边界路由器的内部距离(用于 BGP 路由选择)。在 BIRD 中,通常使用一张路由表同时用于 IGP 路由和 BGP 路由。
每个 BGP 实例对应一个邻居路由器。这使得可以使用以下配置参数为每个邻居单独设置路由策略和所有其他参数:
protocol bgp [<名称>] {
ipv4|ipv6|... {
<通道选项>
mandatory <开关>;
next hop keep <开关>|ibgp|ebgp;
next hop self <开关>|ibgp|ebgp;
next hop address <IP>;
next hop prefer global;
link local next hop format native|single|double;
gateway direct|recursive;
igp table <名称>;
import table <开关>;
export table <开关>;
secondary <开关>;
validate <开关>;
base table <名称>;
extended next hop <开关>;
require extended next hop <开关>;
add paths <开关>|rx|tx;
require add paths <开关>;
aigp <开关>|originate;
cost <数值>;
graceful restart <开关>;
long lived graceful restart <开关>;
long lived stale time <数值>;
min long lived stale time <数值>;
max long lived stale time <数值>;
};
local [<IP>] [port <数值>] [as <数值>];
neighbor [<IP> | range <前缀>] [onlink] [port <数值>] [as <数值>] [internal|external];
interface "<文本>";
interface range <接口模式>;
onlink <开关>;
direct;
multihop [<数值>];
source address <IP>;
dynamic name "<文本>";
dynamic name digits <数值>;
strict bind <开关>;
free bind <开关>;
check link <开关>;
bfd <开关>|graceful| { <bfd-选项> };
ttl security <开关>;
authentication none|md5|ao;
password "<文本>";
keys { ... };
setkey <开关>;
passive <开关>;
confederation <数值>;
confederation member <开关>;
rr client <开关>;
rr cluster id <数值>|<IPv4 地址>;
rs client <开关>;
allow bgp_local_pref <开关>;
allow bgp_med <开关>;
allow local as [<数值>];
allow as sets <开关>;
enforce first as <开关>;
enable route refresh <开关>;
require route refresh <开关>;
enable enhanced route refresh <开关>;
require enhanced route refresh <开关>;
graceful restart <开关>|aware;
graceful restart time <数值>;
min graceful restart time <数值>;
max graceful restart time <数值>;
require graceful restart <开关>;
long lived graceful restart <开关>|aware;
long lived stale time <数值>;
min long lived stale time <数值>;
max long lived stale time <数值>;
require long lived graceful restart <开关>;
interpret communities <开关>;
enable as4 <开关>;
require as4 <开关>;
enable extended messages <开关>;
require extended messages <开关>;
capabilities <开关>;
advertise hostname <开关>;
require hostname <开关>;
disable after error <开关>;
disable after cease <开关>|<标志集合>;
hold time <数值>;
min hold time <数值>;
startup hold time <数值>;
keepalive time <数值>;
min keepalive time <数值>;
send hold time <数值>;
connect delay time <数值>;
connect retry time <数值>;
error wait time <数值>, <数值>;
error forget time <数值>;
path metric <开关>;
med metric <开关>;
deterministic med <开关>;
igp metric <开关>;
prefer older <开关>;
default bgp_med <数值>;
default bgp_local_pref <数值>;
local role <角色名>;
require roles <开关>;
}local [IP] [port 数值] [as 数值]
定义我们属于哪个 AS。(注意:与其他 IP 路由器不同,BIRD 能够同时充当位于多个 AS 中的路由器,但在此情况下需要在过滤器中手动调整 BGP 路径以获得一致的行为。)可选的 ip 参数指定源地址,等同于 source address 选项。可选的 port 参数指定本地 BGP 端口(替代标准端口 179)。此参数可使用不同子选项多次使用。此参数为必选。
neighbor [IP | range 前缀] [port 数值] [as 数值] [internal|external]
定义此实例将要通信的邻居路由器及其所在的 AS。如果邻居与我们在同一 AS 中,自动切换到 IBGP 模式。或者,可以指定 internal 或 external 代替 AS 号——前者接受本地 AS 号,后者接受任何外部 AS 号。可选指定远程端口。与 local 参数一样,可使用不同子选项多次使用。此参数为必选。
可以使用 range 关键字指定网络前缀代替显式的邻居 IP 地址。这启用了动态 BGP 行为——BGP 实例在 BGP 端口上监听,对于匹配网络前缀的入站 BGP 连接会派生新的 BGP 实例。可以混合使用常规 BGP 实例和动态 BGP 实例,并使用不同范围拥有多个动态 BGP 实例。
派生的动态 BGP 实例共享父实例的配置,因此重新配置父协议会强制重新配置派生的协议。当邻居范围更改时,所有派生的动态实例会关闭。重新配置会清除先前被 disable CLI 命令禁用的所有动态实例——这可能重新启用某些原本被禁用实例阻塞的客户端连接。
interface "文本"
定义应用于链路本地 BGP IPv6 会话的接口。接口也可作为 neighbor address 的一部分指定(如 neighbor fe80::1234%eth0 as 65000;)。此选项也可在需要显式指定接口的非链路本地会话中使用,但仅适用于直连(非 multihop)会话。
interface range 接口模式
设置连接将绑定到的接口模式。这在与 neighbor range 选项配合使用时最有用,同时也适用于链路本地地址或 onlink 选项——这些场景中预先不知道连接来自哪个接口但需要保持在该接口上。此选项要求 strict bind 开启,并为匹配模式的每个接口创建独立的监听套接字。
onlink 开关
对于直连邻居,BGP 会话立即启动,无需等待邻居地址出现在任何接口上。此选项要求配置接口。此会话中所有路由的下一跳也具有 onlink 属性。此选项在没有其他配套配置时通常会导致异常行为。默认值:disabled
direct
指定邻居是直连的。邻居的 IP 地址必须来自直接可达的 IP 范围(即关联到路由器的一个接口),否则 BGP 会话不会启动,会等待此类接口出现。替代方案是 multihop 选项。默认:eBGP 启用。
multihop [数值]
配置到非直连邻居的多跳 BGP 会话。准确地说,如果配置的邻居 IP 地址与任何本地网络子网不匹配,应使用此选项。此类 IP 地址必须通过系统路由表可达。建议为多跳 BGP 显式配置源地址以保持稳定。可选的 number 参数指定跳数(用于 TTL)。注意:计算的是路径中的网络(边)数——即如果两台 BGP 发言者之间隔了一台路由器,跳数为 2。默认:iBGP 启用。
source address IP
定义用作 BGP 会话源地址的本地地址。默认:邻居所连接接口的本地端地址。
dynamic name "文本"
定义动态 BGP 行为激活时派生新 BGP 实例的名称公共前缀。实际名称还包含数字索引以区分各实例。默认值:"dynbgp"
dynamic name digits 数值
定义派生动态 BGP 实例名称中索引的最小位数。例如设为 2 时,第一个名称为 "dynbgp01"。默认值:0
strict bind 开关
指定 BGP 监听套接字是否应绑定到特定本地地址(与 source address 相同)及关联接口,还是绑定到所有地址。绑定到特定地址适用于在一台机器上运行多个 BIRD 实例、各自使用不同 IP 地址的情况。注意:绑定到特定地址和绑定到所有地址的监听套接字会冲突。因此,所有 BGP 协议(相同地址族、使用相同本地端口)应全部设置 strict bind,或全部不设置。默认值:disabled
free bind 开关
对监听套接字使用 IP_FREEBIND 套接字选项,允许绑定到尚未分配给接口的 IP 地址。所有共享监听套接字的 BGP 实例应具有相同的 free bind 值。默认值:disabled
check link 开关
BGP 可将硬件链路状态纳入考量。启用后,BIRD 跟踪关联接口的链路状态,当链路消失(如以太网电缆被拔下)时,BGP 会话立即关闭。注意:此选项不能与多跳 BGP 一起使用。默认:直连 BGP 启用。
bfd 开关|graceful| { 选项 }
BGP 可使用 BFD 协议作为邻居活跃度和故障检测的辅助机制。启用后,BIRD 为 BGP 邻居设置 BFD 会话并跟踪其活跃度。故障检测时间比常规机制低一个数量级。检测到邻居故障时,BGP 会话重新启动。
可选通过 graceful 参数配置触发优雅重启而非常规重启。也可指定包含每对等体 BFD 会话选项的部分(允许所有 BFD 会话级选项)。注意:还需要配置 BFD 协议(详见 BFD 部分)。默认值:disabled
ttl security 开关
使用 GTSM(RFC 5082 — 通用 TTL 安全机制)。GTSM 通过忽略 TTL 小于预期值的接收数据包来防止伪造数据包攻击。GTSM 需要在 BGP 会话两端同时启用才能正常工作。如果同时启用 ttl security 和 multihop 选项,multihop 应指定正确的跳数以计算预期 TTL。内核要求:Linux 2.6.34+ (IPv4)、2.6.35+ (IPv6);BSD 长期支持但仅 IPv4。默认值:disabled
authentication none|md5|ao
选择使用的认证方式:
none:BGP 会话不进行认证md5:使用 BGP 会话的 TCP MD5 认证(RFC 2385),通过 password 选项指定(单一)密码ao:使用 TCP 认证选项(TCP-AO,RFC 5925),支持多密钥和不同加密算法,通过 keys 选项指定注意:TCP-AO 认证不支持动态 BGP 会话。默认值:none
password "文本"
用于 BGP 会话 MD5 认证的密码(RFC 2385)。在 BSD 系统上使用时,另见 setkey 选项。默认:无认证。
setkey 开关
在 BSD 系统上,TCP MD5 认证的密钥存储在全局 SA/SP 数据库中,可由外部工具访问(如 setkey(8))。BIRD 根据 password 选项自动配置 SA/SP 数据库中的安全关联,此选项允许在偏好手动配置时禁用 BIRD 的自动更新。注意:自动 SA/SP 数据库更新目前仅在 FreeBSD 上实现。默认值:enabled
keys { key { [...] }; [...] }
定义用于 BGP 会话 TCP-AO 认证(RFC 5925)的加密密钥集合。每个密钥有独立的配置块,包含子选项:send id/recv id/id、secret、algorithm、preferred、deprecated。TCP-AO 密钥有两个 ID——出站和入站方向(Send/Recv ID)。所有 Send ID 必须唯一,所有 Recv ID 必须唯一,范围为 0-255。密钥的共享秘密通过 secret 选项指定(文本字符串或十六进制字节串)。算法可选值:hmac md5、hmac sha1、hmac sha224、hmac sha256、hmac sha384、hmac sha512、cmac aes128。默认算法:hmac sha1。标记为 preferred 的密钥优先被选为 RNext 密钥;标记为 deprecated 的密钥不会被选中。必须始终至少有一个非 deprecated 密钥。
passive 开关
标准 BGP 行为既发起出站连接又接受入站连接。在被动模式下,不发起出站连接。默认值:off
confederation 数值
BGP 联盟(RFC 5065)是自治系统的集合,对外部系统表现为单一实体,由一个联盟标识符代表。此选项启用 BGP 联盟行为并指定本地联盟标识符。使用 BGP 联盟时,所有联盟成员 BGP 发言者应配置相同的联盟标识符。默认值:0(无联盟)
confederation member 开关
当使用 BGP 联盟时,此选项指定 BGP 邻居是否与本地 BGP 发言者属于同一联盟。对于 IBGP 会话无需使用(相同 AS 号即意味着同一联盟)。默认值:no
rr client 开关
充当路由反射器 (Route Reflector) 并将邻居视为路由反射客户端。默认值:disabled
rr cluster id 数值 | IPv4 地址
路由反射器使用集群 ID 来避免路由反射环路。集群中只有一个路由反射器时通常使用其路由器 ID 作为集群 ID;当集群中有多个路由反射器时,需要通过此选项配置统一的集群 ID。客户端无需知道集群 ID,此选项不允许用于客户端。默认值:与路由器 ID 相同
rs client 开关
充当路由服务器 (Route Server) 并将邻居视为路由服务器客户端。路由服务器用于互联网交换中心替代全互联 EBGP 路由,类似于 IBGP 路由中路由反射器的作用。BIRD 不实现已废弃的 RFC 1863,而是使用 ad-hoc 实现——其行为类似普通 EBGP,但减少了对通告路由属性的修改以保持透明(例如不在 AS PATH 属性前添加自身 AS 号,并保留 MED 属性)。默认值:disabled
allow bgp*local_pref *开关_
标准 BGP 实现不向 EBGP 邻居发送 Local Preference 属性,并忽略从 EBGP 邻居收到的该属性(RFC 4271)。在 EBGP 会话上启用此选项后,将向对等体发送并接受此属性。此选项不影响 IBGP 会话。默认值:off
allow bgp*med *开关_
标准 BGP 实现不传播 MULTI_EXIT_DESC 属性(除非本地配置)。在 EBGP 会话上启用此选项后将无差别发送。此选项不影响 IBGP 会话。默认值:off
allow local as [数值]
BGP 通过拒绝 AS 路径中包含本地 AS 号的接收路由来防止路由环路。此选项允许放宽或禁用此检查。可选的 number 参数指定 AS 路径中允许的本地 ASN 最大出现次数。不带参数使用时完全禁用检查,需通过其他方式确保无环行为。默认值:0(不允许本地 AS 号)
allow as sets 开关
历史上 BGP 路由的 AS 路径属性曾包含 AS 号集合而不仅是序列。这些很少使用的产物是跨 AS 路由聚合的结果。AS 集合已废弃(RFC 6472、RFC 9774)。启用此选项后,包含这些废弃 AS 集合的接收 AS 路径将被接受。默认值:off(自 BIRD 2.18 / 3.2 起)
enforce first as 开关
从 EBGP 邻居收到的路由通常要求其 AS 路径的第一个(最左侧)AS 号等于邻居 AS 号。默认不强制此项,因为存在合法例外(如连接到路由服务器)。启用后,第一个 AS 号不匹配的路由将被拒绝。仅对 EBGP 会话有效。默认值:off
enable route refresh 开关
初始路由交换后,BGP 使用增量更新保持同步。有时需要重新进行完整路由交换(如更改 import 过滤器或怀疑不一致)。路由刷新 (Route Refresh) 扩展(RFC 2918)允许 BGP 发言者请求邻居重新通告所有路由。此选项指定 BIRD 是否通告此能力并支持相关流程。禁用 Route Refresh 同时也会禁用 Enhanced Route Refresh。默认值:on
require route refresh 开关
若启用,BGP 邻居必须宣告 Route Refresh 能力,否则 BGP 会话不会建立。默认值:off
enable enhanced route refresh 开关
增强路由刷新 (Enhanced Route Refresh)(RFC 7313)为 Route Refresh 指定了显式的开始和结束标记,使接收方可以移除在交换期间未被通告的过期路由。默认值:on
require enhanced route refresh 开关
类似 require route refresh,但针对增强路由刷新能力。默认值:off
graceful restart 开关|aware
当 BGP 发言者重启或崩溃时,邻居会丢弃从该发言者收到的所有路径,即使转发平面保持完整也会中断数据包转发。RFC 4724 规定了可选的优雅重启机制。
此选项有三种状态:
重启角色也可按通道配置。注意:本地优雅重启的正确支持还需要配置其他协议。默认值:aware
graceful restart time 数值
重启时间在 BGP Graceful Restart 能力中宣告,指定邻居在重启后等待 BGP 会话重建的时间(超时后删除过期路由)。默认值:120 秒
min graceful restart time 数值max graceful restart time 数值 优雅重启时间的下限/上限,用于覆盖邻居宣告的值。默认:无界限
require graceful restart 开关
若启用,BGP 邻居必须宣告 Graceful Restart 能力。默认值:off
long lived graceful restart 开关|aware
LLGR 是传统 BGP 优雅重启 的扩展:过期路由在重启时间超时后仍保留额外的一段长生命周期过期时间,但会标记 LLGR_STALE 团体、被降低优先级、并在不支持 LLGR 的路由器上撤回。与传统的 BGP 优雅重启一样有三种状态。LLGR 要求至少启用 aware 级别的传统优雅重启。默认值:aware(除非优雅重启被禁用)
long lived stale time 数值
LLGR 过期时间,在长生命周期优雅重启期间保持过期路由降级状态的时间。默认值:3600 秒
require long lived graceful restart 开关
若启用,BGP 邻居必须宣告 Long-lived Graceful Restart 能力。默认值:off
interpret communities 开关
RFC 1997 要求 BGP 发言者应处理公认团体 (Well-known Communities),如 no-export (65535, 65281) 或 no-advertise (65535, 65282)。启用此选项后(默认),BIRD 自动执行此行为(在路由导出到 BGP 协议时、export 过滤器之前求值)。禁用后,可在 export 过滤器中实现类似行为。默认值:on
enable as4 开关
BGP 原本使用 2 字节 AS 号,后续扩展支持 4 字节 AS 号。BIRD 支持 4 字节 AS 扩展,但通过禁用此选项可以不宣告它并维持与邻居的旧式会话。这在规避邻居 4 字节 AS 扩展实现的 bug 时可能有用。即使禁用,BIRD 内部仍以 AS4 感知方式运行。默认值:on
require as4 开关
若启用,BGP 邻居必须宣告 4 字节 AS 号能力。默认值:off
enable extended messages 开关
BGP 协议最大消息长度为 4096 字节。此选项提供扩展(RFC 8654)以允许最大 65535 字节的扩展消息。默认值:off
require extended messages 开关
类似,要求邻居必须宣告扩展消息能力。默认值:off
capabilities 开关
使用能力通告来宣告可选能力。这是较新 BGP 实现的标准行为,但可能有旧的 BGP 实现拒绝此类连接尝试。禁用后,依赖此功能的特性(如 4 字节 AS 支持)也会被禁用。默认值:on,收到能力相关错误时自动回退到 off
advertise hostname 开关
通告主机名能力及主机名。默认值:off
require hostname 开关
若启用,BGP 邻居必须通告主机名能力。默认值:off
disable after error 开关
遇到错误时(本地或对方报告),自动禁用该实例并等待管理员手动修复。默认值:off
disable after cease 开关|标志集合
收到 Cease 通知时自动禁用实例。带 switch 参数时处理除 connection collision 之外的所有 Cease 子类型。标志集合语法为 {flag[,...] },可用标志:cease、prefix limit hit、administrative shutdown、peer deconfigured、administrative reset、connection rejected、configuration change、connection collision、out of resources。默认值:off
hold time 数值
等待对方 Keepalive 消息的时间(秒),超时视为连接中断。有效值在会话建立期间协商,取配置值和对方建议值的最小值。零值具有特殊含义,表示不使用 keepalive。默认值:240 秒
min hold time 数值
会话协商期间接受的 hold time 最小值。如果对方提议的值更低,会话将被拒绝。默认值:无
startup hold time 数值
路由器有机会交换 Open 消息并就实际值达成一致之前使用的 hold timer 值。默认值:240 秒
keepalive time 数值
发送两个连续 Keepalive 消息之间的延迟(秒)。有效值取决于协商的 hold time,会按比例缩放。默认值:hold time 的三分之一
min keepalive time 数值
会话协商期间接受的 keepalive time 最小值。默认值:无
send hold time 数值
成功传输 BGP 消息之间的最大时间。Send hold timer 在邻居发送 keepalive 但不接收我们的消息(导致 TCP 连接停滞)时中断会话。详见 RFC 9687。有效值取决于协商的 hold time。设为 0 则禁用此定时器。默认值:hold timer 上限的两倍
connect delay time 数值
协议启动后到第一次尝试连接之前的延迟(秒)。默认值:5 秒
connect retry time 数值
失败连接尝试后重试前等待的时间(秒)。默认值:120 秒
error wait time 数值, 数值
协议故障后自动重启的最小和最大延迟(秒)。连续错误发生时延迟指数增长至最大值。不适用于配置了 disable after error 的情况。默认值:60, 300
error forget time 数值
两次协议故障之间的最大时间(秒),在此时间内视为连续错误序列(使 error wait time 指数增长)。默认值:300 秒
path metric 开关
启用路径长度比较(在选择最佳 BGP 路由时)。默认值:on
med metric 开关
即使在来自不同 AS 的路由之间也启用 MED 属性比较(最佳路由选择时)。禁用时仅对来自同一 AS 的路由比较 MED(标准行为)。默认值:off
deterministic med 开关
启用实现正确 RFC 4271 路由选择的(较慢的)确定性算法来处理 MED 属性。与排序表不兼容。默认值:off
igp metric 开关
启用比较到边界路由器的内部距离(最佳路由选择时)。默认值:on
prefer older 开关
将标准的路由器 ID 打破平局改为偏好更旧的路由。详见 RFC 5004。默认值:off
default bgp*med *数值_
当 MED 属性缺失时,路由选择中使用的 MED 值。默认值:0
default bgp*local_pref *数值_
Local Preference 属性的默认值。当 BGP 协议自身向路由附加新的 Local Preference 属性时使用(例如通过 eBGP 收到的路由因此没有此属性)。默认值:100
local role 角色名
BGP 角色是路由泄露预防和基于常见 BGP 拓扑关系的自动路由过滤机制(RFC 9234)。角色名可选值:provider、rs_server、rs_client、customer、peer。仅对 EBGP 会话有效。默认:未分配角色
require roles 开关
若设置,BGP 角色必须在两端都定义,否则会话不会建立。这是 RFC 9234 中定义的"严格模式"。默认值:disabled
BGP 通过一个连接支持多个 AFI/SAFI。每个向对等体宣告的 AFI/SAFI 对应一个通道。
| 通道名 | 表 nettype | IGP 表允许 | AFI | SAFI |
|---|---|---|---|---|
ipv4 | ipv4 | ipv4 和 ipv6 | 1 | 1 |
ipv6 | ipv6 | ipv4 和 ipv6 | 2 | 1 |
ipv4 multicast | ipv4 | ipv4 和 ipv6 | 1 | 2 |
ipv6 multicast | ipv6 | ipv4 和 ipv6 | 2 | 2 |
ipv4 mpls | ipv4 | ipv4 和 ipv6 | 1 | 4 |
ipv6 mpls | ipv6 | ipv4 和 ipv6 | 2 | 4 |
vpn4 mpls | vpn4 | ipv4 和 ipv6 | 1 | 128 |
vpn6 mpls | vpn6 | ipv4 和 ipv6 | 2 | 128 |
vpn4 multicast | vpn4 | ipv4 和 ipv6 | 1 | 129 |
vpn6 multicast | vpn6 | ipv4 和 ipv6 | 2 | 129 |
flow4 | flow4 | --- | 1 | 133 |
flow6 | flow6 | --- | 2 | 133 |
BGP 可配置为 MPLS 感知(同时定义 AFI/SAFI 通道和 MPLS 通道)。此时 BGP 为从 MPLS 感知 SAFI 导入的路由分配标签并自动宣告相应的 MPLS 路由。由于 BGP 通常处理大量路由,建议将 MPLS 标签策略设为 aggregate。
由于 RFC 8212,外部 BGP 协议要求显式配置 import 和 export 策略(其他协议默认 import all 和 export none)。
BGP 通道具有额外的配置选项:
mandatory 开关
当本地和对等体的 AFI/SAFI 配置集合不同时,能力协商确保使用共同子集。对于强制通道,其关联的 AFI/SAFI 必须被协商(即邻居也必须宣告),否则 BGP 会话协商失败。无论如何,至少需要协商一个 AFI/SAFI 才能成功建立 BGP 会话。默认值:off
next hop keep 开关|ibgp|ebgp
不修改 Next Hop 属性,即使应该使用自己的本地地址也保持不变。这对不转发网络流量的 BGP 发言者(路由服务器和某些路由反射器)是必要的。可对所有路由启用,或仅对从 IBGP/EBGP 邻居收到的路由启用。默认值:常规 BGP 禁用,路由服务器启用,路由反射器 ibgp
next hop self 开关|ibgp|ebgp
始终通告自己的本地地址作为下一跳。有时用于从 EBGP 传播到 IBGP 的路由(当 IGP 路由不覆盖跨 AS 链路时)。默认值:disabled
next hop address IP
指定在 Next Hop 属性中应宣告自己的哪个地址。默认:BGP 会话的源地址(如可接受)或关联接口的首选地址。
next hop prefer global|local
对于 IPv6 路由,控制优先使用全局还是链路本地 IPv6 地址作为接收路由的直接下一跳。默认值:直连模式 (EBGP) 为 global,递归模式 (IBGP) 为 local
link local next hop format native|single|double
当 BGP 会话仅使用链路本地地址建立时,BGP 实现对于如何编码下一跳有所差异。BIRD native 格式为 [zero, link-local],single 为 [link-local],double 为 [link-local, link-local]。BIRD 解码接收路由时接受所有变体,此选项控制编码格式。默认值:native
gateway direct|recursive
对于接收路由,其 gw(直接下一跳)属性从 bgp_next_hop 计算得出。此选项指定计算方式:
bgp_next_hop 中的 IP 地址,必须直接可达bgp_next_hop 中的 IP 地址进行 IGP 路由表查找来计算网关(仅一层间接)递归模式是 BGP 标准规定的行为,Direct 模式更简单,不需要路由表中的任何路由,但不能很好地处理非平凡 iBGP 设置和多跳。递归模式与排序表不兼容。默认值:直连会话 direct,多跳会话 recursive
igp table 名称
指定用作 IGP 路由表的表。此选项对每个允许的表类型允许使用一次。默认值:通道连接的主表(如符合条件)
import table 开关
BGP 导入表包含来自给定 BGP 邻居的所有接收路由(在应用 import 过滤器之前),在 BGP 术语中也称 Adj-RIB-In。BIRD BGP 默认不使用导入表——接收路由直接由 import 过滤器处理,接受的路由存入主表,其余丢弃。启用 import table 允许存储未处理的路由供后续检查,并可用于在不触发全量路由刷新的情况下重配置 import 过滤器。默认值:off
export table 开关
BGP 导出表包含发送给给定 BGP 邻居的所有路由(应用 export 过滤器后),在 BGP 术语中也称 Adj-RIB-Out。默认不使用导出表。启用后可存储经过 export 过滤处理后的路由,消除不必要的更新或撤回。默认值:off
secondary 开关
通常,如果 export 过滤器拒绝了选中的路由,则不为该网络传播任何其他路由。此选项允许依次尝试下一条路由。要求连接的路由表是排序的。默认值:off
validate 开关
对流规范通道应用验证流程(RFC 8955 第 6 节和 RFC 9117)。EBGP 应使用此项以防止外部注入恶意流规范规则;IBGP 也应使用以确保选中的流规范规则与选中的 IP 路由一致。默认值:off
base table 名称
指定用于流规范验证流程的 IP 表。该表必须启用 trie 选项。仅限流规范通道。默认值:同一 BGP 实例 ipv4/ipv6 通道的主表,如果没有则使用 master4/master6
extended next hop 开关
提供扩展以允许 IPv4 下一跳与 IPv6 前缀配合使用(反之亦然)。默认值:off
require extended next hop 开关
要求邻居必须宣告 Extended Next Hop Encoding 能力。默认值:off
add paths 开关|rx|tx
控制 ADD-PATH 协议扩展,允许向一个目的地通告多条路径。需要在 BGP 会话两端都启用(RX 和 TX 方向可分别设置)。默认值:off
require add paths 开关
要求邻居必须宣告 ADD-PATH 能力。默认值:off
aigp 开关|originate
控制 AIGP(累积 IGP 度量)属性(RFC 7311)传播。设为 originate 时不仅允许传播,还会自动为非 BGP 路由附加新的 AIGP 属性。默认值:IBGP 启用,EBGP 禁用
cost 数值
当 BGP 网关模式为 direct 时指定到 BGP 下一跳的距离。默认值:(根据会话类型而定)
运行 configure 命令并更改配置文件将触发重配置,可能导致受影响通道的重加载 (reload) 或 BGP 协议的重启 (restart)。
使用 configure soft 命令时,配置变更不触发 reload,仅记录日志建议手动 reload;仍需重启的变更仍会触发 restart。
引起 import 方向 reload 的通道选项:import、preference、gateway、next hop prefer、aigp、cost (Import 方向 reload 需要 Route Refresh 能力或 import table 选项,否则触发 restart)
引起 export 方向 reload 的通道选项:export、next hop self、next hop keep、link local next hop format、aigp、aigp originate
引起 restart 的协议选项:router id、hostname、vrf 以及大部分 BGP 特定协议选项(除 bfd、check link、各种 require_* 和 interface range 外)
引起 restart 的通道选项:table、secondary、validate、graceful restart、long lived graceful restart、next hop address、extended next hop、add paths、import table、export table、igp table、base table 等
BGP 定义了多个路由属性。部分(下表中标记 I 的)仅在内部 BGP 连接上可用,部分(标记 O 的)为可选。
bgppath bgp_path
描述按此路由转发数据包时经过的 AS 路径(AS 号序列)。在内部 BGP 中不包含本地 AS 的编号。
int bgp_local_pref [I]
Local Preference 值,用于在多条 BGP 路由之间选择(参见上文选择规则)。作为附加度量值在整个本地 AS 中传播。
int bgp_med [O]
Multiple Exit Discriminator:可选属性,用于外部(跨 AS)链路向相邻 AS 传达进入本地 AS 的最佳入口点。属性值在路由导出到外部 BGP 实例时被清零(确保不会跨 AS 传播)。可在外部 BGP 实例的 export 过滤器中设置新值。详见 RFC 4451。
enum bgp_origin
路由来源:
ORIGIN_IGP — 源自内部路由协议ORIGIN_EGP — 从 EGP 协议导入(现已过时)ORIGIN_INCOMPLETE — 来源未知ip bgp_next_hop
用于转发到该目的地的下一跳。内部 BGP 连接上,它是源路由器的地址(如果在本地 AS 内)或边界路由器的地址(数据包将通过它离开 AS,外发路由的情况下)。
void bgp_atomic_aggr [O]
可选属性,无值,仅存在即表示路由在从源到目的地的路径上由某路由器从多条路由聚合而来。
void bgp_aggregator [O]
可选属性,指定聚合多条 BGP 路由创建该路由的 BGP 路由器的 AS 号和 IP 地址。当前无法从过滤器中访问此属性。
clist bgp_community [O]
与路由关联的团体值列表。每个值为一对 16 位整数(在过滤器中表示为 pair 数据类型),第一个包含定义团体的 AS 号,第二个为每 AS 的标识符。通常用于承载策略信息(如"不要导出到美国对等体")。
eclist bgp_ext_community [O]
扩展团体值列表。与普通团体类似但范围更大(支持 4 字节 ASN)且具有包含类型字段的非平凡结构。在过滤器中表示为 ec 数据类型。
lclist bgp_large_community [O]
大型团体值列表。另一种团体变体,与普通团体行为非常相似但更大——统一的 32 位无类型三元组。在过滤器中表示为 lc 数据类型。
quad bgp_originator_id [I, O]
路由反射器在反射路由时创建,包含本地 AS 中路由原始发布者的路由器 ID。
clist bgp_cluster_list [I, O]
路由反射器的集群 ID 列表。每个路由反射器在反射路由时将其集群 ID 添加到前面。
void bgp_aigp [O]
累积 IGP 度量——穿越多个自治系统到达目的地的总距离。当前无法从过滤器中访问。
int bgp_otc [O]
定义于 RFC 9234。OTC 是标记应仅发送给客户的路由的标志。如果配置了 local role 会自动设置。
对于 BIRD 未知的属性,用户可在顶层为其编号分配名称,然后用于获取、设置(作为字节串,可传递)或取消设置该属性。注意:不能定义与 BIRD 已知属性相同编号的属性。
attribute bgp 编号bytestring名称;
protocol bgp {
local 198.51.100.14 as 65000; # 使用私有 AS 号
neighbor 198.51.100.130 as 64496; # 我们的邻居...
multihop; # ...间接连接
authentication ao; # 使用 TCP-AO 认证
keys {
key {
id 0;
secret "hello321";
algorithm hmac sha256;
preferred;
};
key {
send id 2;
recv id 1;
secret "bye123";
algorithm cmac aes128;
};
};
ipv4 {
export filter { # 使用非平凡的 export 规则
if source = RTS_STATIC then { # 仅导出静态路由
# 分配我们的团体属性
bgp_community.add((65000,64501));
# 通过两次通告本地 AS 号
# 人为增加路径长度
if bgp_path ~ [= 65000 =] then
bgp_path.prepend(65000);
accept;
}
reject;
};
import all;
next hop self; # 将本路由器作为下一跳通告
igp table myigptable4; # IPv4 下一跳的 IGP 表
igp table myigptable6; # IPv6 下一跳的 IGP 表
};
ipv6 {
export filter mylargefilter; # 使用命名过滤器
import all;
missing lladdr self;
igp table myigptable4;
igp table myigptable6;
};
ipv4 multicast {
import all;
export filter someotherfilter;
table mymulticasttable4; # 另一个 IPv4 表,专用于组播
igp table myigptable4;
};
}
译者
原文作者: <Ondrej Filip>, <Martin Mares>, <Maria Matejka>, <Ondrej Zajicek>
原文链接: https://bird.network.cz/?get_doc&v=20&f=bird-6.html#ss6.1
原文标题: 6.1 BGP
遵循协议: CC BY-NC-SA 4.0
译者: hat
翻译时间: 2026-05-01
更新时间: 2026-05-01
本文链接: https://bird.xmsl.dev/docs/user-guide/6-1-bgp.html