摘要

  • BMP 以结构化快照和增量记录取代脆弱的 CLI 抓取,但每条流只代表特定 router、instance、peer、address family、RIB 阶段与报告模式。
  • Route Monitoring 可能压缩中间状态;Route Mirroring 能保留原始 PDU,却可能 sampling、丢消息并消耗路由资源;Loc-RIB 可能经过过滤,也仍不等于 FIB。
  • 可靠结论必须记录观察授权与丢失状态,保护敏感路由数据,并把策略前、策略后、选中、出口、硬件编程和实测结果分别佐证。

一次 route leak 复盘中,dashboard 给出三项“确定事实”:异常 prefix 到达边界 router;import policy 接受了它;同一路由随后发给 customer。团队据此修改 filter。

数小时后,时间线被推翻。第一项来自 pre-policy Adj-RIB-In,只能说明 peer 曾发送,包括后来被拒绝的 routes。第二项来自 filtered Loc-RIB,恰好没有相关 VRF。第三项根据 peer-group label 推测出口,而非观察目标 customer session 的 post-policy Adj-RIB-Out。三条 BMP 记录都是真的;把它们连成因果链的关系是假的。

这就是 BGP Monitoring Protocol 内部的证据权威问题。RFC 7854 的目的,是让 operator 和 researcher 不再靠 screen scraping 获取 router RIB,而能持续接收 route state、peer lifecycle 与 statistics。BMP 在 TCP 上把信息从被监测 router 送向一个或多个 station。

规范同时划出明确边界:BMP 不是 routing protocol。Station 观察路由,不通过 BMP 成为改变 reachability 的 peer。所有选项由被监测 router 配置,station 不向 router 发送 BMP message。这是一种有效的 minimum initial specification:提供共同观测格式,却不让中央 collector 获得选路权。

“观察”并非一个表面。RFC 4271 把信息分为不同阶段。Pre-policy Adj-RIB-In 是 peer 广告但尚未经本地 policy 处理的内容。Post-policy Adj-RIB-In 是 import filter 与 attribute 修改之后、Decision Process 之前的集合。Loc-RIB 是 BGP 选中的 routes。Adj-RIB-Out 则面向具体 peer,代表待广告的结果。

这些对象构成证据阶梯。Prefix 出现在 pre-policy input,只证明某个 session epoch 内收到了 advertisement。它不证明 policy 接受、best-path 选中、next hop 可递归、FIB 安装、向下游发出或数据包实际使用。每向上一步,都需要新的证据。

BMP 的基础消息族帮助重建这条链。Peer Up 和 Peer Down 描述 BGP session 生命期与 OPEN information;Initiation 说明被监测系统;Termination 说明 BMP session 结束;Statistics Report 提供 counters 和 gauges;Route Monitoring 携带状态;Route Mirroring 可携带逐字节收到的 BGP message,包括用于 RFC 7606 错误诊断的 malformed PDU。

普通 Route Monitoring 首先为每个受监测 peer 发送配置范围内的 snapshot,随后发送增量 advertisement 和 withdrawal。初始 dump 没有强制 route 顺序,完成时以该 peer 的 End-of-RIB marker 收口。

但快照不是在冻结的世界生成。Router 扫描初始 table 时,增量变化同时发生。若一个 prefix 先被 dump,随后 withdraw,collector 必须删除;若 withdraw 先到而 dump 尚未扫到该 prefix,collector 可能收到一个从未存过对象的撤回,并安全忽略。Collector correctness 本质上也是 streaming database correctness。

EOR 只证明初始 epoch 完成,不证明此后永远完整。后续 BMP transport gap、producer queue overflow、station restart、identity collision 或 decode failure 都会让 replica 变旧。Dashboard 若显示“已同步”,必须同时说明最后完整 epoch 与此后所有 discontinuities。

Route Monitoring 面向状态,不一定忠于 wire。Router 在生成 RM 前可能已对一个 prefix 收到多次变化;RFC 7854 允许只送最后状态,即 state compression。这能控制流量并保护 routing work,却无法回答每个中间顺序或 flap 的取证问题。

生成的 UPDATE 也可能因 implementation 的 attribute encoding 而不同于 peer 原始 PDU。Timestamp 可能为零,精度取决于实现。Collector ingest time 只说明 station 收到的时刻,不能冒充 peer reception、policy evaluation、selection、FIB programming 或首个受影响 packet 的时间。

Route Mirroring 是另一种证人。它可以逐字节复制收到的 PDU,并捕获被 treat-as-withdraw 的错误消息。若调查依赖精确 bytes 与中间顺序,它比 RM 更合适。

但 mirroring 不等于 lossless。RFC 7854 允许 sampling 或 lossless 模式,并定义 Messages Lost information code。它还警告 full fidelity 可能需要无界 buffer,耗尽 router resource,干扰 BGP UPDATE 收发,甚至拖慢 convergence。观测系统不能为了记录事故而制造事故。

因此模式选择是一项明确权衡。RM 以较低成本维护最终状态,放弃部分过程;mirroring 保存更多历史,代价显著。Policy-state reconstruction、malformed-PDU forensics 与长期 capacity monitoring 应各选合适模式,而不是因为 collector storage 便宜就全网打开镜像。

