01 · 验证框架:输入、术语与前置处理
1.1 输入与核心术语
AS_PATH验证(定义于draft-ietf-sidrops-aspa-verification草案,v26,2026年7月,WG Last Call)的输入有二:BGP路由的AS_PATH(按惯例写为AS_1, AS_2, …, AS_N,AS_N为起源AS,AS_1为最接近接收路由器的AS)与全网ASPA验证数据仓(由验证器从RPKI资料库构建的"每AS一张授权提供商表")。核心判定函数为attestation(x, y)("授权提供商声明"判定):
| attestation(x,y)结果 | 条件 | 语义 |
|---|---|---|
| True(授权) | 存在ASPA(x)且y∈providers(x)(含afiLimit匹配) | "x声明y是我的提供商"——该跳为合法的"客户→提供商"上坡 |
| False(反证) | 存在ASPA(x)且y∉providers(x) | "x有声明但明确不含y"——该跳不是授权的上坡 |
| Unknown(缺失) | 不存在ASPA(x) | 对x的提供商关系无任何密码学信息 |
1.2 前置处理规则
- prepending去重:AS_PATH中相邻的重复ASN(合法的长度操纵技术)在验证前折叠为单一个体,避免把同一跳的重复声明误判为多跳;
- 非常规段处理:现行草案规定,AS_PATH中含AS_SET(或AS_CONFED_SET)的路径直接判Invalid——非常规段使关系验证失去意义(RFC 6472亦建议弃用AS_SET);
- 联盟与confederation段:AS_CONFED_SEQUENCE/AS_CONFED_SET属于域内信息,不参与跨域关系验证;
- AS4重建:验证仅适用于支持4字节ASN的BGP会话;同时收到AS_PATH与AS4_PATH时,先在RFC 6793 §4.2.3重建AS_PATH后再执行验证;
- 邻居AS一致性检查:AS_PATH中最近添加的AS(透明IX场景除外)必须与BGP邻居ASN一致,否则视为Malformed并按RFC 7606 treat-as-withdraw处置——该检查可部分防御"剥离自身ASN"的泄露/操纵手法;
- 按AFI分别验证:IPv4与IPv6的AS_PATH分别套用对应的afiLimit过滤后的声明表。
02 · 三段式验证算法详解
2.1 算法直觉:合法路径的"山形"结构
在健康(无环、无隐藏关系)的客户—提供商拓扑中,一条路由从起源到接收者,其商业关系方向必然呈"上坡→(可选顶点)→下坡"的单峰结构:先沿客户→提供商链一路上行,至多到达一个拓扑顶点(该顶点可能无上游、或对顶端关系无声明),再沿提供商→客户链路一路下行。任何"先下坡又上坡"(第二上坡)都是泄露或路径操纵的结构性特征——这是整份验证算法的几何直觉。
2.2 判定步骤(概念性描述,精确算法以所锁定草案版本第6节为准)
- 完成§01的预处理(去重、分段、按AFI选表、AS4重建、邻居AS检查);
- 从起源侧逐跳计算attestation值,确定上坡的两个边界——max_up_ramp(首个“Not Provider+”出现的位置,界定上坡上界)与min_up_ramp(首个“No Attestation”(Unknown)或“Not Provider+”出现的位置,界定上坡下界);
- 对从提供商方向收到的路由,再从接收侧对称计算下坡边界(max/min_down_ramp);从客户或对等方向收到时,下坡边界为0;
- 若 max_up_ramp + max_down_ramp < N(路径存在超出授权边界的跳),输出Invalid;否则若 min_up_ramp + min_down_ramp < N(路径包含Unknown段,无法完全确认),输出Unknown;否则输出Valid。
-- 概念性伪代码(教学示意,以所锁定草案版本第6节为准)
function verify_as_path(path[], aspa_db, from_direction):
seq = reconstruct_as4_path(path) -- RFC 6793:先合并AS4_PATH
if empty(seq) or has_as_set(seq): return INVALID
if last_added_as(seq) != neighbor_asn: -- 透明IX除外
return MALFORMED -- RFC 7606 treat-as-withdraw
att[i] = attestation(seq[i], seq[i+1]) -- 从起源侧向外逐对
max_up = N; for i: if att[i]==NOT_PROVIDER_PLUS: max_up=i; break
min_up = N; for i: if att[i] in {NOT_PROVIDER_PLUS, NO_ATTESTATION}: min_up=i; break
if from_direction in {customer, peer}: max_down = min_down = 0
else: 从接收侧对称计算 max_down / min_down -- 下坡反向授权核验
if max_up + max_down < N: return INVALID
if min_up + min_down < N: return UNKNOWN
return VALID精确语义提示:“上坡True*→顶点→下坡”是教学化形态描述;草案的精确形式化采用max/min up-ramp与down-ramp边界——Unknown同时影响min边界(使路径落回Unknown)与max边界的可达性,而明确的“Not Provider+”是触发Invalid的核心信号;下坡段按客户侧反向授权核验,合法下坡的每一跳在反向核验下同样呈Provider+。实现务必以所锁定草案版本第6节算法为准。
2.3 判定示例
| AS_PATH(起源在右,→ 为从起源向外) | attestation序列 | 判定 | 解读 |
|---|---|---|---|
| ← 提供商P ← 客户C ← 起源O(纯上坡) | (O,C)True;(C,P)True | Valid | 全跳授权的纯上坡:min_up_ramp=max_up_ramp=N |
| ← 客户X ← 顶级T ← 提供商P ← 起源O(完整山谷路径) | 上坡(O,P)(P,T)均True;下坡反向核验(X,T)True | Valid | 上坡至T后下坡;下坡段按客户侧反向授权核验同样成立 |
| ← 客户X ←(T为provider-free,ASPA仅含AS0)← 提供商P ← 起源O | 上坡True,True;(T,X)为Not Provider+(AS0) | Valid | provider-free声明使顶点显式可验证——较“顶点无声明”的Unknown更优 |
| ← 客户X ←(顶点T未签任何ASPA)← 提供商P ← 起源O | 上坡(O,P)True、(P,T)True;(T,X)No Attestation | Unknown | 顶点无声明使min_up_ramp<N——落为Unknown而非Valid(过渡期常态) |
| ← 另一客户V ←(提供商C将从O学到的路由回灌给客户V)← 起源O | (O,C)True;(C,V)Not Provider+ | Invalid | 上坡中途遇明确反证(max_up_ramp<N)——典型泄露(RFC 7908类型1) |
| (AS_PATH最近添加AS与BGP邻居ASN不一致) | — | Invalid | 邻居AS一致性检查失败→Malformed,按RFC 7606 treat-as-withdraw处置 |
| ← 未知AS_2 ← 未知AS_1 ← 起源O | Unknown, Unknown | Unknown | 无任何声明,不可判定(当前全球常态) |
注:上表为教学化示例,用于说明判定逻辑;第3、4行对照体现provider-free声明(AS0)在顶点判定中的价值——这正是草案鼓励tier-1签发provider-free ASPA的原因。边界情形(单AS路径、全Unknown路径、多声明合并等)的精确定义请直接核对所锁定草案版本的第6节。
03 · 判定结果与路由策略映射
3.1 三态结果
| 结果 | 含义 | 运营建议策略 |
|---|---|---|
| Valid | 路径符合授权关系形态 | 正常采纳;可与ROV Valid联动做策略加分 |
| Invalid | 存在违反声明的路径段(泄露/操纵的强证据) | 丢弃或大幅降格;结合OTC信号与告警联动人工复核(早期部署建议先降格观察) |
| Unknown | 缺乏判定所需的ASPA声明 | 过渡期主流情形——保持采纳并记录占比,驱动覆盖率提升(见第7页降级风险与第8页灰度策略) |
3.2 关键性质辨析:False≠"一定是攻击"
常见误读澄清:草案对下坡段的核验采用客户侧反向授权——合法下坡的每一跳在反向核验下同样呈Provider+(下坡段的客户在其ASPA中声明了该提供商);“Not Provider+”出现在上坡中途(上坡尚未到顶即遇明确反证)才是Invalid的直接依据。将下坡段理解为“沿正向逐跳得到False”是阅读算法时最常见的错误,也是实现误报的重要来源。
04 · 算法演进与正确性论证
- 早期社区方案:ASPA思路于2019—2020年进入SIDR/SIDROPS讨论时,社区曾提出多种验证算法变体,在顶点处理、prepending容忍、Unknown语义、AS_SET处置等细节上存在分歧;
- 草案收敛:draft-ietf-sidrops-aspa-verification(主要作者包括Kotikalapudi Sriram等)经多轮迭代收敛为统一算法,v26(2026年7月)进入WG Last Call;
- 形式化分析:IETF第110次会议(2021年)议程收录了该验证算法正确性的形式化分析报告(IETF 110 SIDROPS议程材料,datatracker可查),从理论上论证了算法对合法路径不误判(soundness方向)与对特定操纵可检出(completeness方向)的性质;
- 出站侧验证新方向(2026):draft-zhang-sidrops-aspa-egress提出在出站eBGP方向执行ASPA验证——在泄露扩散出本AS之前于出口就地拦截,并可辅助发现本地配置与ASPA注册错误,与入站验证及RFC 9234 OTC形成互补;
- 持续修订:顶点语义、AS_SET处理、多ASPA合并规则等细节仍随草案版本微调——工程实现必须锁定所遵循的草案版本并在升级时回归测试(第8页工具适配清单)。
实现纪律建议:由于草案未定稿,建议在验证器配置中显式声明遵循的aspa-verification版本号;RIR托管服务(RIPE NCC/ARIN)与主流开源验证器(rpki-client、Routinator)会随草案演进更新,升级前应在试验环境验证"已知合法路径集"回归通过。
05 · RTR协议扩展:从验证器到路由器
现行RTR标准RFC 8210(2017年)只定义了Prefix PDU等ROV数据分发能力。为将ASPA验证数据送达路由器,SIDROPS制定了修订草案draft-ietf-sidrops-8210bis,新增ASPAs PDU:按客户AS组织其授权提供商集合(含afiLimit)下发。路由器侧缓存该数据仓,在BGP选路/策略环节对每条路由实时执行§02的形态匹配(计算为纯查表操作,转发面无密码学负担)。
| 环节 | 承担组件 | 协议/数据 |
|---|---|---|
| 关系声明 | AS持有者(经RIR托管或Krill自托管) | ASPA对象 → RIR资料库(rsync/RRDP) |
| 对象验证与建仓 | RPKI验证器(rpki-client、Routinator等) | 证书链校验、Manifest/CRL时效检查、规范化合并 |
| 数据分发 | 验证器 ↔ 路由器 | RTR v2(RFC 8210+draft-ietf-sidrops-8210bis的ASPAs PDU;8210bis已演进至v27,2026-08) |
| 路径验证执行 | 路由器(OpenBGPD 7.8+、BIRD(实现分支/近期版本)、Cisco IOS-XR EFT等) | 对每条路由的AS_PATH执行三段式形态匹配,输出Valid/Invalid/Unknown并应用策略 |
06 · 开源与厂商实现现状(截至2026年)
6.1 软件支持矩阵
| 类别 | 软件 | ASPA支持状态 |
|---|---|---|
| 验证器 (仓库→验证) | rpki-client(OpenBSD) | 2023年起支持ASPA对象验证与数据仓构建 |
| Routinator(NLnet Labs) | 支持ASPA验证与RTR扩展下发 | |
| FORT Validator等 | 后续版本加入ASPA支持 | |
| RTR分发 | RTRTR(NLnet Labs) | 支持ASPA数据中继 |
| StayRTR、rpki-prover | 社区实现,支持ASPA PDU处理 | |
| 签署侧 | RIPE NCC托管RPKI | 2025年11月26日生产上线(Dashboard管理) |
| ARIN托管RPKI | 2026年1月生产上线(含自动续期) | |
| Krill、APNIC演示实现 | 自托管签署与试验环境支持 | |
| 路由侧 (验证执行) | OpenBGPD | 7.8+支持ASPA验证 |
| BIRD | 已实现ASPA验证(实现分支/近期版本,具体形态以BIRD官方文档与发行说明为准) | |
| Cisco IOS-XR | 早期现场试验(Early Field Trial)阶段,以厂商官方发布为准 | |
| NIST BGP-SRx | 参考实现(含单元测试用例),用于测试与研究 | |
| FreeRTR | 已实现并通过草案单元测试(社区实现) |
6.2 性能与规模评估
- 验证器侧:ASPA对象总量极小(2025年底全球仅556个customer ASID,对象体积以KB计),验证开销相对既有RPKI验证几乎可忽略;主要新增工作是"每AS提供商表"的规范化合并与版本跟踪;
- RTR通道:ASPAs PDU数据量小、更新低频(关系声明远慢于ROA churn),带宽与时延压力远低于Prefix PDU全量同步;
- 路由器侧:每条路由的形态匹配为O(路径长度)的简单状态扫描,现代转发平台可忽略其开销;内存占用为一张"AS→提供商集合"映射表;
- 结论:ASPA的工程成本瓶颈不在计算与存储,而在关系声明的准确性与覆盖率(组织治理问题),这与BGPsec的成本结构形成鲜明对照。
本节参考来源(第4页)
draft-ietf-sidrops-aspa-verification(解读基准v26,2026-07-06进入WGLC;2026-08-03共识确认进入Waiting for Write-Up;最新v28,2026-08-24):datatracker.ietf.org/doc/draft-ietf-sidrops-aspa-verification。
draft-ietf-sidrops-8210bis(RTR协议修订,新增ASPAs PDU):datatracker.ietf.org/doc/draft-ietf-sidrops-8210bis;现行标准RFC 8210:rfc-editor.org/rfc/rfc8210。
IETF 110 SIDROPS会议材料《ASPA算法正确性形式化分析》(slides-110-sidrops-sriram-aspa-alg-accuracy):datatracker.ietf.org/meeting/110。
APNIC Blog《RPKI's 2025 year in review》(2026年2月,软件生态清单:Krill/Routinator/rpki-client/FORT;BIRD 2.16+、OpenBGPD 7.8+、Cisco IOS-XR EFT):blog.apnic.net。
NLnet Labs文档(Routinator/RTRTR的ASPA支持与RTR扩展说明):routinator.docs.nlnetlabs.nl;OpenBSD rpki-client/ OpenBGPD发布公告:openbsd.org。
IETF RFC 6472《Recommendation for Not Using AS_SET and AS_CONFED_SET in BGP》(2011年12月):rfc-editor.org/rfc/rfc6472。