3、BGP安全基础:RPKI(资源公钥基础设施)原理、ROA(路由起源授权)创建

聊BGP安全,绕不开RPKI。说实话,我入行那会儿,BGP基本是裸奔状态。谁声明一个前缀,全网就信了。后来出了几次大事故,大家才意识到——BGP的信任模型,说白了就是「你说啥我信啥」,这太危险了。

RPKI的出现,就是为了给BGP加上一把锁。它解决的核心问题只有一个:这个AS,到底有没有权利宣告这个IP前缀?

核心概念一句话:RPKI = 用PKI(公钥基础设施)的思路,给IP地址和AS号码发「身份证」。

3.1 RPKI的原理:谁授权了谁?

你想想看,互联网上的IP地址是谁管的?IANA分给RIR(比如APNIC、ARIN),RIR再分给ISP或企业。这个分配链,天然就是一个树状结构。

RPKI就是把这个分配链,用数字证书的形式固化下来。每个层级都签发证书,证明「我把这段IP分给了你」。最终,你拿到IP后,可以签发一个叫ROA的东西,告诉全世界:「我AS 12345,有权宣告203.0.113.0/24」

我在项目中遇到过一件事:某客户突然发现自己的前缀在海外被劫持了。查了半天,是上游运营商误宣告了更具体的子网。如果当时有RPKI验证,路由器直接就拒收那条路由了,根本不会传到骨干网。

我的习惯:每次拿到新的IP段,第一件事就是去RIR门户创建ROA。别等出事了再补,那时候已经晚了。

3.2 ROA(路由起源授权)是什么?

ROA就是一个签名的JSON对象。它包含三个关键信息:

  • AS号码:谁有权宣告?
  • IP前缀:宣告哪个段?
  • 最大前缀长度:允许细分到多细?

举个例子。你拥有203.0.113.0/24,只允许AS 12345宣告。你可以设置最大长度为24,意思是「只能宣告/24,不能拆成/25或更小」。如果你允许客户做子网,可以设成/28。

我曾经踩过的坑:最大前缀长度设得太宽松。比如/24设成了/32,结果下游有人宣告了单个IP的路由,导致全网路由表膨胀。后来我严格限制:非必要不设超过/24的粒度。

3.3 创建ROA的实操步骤

不同RIR的操作界面略有差异,但逻辑完全一样。我以APNIC为例,讲一下流程:

  1. 登录RIR的门户(比如APNIC的MyAPNIC)
  2. 进入「Resource Management」→「Route Management」
  3. 选择「Create ROA」
  4. 填写AS号、前缀、最大长度
  5. 确认后,系统会用你的私钥签名
  6. ROA发布到RPKI仓库(RIR自动处理)

嗯,这里要注意:签名用的是你在RIR注册时生成的密钥对。如果你换了路由器或重新生成了密钥,记得更新。

3.4 RPKI的验证流程

当路由器收到一条BGP路由时,如果启用了RPKI验证,它会做三件事:

验证结果 含义 我建议的处理方式
Valid 有对应的ROA,且AS匹配 正常接受
Invalid 有ROA,但AS不匹配,或前缀超出范围 直接丢弃(我一般设local-pref 0)
NotFound 没有找到对应的ROA 按本地策略处理(我建议接受,但标记低优先级)

说白了,RPKI不是强制性的。它只提供验证信息,最终决策权在你手里。但我个人习惯:Invalid的路由一律拒收。NotFound的可以收,但优先级降低。

3.5 用SVG画一张RPKI验证流程图

下面这张图,展示了从ROA创建到BGP验证的完整链路:

RPKI验证流程 RIR(APNIC/ARIN等) 签发证书 RPKI证书 创建 ROA对象 发布到仓库 RPKI验证点 同步ROA数据 BGP路由器 RPKI验证决策 Valid 接受路由 Invalid 丢弃路由 NotFound 按本地策略

3.6 部署RPKI的注意事项

最后聊几个实战中容易忽略的点:

  • ROA不是实时生效的:RIR的RPKI仓库有缓存,一般几分钟到几小时不等。别刚创建完就急着验证。
  • 别忘了更新:如果你换了上游AS,或者重新分配了子网,旧的ROA要删除或修改。我见过有人换了运营商,ROA里还是老AS号,结果路由全变Invalid了。
  • 验证器要冗余:RPKI验证点建议部署两个以上,避免单点故障。我一般用Routinator搭配Fort,一个挂了另一个顶上。

一个小技巧:在创建ROA时,最大前缀长度设成你实际会宣告的最小粒度。比如你只打算宣告/24,就别设/28。这样可以防止别人用更具体的路由劫持你。

好了,RPKI和ROA的基础就这些。说白了,它就是个「谁有权宣告什么」的数据库。你只要把ROA创建好,剩下的交给路由器去验证就行。下一节我们会聊如何在实际网络中部署RPKI验证器,以及如何跟现网BGP策略做集成。


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