丢失证明要覆盖两端。Producer 侧记录 queue depth、compression、drop 与 session lifecycle;transport 侧记录 reset 和 stall;collector 侧记录 ingest sequence、decode failure、backpressure、storage commit 与 replay watermark。若两台 station 共享同一个 producer queue 或同一 parser defect,它们不是独立证人。

RFC 7854 以 Adj-RIB-In 为核心,用 L flag 区分 pre-policy 与 post-policy。这个 flag 改变 claim:前者说明“对方说了什么”,后者说明“本地 import 后剩下什么”。Policy audit 必须在同一 peer、AFI/SAFI 与 epoch 对照两者,不能拿不同阶段的 count 随意相减。

RFC 8671 将 BMP 扩展到 Adj-RIB-Out,并用 O flag 标识 output。Post-policy Adj-RIB-Out 必须向 receiver 表达经过 export filter、修改与 transmission-time attributes 后实际发给 peer 的内容。对于 egress policy 结论,它是最强的 BMP 证人。

Pre-policy Adj-RIB-Out 回答的是另一个问题:在 export policy 之前,按照该 peering type 哪些 routes 有资格进入候选。它不一定等于完整 Loc-RIB。IBGP、RR client、EBGP、confederation、route server 的 eligibility 都不同。

有些 mandatory attributes 在发送时才形成;pre-policy 阶段的 next hop 可能为零、空或 provisional。把它当作 wire-complete UPDATE,会创造虚假差异,甚至验证一条从未发出的消息。

正确 audit 是 scoped diff。对同一 peer、address family 与稳定 epoch,比较 pre/post-policy Adj-RIB-Out,用 active policy 解释每个删除与 attribute change;重要边界还应以 receiver-side view 佐证。“wholesale group 没问题”不是证据,除非每个有例外的 peer 都在覆盖范围内。

Peer group 与 update group 是 implementation efficiency,不是每个成员实际收到内容的真相。Member 可能有不同的组策略继承、per-neighbor exception 或 capability 差异。type=wholesale 之类 Admin Label 也是本地 metadata,不是通用 relationship fact。

RFC 9069 增加直接 Loc-RIB monitoring。此前若通过另一台 BGP router 的接收视图推断目标 Loc-RIB,会引入 export policy、aggregation、attribute transformation 与 identity correlation 错误。直接发送 selected state 让问题更清楚。

为此它定义 Peer Type 3,表示 Loc-RIB instance 而非真实 remote peer。Distinguisher、router ID 与 VRF/table name 用来识别实例,capability 由模拟 Peer Up 表达。Collector 必须把它当成显式 namespace,不能把不同 router 上都叫 global 的表混在一起。

Loc-RIB 可以在发往 station 前过滤。例如只暴露 EBGP-selected routes,省略 IGP 或 private VRF。RFC 9069 要求 filtered view 设置 F flag。这个 flag 把“所有选中路由”改成“授权暴露的选中路由子集”。

过滤本身可能是正确的 privacy、scale 和 separation-of-duty 控制。失败发生在 F flag、filter contract 或 coverage statement 丢失之后:consumer 把 absence 当成 nonexistence。

Loc-RIB monitoring 同样可能 state-compress。RFC 9069 举例:一秒内五次 Loc-RIB 变化可以只发送最终一次。Granularity 由 sender implementation 决定。因此 quiet feed 可能表示 input churn 未改变 best path、selection changes 被压缩、reporting stalled,或真的没有变化。需要其他信号区分。

最重要的是 Loc-RIB 不等于 FIB。它表示 BGP Decision Process 选中的 routes,包括 local origin 与 redistributed routes。Next hop 仍可能 recursion failure;hardware 可能安装更少 ECMP member;line card 可能 lag;tunnel、PBR 或 protection state 可能改变 packet behavior。BMP 没有把 control-plane selection 变成 forwarding proof。

两个方向都容易误判。巨大的 Adj-RIB-In churn 可能不改变 Loc-RIB,也没有服务影响;一次 Loc-RIB change 可能触发海量 FIB rewrite,也可能因为新旧 path 递归到同一 adjacency 而没有硬件变化。风险评估需要 event correlation,不能用 route count 替代。

2026 年 5 月发布的 RFC 9972 把 statistics 扩展到 pre/post-policy input、Loc-RIB 与 pre/post-policy output。它加入 route counts、accepted/rejected、damping、limit、licence 与 RPKI validation 等 gauges,并明确不同 type 只适用于特定 RIB stage。

更丰富的数字不会取代 route-level evidence。Gauge 是报告时刻的值,不是 event ledger。有些 type 只应在 feature enabled 时生成;schedule 和 threshold 由实现决定。一个从未出现的 counter 可能意味着零、unsupported、disabled、suppressed、delayed 或 lost。

RFC 9972 还拒绝一个方便假设:global gauge 与各 AFI/SAFI 之和可能因 race 或 partial failure 不相等。Producer 与 collector 可以检查并告警,但不得假设严格依赖或中断协议。差异是 investigation signal,不能静默“修正”。

