第4章 BGP RPKI基础:RPKI架构、ROA创建、RPKI验证流程

聊到BGP安全,RPKI是个绕不开的话题。我记得几年前刚接触这个技术时,觉得它挺玄乎的——不就是给IP前缀加个数字签名吗?后来在现网踩过几次坑,才真正理解它的价值。说白了,RPKI就是给BGP路由加了一把「身份证锁」,让网络里的路由器能确认:这个前缀到底是谁的,谁有权宣告它。

4.1 RPKI架构:谁在管,怎么管

RPKI的全称是Resource Public Key Infrastructure,资源公钥基础设施。名字挺长,但结构其实不复杂。我习惯把它拆成三层来看:

  • 信任锚(Trust Anchor):全球五大RIR(Regional Internet Registry),比如APNIC、ARIN、RIPE NCC。它们是整个体系的根,负责签发最顶级的数字证书。
  • 下级CA(Certification Authority):LIR(Local Internet Registry)或ISP自己搭建的RPKI CA。它们从RIR拿到子证书,再给自己的客户签发ROA。
  • 验证器(Validator):运行在自治系统里的软件,比如Routinator、OctoRPKI。它负责从RIR拉取数据,验证证书链,生成最终的VRP(Validated ROA Payload)列表。

你想想看,这个架构其实跟HTTPS的CA体系很像。只不过HTTPS验证的是域名,RPKI验证的是IP前缀和AS号。

核心逻辑:RPKI不是让路由器直接去查数据库,而是通过验证器把信任链上的ROA数据「翻译」成路由器能理解的VRP条目。路由器只需要问验证器:「这个前缀合法吗?」就行了。

我在项目中遇到过一种情况:某运营商自己搭了RPKI CA,但证书链没配全,导致验证器一直报错。嗯,这里要注意——下级CA的证书必须由上级RIR签发,否则信任链就断了。

4.2 ROA创建:给前缀上把锁

ROA(Route Origin Authorization)是RPKI体系里最核心的物件。它本质上是一个数字签名的声明,内容很简单:

  • IP前缀:比如 203.0.113.0/24
  • AS号:比如 AS64501
  • 最大前缀长度:比如 /24(表示只能宣告/24,不能宣告更细的/25)

创建ROA的流程,我一般分四步走:

  1. 登录RIR门户:比如APNIC的MyAPNIC,或者RIPE的LIR Portal。
  2. 生成密钥对:系统会自动生成公钥和私钥,公钥上传到RIR,私钥保存在本地CA。
  3. 填写ROA信息:指定前缀、AS号、最大长度。这一步最容易出错,我后面会讲。
  4. 签名并发布:用私钥对ROA签名,然后发布到RPKI仓库(通常是RIR的RSYNC或RRDP服务器)。

我的习惯:创建ROA时,最大前缀长度我一般设成跟前缀本身一样。比如203.0.113.0/24,最大长度就写/24。为什么?因为如果你写成/28,等于允许别人宣告更细的路由,这反而增加了风险。除非你有明确需求,否则别放宽。

我曾经帮一个客户排查问题,发现他们的ROA里最大长度写成了/0。你猜怎么着?等于任何长度的子网都能通过验证。这跟没设ROA没啥区别。避坑指南:ROA里的最大长度一定要精确控制。

4.3 RPKI验证流程:路由器怎么判断

验证流程是RPKI最精彩的部分。我画个图帮你理解:

RPKI验证流程 RIR(信任锚) 签发证书 下级CA(ISP/LIR) 创建并签名ROA RPKI仓库(ROA) 拉取数据 验证器 生成VRP BGP路由器 验证结果:Valid / Invalid / NotFound

验证流程其实就三步:

  1. 路由器收到BGP更新:比如收到一条前缀203.0.113.0/24,来源AS是64501。
  2. 查询验证器:路由器向本地验证器发起查询,问「这个前缀+AS组合合法吗?」。
  3. 返回状态:验证器查VRP表,返回三种结果之一。

这三种结果,我详细说说:

状态 含义 路由器默认行为
Valid 前缀和AS匹配ROA,且前缀长度在允许范围内 正常接收,优先级不变
Invalid 前缀有ROA,但AS不匹配,或长度超出最大限制 丢弃(可配置为降低优先级)
NotFound 前缀没有对应的ROA记录 正常接收,但视为未验证

注意:Invalid状态并不等于路由一定被丢弃。很多运营商会把Invalid路由的Local Preference降低,而不是直接丢弃。为什么?因为ROA数据可能有延迟或错误,直接丢弃可能导致业务中断。我建议你初期先设为「降低优先级」,等验证稳定后再改为「丢弃」。

4.4 实战中的坑与经验

讲几个我亲身踩过的坑:

  • ROA过期:ROA有有效期,一般是1年。过期后验证器会标记为NotFound。我见过一个案例,某运营商的ROA过期了没续,结果所有前缀都变成NotFound,等于RPKI白配了。
  • 验证器同步延迟:RPKI仓库更新后,验证器需要几分钟到几小时才能同步。这期间新创建的ROA可能不生效。我建议你创建ROA后,等至少30分钟再验证。
  • 多宿主场景:如果一个前缀被多个AS宣告(比如双线接入),你需要在ROA里列出所有合法的AS号。否则其中一个AS会被标记为Invalid。

我的建议:刚开始部署RPKI时,先开启「仅报告」模式。让路由器记录Invalid路由但不丢弃。运行一周后,检查日志里有没有误判。确认无误后再开启「丢弃」模式。这样最稳妥。

嗯,RPKI这块内容其实挺深的。但只要你理解了信任链、ROA创建和验证流程这三个核心,剩下的就是实践了。我个人觉得,RPKI是BGP安全里性价比最高的技术——配置量不大,但能挡住大部分前缀劫持攻击。

最后提醒一句:RPKI不是万能的。它只能验证路由的起源AS,不能验证路径的完整性。要解决路径劫持,还得靠BGPsec。不过那是后面章节的内容了。


公众号:蓝海资料掘金营,微信deep3321