摘要

  • RFC 8212 不阻止 EBGP 建连;它规定没有显式 Import Policy 时收到的路由不得进入决策,没有显式 Export Policy 时路由不得进入该邻居的 Adj-RIB-Out。
  • import 与 export 是每个已启用地址族的两个本地授权。显式 permit all 也能满足“存在政策”,所以该标准防止的是遗漏,不是错误或恶意授权。
  • 新装节点、升级节点和 insecure-mode 例外可能行为不同。可信上线必须记录有效默认值与政策版本,并证明政策前后路由、远端接收、FIB 与数据包。

午夜更换边缘设备。TCP 179 连接、OPEN capability 交换、FSM 进入 Established,计数器持续增长。FRRouting 却在缺失方向显示 (Policy)。IPv4 没有可用路由,而另一套模板继承的 IPv6 仍发送一个窄聚合。

旧习惯会把它叫作“会话坏了”。RFC 8212 更准确的描述是“授权不完整”。若为了快速恢复而全局关闭要求,或套上 permit all,就可能把有界的不可达变成无界的错误传播。

传输邻接不是路由委托

RFC 4271 把 BGP 状态机与路由信息库分开。会话可以先 Established 并交换 KEEPALIVE,路由随后才进入资格判断和传播。RFC 8212 修改的是这些后段,不是握手。

在 import 方向,UPDATE 可以已经到达 Adj-RIB-In;没有显式 Import Policy 时,它不得进入 Decision Process。抓包或 pre-policy 表可能看到路由,Loc-RIB 仍为空。“对端没发”和“本端没授权”是两种不同事实。

在 export 方向,本地 Loc-RIB 与 FIB 可以拥有正常路由,但没有 Export Policy 时,它不会进入该外部邻居的 Adj-RIB-Out。内部可转发不等于外部可达。

权限边界由此清楚:对端可以提供数据,不能强迫接收者使用;本地可以拥有路径,不能因 TCP 连通就推定可以披露。两个方向各需要一次本地决定。

两道门还要乘以地址族

Import 与 export 不是一个双边开关。运营者可以只接收 default、只发客户前缀,或者先启用 IPv6 再启用 IPv4。每个 AFI/SAFI 都有独立 attachment 与结果。

这会产生方向性故障:IPv4 import 缺失,本地收不到路由,但 export 可能正常;IPv6 export 缺失,本地能用 IPv6 路由,对端却收不到返回宣告。一个 Established 徽标抹掉了所有必要信息。

盘点必须包含 peer、VRF、两端 AS、AFI/SAFI、方向和 attachment source。peer group 可能提供一个方向,邻居级 override 又移除另一个。生成配置里存在对象,也不证明它连接到活动实例。

最小初始规格在这里表现为拒绝:共同规则只说“缺省不能成为传播”,不替运营者决定允许哪些前缀、origin、AS path、community 或商业关系。未来政策保持本地。

显式不等于安全

RFC 8212 修复遗漏,无法判断内容。显式 permit all 仍是政策。BIRD 文档也明确,在要求外部 BGP 配置 import/export 的同时,all 与 none 仍是可用的显式选择。

这不是漏洞,而是协议边界。实验环境、route server 或受控迁移可能有合理的宽政策;同一句话放在互联网 transit edge 上可能灾难性。语法不知道合同。

政策名称同样会制造假安全。route-map 可能引用空 prefix set、过期 IRR 生成物、错误 community namespace 或旧版本;它可能挂在 peer group,却被邻居 override 遮蔽。

证据应记录 resolved policy 的内容与 hash,而不只是名称。import 比较 pre-policy 输入、post-policy eligibility 与选路原因;export 比较候选、Adj-RIB-Out 与远端实收。零条路由必须有原因:政策缺失、显式拒绝,或合法政策确实没有匹配。

迁移会分裂默认值

RFC 8212 允许实现提供偏离开关。非规范性附录提出 N+1/N+2 路径:先加入 insecure-mode 参数与告警,后来才让新安装默认拒绝。经旧版本升级的实例可能保留宽松行为,干净安装则 fail closed。

同一软件版本、相似邻居配置因此会产生相反结果。复制可见配置,不会复制默认值的历史。

FRRouting 暴露 ebgp-requires-policy、关闭该要求的命令和缺失过滤器时的 (Policy)。BIRD 3.3.0 要求外部 BGP 显式配置两向政策。这些是实现证据,不是普遍保证;实际版本、启动历史、生成配置与运行值才有权威。

insecure-mode 例外必须有 owner、理由、peer/地址族范围、确切路由集、到期日与移除测试。没有期限的迁移逃生口会变成隐形架构。

挂上政策还要激活状态

新增过滤器不证明旧 UPDATE 已被重新处理。实现可能保留 pre-policy input table、请求 Route Refresh、重放缓存,或只能重置会话。RFC 2918 允许请求对端重发当前 export,但依赖 capability 与远端当前政策。

启用 import 时,要知道路由来自缓存、refresh 还是 reconnect,并在执行前预测数量与属性。启用 export 风险更大:现有 Loc-RIB 中成千上万条路由可能同时获得资格。必须先计算 Adj-RIB-Out delta,再让对端确认。

不要同时开放两向。先为两向挂显式 deny,证明“有意零授权”;再只开一个 sentinel import,最后只开一个 sentinel export。每一步都观察后再扩大。

默认拒绝只是地基

RFC 7454 描述按关系制定 prefix、AS-path 与 community 过滤;RFC 7908 分类 route leak;RFC 9234 用 Roles/OTC 使部分关系状态可机器读取;RPKI origin validation 判断 origin 授权。

它们都不能替代显式政策。origin-valid 仍可能不该接受;OTC 不定义客户的全部前缀;maximum-prefix 只限制某个计数边界后的规模。RFC 8212 的作用更小:不让缺配置自动变成许可。

第二阶收益是迫使组织为授权命名并指定 owner。第三阶风险是形式主义:团队创建万能 allow,只为让部署面板变绿,从此不再思考真实关系。

运行代码优先要求完整链:配置是意图,compiled policy 与 attachment 是执行输入,政策前后 RIB 是控制面结果,远端观察是跨界事实,FIB 与 packet 才是运行结果。

Canary 从“什么都没有”开始

选择低风险 peer 或隔离地址族。无 import/export 建立会话,证明 OPEN 与 KEEPALIVE 正常、pre-policy 可能有输入、没有 eligible route、Adj-RIB-Out 为空。

先挂显式 deny,路由数仍为零,但原因从缺省拒绝变成有意零授权,并保存政策 identity 与 activation path。

只允许一个 sentinel prefix 进入,预测属性、post-import、选路与 FIB;若声称可用,再验证 packet。然后只允许一个 sentinel prefix 发出,检查 Adj-RIB-Out 编码和对端实收。

每个地址族与方向都重复,并测试一个不匹配 route、origin 状态、relationship attribute 与 prefix-length 边界。政策的“负空间”也要证明。

回滚是撤下窄授权、确认 withdrawal、回到已知空白。全局关闭 RFC 8212 不是回滚,它把权限扩展到所有缺政策邻居。

Established 而零路由不一定是未完成基础设施。它可以精确表达:传输已存在,路由权尚未授予。最安全的系统让这句话可见、可逆、可测试,并要求更强证据才让沉默变成可达性。