Gauge 可能因 manual clear 或 overflow reset,双方必须记录 discontinuity。在 GR/LLGR 的关键阶段,producer 可降低采样、buffer 或暂停某些 reporting,把资源优先留给 convergence。事故期间图表更安静,可能只是 telemetry 主动让路。

当前产品文档体现这种资源契约。Cisco IOS XE 2026 年 4 月更新的文档说明 multiple stations、initial-refresh pacing、buffer 与 delay;IOS XR 在明确平台与 release 上支持同时 pre/post-policy 与 Loc-RIB,并暴露 advertisement/scan intervals;Junos 提供 station memory limit 与 management routing instance 选择。

这些命令不是跨平台共同语义。Chassis、release、AFI/SAFI、storage mode 与 scanner 实现决定实际输出。Inventory 必须记录 observed capability,不能因同一网络另一台设备支持就推定全部支持。

Security 直接影响证据质量。Full RIB 可能暴露 private L3VPN reachability、peer structure、attributes 与 policy effects。对照 pre/post-policy 甚至能推断 import rules。BMP station account 可能看到比多数 router admin 更完整的 routing intent。

RFC 7854 指出,没有 mutual authentication,攻击者可伪装 router 投入 false data,或伪装 station 读取 routes;没有 confidentiality,流量可被窃听或篡改。风险存在时建议 IPsec tunnel mode with pre-shared keys。TCP 本身既不提供 identity,也不提供 secrecy。

现代控制还需要 network placement、authenticated endpoint inventory、encryption、tenant separation、least privilege、retention 与 tamper-evident storage。必须有 revocation:撤销一个 station 的权利不应关闭 BGP,也不应破坏其他授权方已保留的证据。

第一项生产 artefact 是 observation-entitlement matrix。按 router、instance、peer、AFI/SAFI、station 记录 pre/post input、pre/post output、Loc-RIB、RM、mirroring 与 stats 是否启用;同时记录 L/O/F、filter version、cadence、compression、buffer ceiling 与 owner。

第二项是 replica-health ledger:BMP TCP epoch、Peer Up/Down、每源 initial EOR、last source timestamp 与精度、producer queue、Messages Lost、gauge discontinuity、collector gap、decode error 与 storage watermark。Connected 只是其中一个字段。

第三项是 sentinel prefixes 的 policy-stage diff:收到前、import 后、候选与 winner、pre-export eligibility、post-export message、receiver observation。每个 transition 绑定 policy version、decision reason 与 accountable owner。

第四项跨越 plane boundary。对 selected next hop 做 recursion,检查 FIB/ASIC adjacency,验证 expected egress,观察 flow 或 packet,并检查 reverse path。BMP-selected route 与 packet path 不一致时,divergence 才是 finding;dashboard 无权宣布 packet 错了。

Rollout 从少量 peers 与 address families 开始。测试 accepted/rejected route、attribute rewrite、best-path change、export suppression、peer flap、BMP flap、station backpressure、queue loss、filtered Loc-RIB、zero timestamp、counter reset 与 collector restart。比较各模式开关前后的 CPU、memory、convergence 和 update latency。

Rollback 要与 routing 独立。降低 scan rate、关闭 mirroring、收窄 filter 或 revoke collector 不应 reset BGP session。Operator 必须预测哪些证据会消失,并在 dashboard 上留下明确 coverage gap,而不是一张静默空图。

权力应分离。Routing team 管 policy;platform team 管 producer capacity;telemetry team 管 transport 与 parsing;security 管 disclosure 与 integrity;incident reviewer 决定证词的适用范围;service owner 验证 forwarding。Collector operator 不能同时定义 feed、隐藏 gap 并自行认证结论。

Lu Heng 的 minimum initial specification 适合 BMP 的最佳形态:共同格式保持薄且 deterministic,不把 route choice 委托给 station。Localized future decision 留在 operator 手中,通过 stage selection、filter、cadence、station choice 与 revocation 落实。新 RFC 或 dashboard field 只有在 deployed producer 与 collector 正确实现后才成为 operational reality。

Running-code primacy 则规定证据层级。Configuration 说明应观测什么;BMP record 说明某一 control-plane stage 报告了什么;collector database 说明它保存了什么;Loc-RIB 说明 BGP 选中了什么;FIB 说明硬件编程了什么;packet 说明实际发生了什么。低层证据不能借用高层证据的权威。

Practical data sovereignty 不只是拥有 collector,而是控制哪些 routes 离开哪些 router、谁能关联这些数据、保留多久、如何发现篡改、如何导出,以及能否在不求助 vendor 或 monitoring provider 的情况下终止访问。

BMP 可以成为极强的证人:它能展示 policy 前后、精确出口效果、malformed PDU、selected state 与 routing pressure。它的价值来自对自身管辖范围的诚实。

监测器看见了一条路由。负责任的问题是:哪条路由、哪个阶段、哪个 instance、经过怎样的压缩或丢失、受哪个 filter 约束,又由什么 forwarding evidence 佐证?

来源