课题研究 RPKI路由安全 子课题05 · 第4页 / 共8页
05子课题 · ASPA(RPKI V2)与路径验证演进

AS_PATH验证算法与工程实现第4页:验证算法与工程实现

本页深入draft-ietf-sidrops-aspa-verification草案的AS_PATH验证算法:attestation判定函数的三态语义、前置处理规则(prepending去重、段类型、按AFI验证)、三段式形态匹配(上坡True*→至多一个顶点Unknown→下坡False*)的完整逻辑与教学示例、Valid/Invalid/Unknown到路由策略的映射、算法从多轮社区变体讨论到草案收敛并经IETF 110会议分析验证的演进过程,以及draft-ietf-sidrops-8210bis的RTR扩展(ASPAs PDU)与开源/厂商实现现状(rpki-client、Routinator、OpenBGPD 7.8+、BIRD(实现分支)、Cisco IOS-XR EFT)的性能评估。

attestation函数prepending去重上坡/顶点/下坡Valid/Invalid/UnknownIETF 110形式化分析draft-ietf-sidrops-8210bisASPAs PDU研究状态:研究中
规范依据draft-ietf-sidrops-aspa-verification 解读基准v26(2026-07-06);最新v28(2026-08-24),已过WGLC、进入WG Consensus: Waiting for Write-Up
工程结论计算成本可忽略,瓶颈在声明覆盖率与治理
前置知识建议先读第3页理解ASPA对象结构

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节为准)

  1. 完成§01的预处理(去重、分段、按AFI选表、AS4重建、邻居AS检查);
  2. 从起源侧逐跳计算attestation值,确定上坡的两个边界——max_up_ramp(首个“Not Provider+”出现的位置,界定上坡上界)与min_up_ramp(首个“No Attestation”(Unknown)或“Not Provider+”出现的位置,界定上坡下界);
  3. 对从提供商方向收到的路由,再从接收侧对称计算下坡边界(max/min_down_ramp);从客户或对等方向收到时,下坡边界为0;
  4. 若 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)TrueValid全跳授权的纯上坡:min_up_ramp=max_up_ramp=N
← 客户X ← 顶级T ← 提供商P ← 起源O(完整山谷路径)上坡(O,P)(P,T)均True;下坡反向核验(X,T)TrueValid上坡至T后下坡;下坡段按客户侧反向授权核验同样成立
← 客户X ←(T为provider-free,ASPA仅含AS0)← 提供商P ← 起源O上坡True,True;(T,X)为Not Provider+(AS0)Validprovider-free声明使顶点显式可验证——较“顶点无声明”的Unknown更优
← 客户X ←(顶点T未签任何ASPA)← 提供商P ← 起源O上坡(O,P)True、(P,T)True;(T,X)No AttestationUnknown顶点无声明使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 ← 起源OUnknown, UnknownUnknown无任何声明,不可判定(当前全球常态)

注:上表为教学化示例,用于说明判定逻辑;第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托管RPKI2025年11月26日生产上线(Dashboard管理)
ARIN托管RPKI2026年1月生产上线(含自动续期)
Krill、APNIC演示实现自托管签署与试验环境支持
路由侧
(验证执行)
OpenBGPD7.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页)

[1]

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。

[2]

draft-ietf-sidrops-8210bis(RTR协议修订,新增ASPAs PDU):datatracker.ietf.org/doc/draft-ietf-sidrops-8210bis;现行标准RFC 8210:rfc-editor.org/rfc/rfc8210。

[3]

IETF 110 SIDROPS会议材料《ASPA算法正确性形式化分析》(slides-110-sidrops-sriram-aspa-alg-accuracy):datatracker.ietf.org/meeting/110。

[4]

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。

[5]

NLnet Labs文档(Routinator/RTRTR的ASPA支持与RTR扩展说明):routinator.docs.nlnetlabs.nl;OpenBSD rpki-client/ OpenBGPD发布公告:openbsd.org。

[6]

IETF RFC 6472《Recommendation for Not Using AS_SET and AS_CONFED_SET in BGP》(2011年12月):rfc-editor.org/rfc/rfc6472。