第三章: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再分给下级,每一级都用证书签名。这样,信任就能一级级传递下去。
我的经验:有一次帮客户排查路由劫持问题,发现是上游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验证流程:三步走
验证流程其实不复杂。我把它拆成三步,你跟着走一遍就明白了。
- 获取ROA数据:路由器从RPKI缓存服务器(Relying Party)拉取所有ROA记录
- 验证签名链:从ROA往上追溯,一直到信任锚,检查每一级签名是否有效
- 匹配路由:收到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的根证书。整个过程就像查户口——你拿着身份证,派出所查你的户籍信息,户籍信息再追溯到公安部数据库。
具体验证步骤:
- 路由器收到ROA后,提取EE证书
- 用CA的公钥验证EE证书的签名
- 递归验证CA证书,直到信任锚
- 检查证书是否过期、是否被撤销(CRL)
- 如果全部通过,ROA就是有效的
重要提醒:证书过期是个大坑。ROA证书通常有效期1-2年。我见过有运营商忘记续期,结果所有路由突然变成NotFound状态。建议设置日历提醒,提前30天续期。
好了,RPKI的核心内容就这些。说白了,它就是一套「谁家的孩子谁抱走」的机制。你只要把自己的ROA配好,别人想冒充你宣告路由,路由器就会直接拒绝。这就是防劫持的根本逻辑。
一句话总结:RPKI不是万能的,但没有RPKI是万万不能的。它能解决90%的路由劫持问题,剩下的10%要靠BGPsec和其他机制来补。