第三章:RPKI体系详解

好,咱们进入正题。RPKI这套体系,说白了就是给互联网路由上了一把「数字锁」。我刚开始接触它的时候,也觉得这东西有点抽象。但后来在项目中吃过亏,才真正理解它的价值。

3.1 RPKI架构:三层结构

RPKI的架构,我习惯把它理解成一个「信任金字塔」。从顶到底,层层背书。

核心架构:

  • 信任锚(Trust Anchor):IANA和五大RIR(ARIN、RIPE NCC、APNIC、LACNIC、AFRINIC)
  • 中间层(CA):各级认证机构,比如LIR、ISP
  • 叶子节点(EE证书):最终的路由起源授权(ROA)

为什么会设计成三层?你想想看,如果每个运营商都自己发证书,那谁信谁?所以必须有一个全球公认的根。IANA把IP资源分给五大RIR,RIR再分给下级,每一级都用证书签名。这样,信任就能一级级传递下去。

RPKI信任链架构 IANA(信任锚) 全球IP资源分配 五大RIR(区域互联网注册机构) ARIN | RIPE NCC | APNIC | LACNIC | AFRINIC 颁发CA证书,分配IP前缀 LIR / ISP(本地互联网注册机构) 向下级分配IP资源 签发子CA证书或EE证书 ROA(路由起源授权) 包含:前缀、AS号、最大前缀长度 由EE证书签名

我的经验:有一次帮客户排查路由劫持问题,发现是上游ISP的ROA配置错了。他们把自己的AS号写成了隔壁公司的。嗯,这种低级错误其实挺常见的。所以每次配置ROA,我都会再三核对AS号。

3.2 ROA对象:路由起源授权

ROA是RPKI体系里最核心的「产品」。它就像一张身份证,告诉全世界:「这个IP前缀,只有我指定的AS才能宣告」。

一个标准的ROA包含三个要素:

字段 说明 示例
IP前缀 你要保护的地址段 203.0.113.0/24
AS号 允许宣告该前缀的AS AS64501
最大前缀长度 允许宣告的最长掩码 /24(不能宣告更细的/25)

举个例子。假设我拥有203.0.113.0/24这个前缀,我的AS号是64501。那我就可以生成一个ROA:

# 使用rpkiclient工具生成ROA
rpkiclient roa create \
  --prefix 203.0.113.0/24 \
  --asn 64501 \
  --max-length 24 \
  --output roa.der

注意:最大前缀长度这个参数很容易被忽略。我曾经见过一个案例,某运营商把/24的ROA设成了最大长度/28,结果下游的/26路由全被标记为无效。所以,这个值一定要精确匹配你的实际路由策略。

3.3 RPKI验证流程:三步走

验证流程其实不复杂。我把它拆成三步,你跟着走一遍就明白了。

  1. 获取ROA数据:路由器从RPKI缓存服务器(Relying Party)拉取所有ROA记录
  2. 验证签名链:从ROA往上追溯,一直到信任锚,检查每一级签名是否有效
  3. 匹配路由:收到BGP路由后,检查其前缀+AS号是否匹配某个有效的ROA

验证结果有三种状态:

状态 含义 路由器行为
Valid(有效) 前缀和AS号完全匹配ROA 正常接收
Invalid(无效) 前缀匹配但AS号不匹配,或前缀长度超限 丢弃(可配置)
NotFound(未找到) 该前缀没有对应的ROA 按本地策略处理

实际配置示例(Cisco IOS-XR):

router bgp 64501
  bgp rpki server tcp 192.0.2.1 port 323
  !
  route-policy RPKI_CHECK
    if validation-state is valid then
      pass
    elseif validation-state is invalid then
      drop
    else
      pass
    endif
  end-policy
  !
  neighbor 203.0.113.1
    address-family ipv4 unicast
      route-policy RPKI_CHECK in

避坑指南:我曾经在部署RPKI时犯过一个错——把Invalid路由直接丢弃,结果导致部分合法路由被误杀。后来发现是ROA数据同步延迟导致的。建议初期先设为「标记但不丢弃」,等稳定运行一段时间后再启用丢弃策略。

3.4 验证流程的细节

你可能想问:路由器怎么知道ROA是不是真的?这里就要用到证书链验证了。

每个ROA都由一个EE证书签名。这个EE证书又由上级CA签发。CA证书再往上,一直到RIR的根证书。整个过程就像查户口——你拿着身份证,派出所查你的户籍信息,户籍信息再追溯到公安部数据库。

具体验证步骤:

  1. 路由器收到ROA后,提取EE证书
  2. 用CA的公钥验证EE证书的签名
  3. 递归验证CA证书,直到信任锚
  4. 检查证书是否过期、是否被撤销(CRL)
  5. 如果全部通过,ROA就是有效的

重要提醒:证书过期是个大坑。ROA证书通常有效期1-2年。我见过有运营商忘记续期,结果所有路由突然变成NotFound状态。建议设置日历提醒,提前30天续期。

好了,RPKI的核心内容就这些。说白了,它就是一套「谁家的孩子谁抱走」的机制。你只要把自己的ROA配好,别人想冒充你宣告路由,路由器就会直接拒绝。这就是防劫持的根本逻辑。

一句话总结:RPKI不是万能的,但没有RPKI是万万不能的。它能解决90%的路由劫持问题,剩下的10%要靠BGPsec和其他机制来补。


专注资料整理