4. BGPsec协议:给BGP路由装上数字签名
聊完了RPKI,咱们得进入更硬核的部分了——BGPsec。说实话,我第一次接触BGPsec的时候,心里想的是:「这不就是给路由更新加个签名吗?能有多复杂?」后来真在实验室搭环境测试,才发现坑不少。今天我就把BGPsec的设计思路、签名机制,以及它和RPKI到底怎么配合,一次性讲清楚。
4.1 BGPsec的设计目标
BGPsec要解决什么问题?说白了,就是防止有人伪造路由。你想想看,传统BGP协议里,一个路由器收到一条路由更新,它根本没法验证这条路由是不是真的来自声称的AS。这就是BGP劫持的根源。
BGPsec的设计目标很明确:
- 路径真实性验证:确保每条路由的AS_PATH是真实的,没有被篡改
- 源AS验证:确认路由的起源AS确实是该前缀的合法拥有者
- 防重放攻击:防止攻击者截获合法的路由更新后重复发送
- 增量部署友好:不能要求全网同时升级,得支持逐步过渡
嗯,这里要注意一点:BGPsec并不加密路由内容,它只做签名验证。路由信息本身还是明文传输的。我见过有人误以为BGPsec是加密协议,其实不是。
4.2 路径签名机制
BGPsec的签名机制,我习惯把它叫做「洋葱签名」——每一层AS都在前一层的基础上加上自己的签名。咱们一步步拆解:
4.2.1 签名流程
假设AS 1要宣告一个前缀,经过AS 2、AS 3到达AS 4。签名过程是这样的:
- AS 1(起源AS):用自己的私钥对前缀+AS 1进行签名,生成签名S1
- AS 2:收到后,验证S1有效,然后用自己的私钥对前缀+AS 1+AS 2进行签名,生成S2
- AS 3:验证S2有效,签名前缀+AS 1+AS 2+AS 3,生成S3
- AS 4:收到后,依次验证S3、S2、S1,全部通过才接受路由
你看,每一跳都叠加了一个签名。攻击者如果想插入一个假的AS,他必须拥有那个AS的私钥——这在理论上是不可能的。
4.2.2 签名数据结构
BGPsec在BGP UPDATE消息中新增了一个可选路径属性,叫BGPsec_Path。这个属性里包含一个签名列表,每个签名对应路径中的一跳。具体结构如下:
BGPsec_Path {
Version: 1,
Segment List [
{
AS Number: 1,
pCount: 1,
Signature: [签名数据]
},
{
AS Number: 2,
pCount: 1,
Signature: [签名数据]
}
]
}
每个Segment里的pCount字段表示AS在路径中出现的次数,用来处理AS_SET的情况。这个设计挺巧妙的,我一开始没理解,后来才明白是为了兼容某些特殊场景。
4.2.3 验证过程
验证的时候,接收路由器会做这几件事:
- 检查BGPsec_Path里的AS序列是否与AS_PATH一致
- 用每个AS的公钥验证对应的签名
- 确认签名中的前缀与UPDATE消息中的NLRI一致
- 检查时间戳,防止重放攻击
全部通过,路由才被接受。任何一个环节失败,整条路由就被丢弃。
4.3 BGPsec与RPKI的关系
很多人搞不清BGPsec和RPKI的区别。我打个比方你就明白了:
- RPKI 是「身份证」——它告诉你某个前缀归哪个AS所有
- BGPsec 是「行程记录」——它告诉你这条路由经过了哪些AS
两者是互补关系,不是替代关系。具体来说:
| 特性 | RPKI | BGPsec |
|---|---|---|
| 验证对象 | 前缀与起源AS的绑定关系 | 整个AS_PATH的真实性 |
| 依赖资源 | ROA(路由起源授权) | 路由器证书(Router Cert) |
| 保护范围 | 仅第一跳(起源AS) | 整条路径(所有跳) |
| 部署难度 | 较低,只需配置ROA | 较高,需要全网升级 |
| 当前普及度 | 较高,主流运营商已部署 | 较低,仍在推广阶段 |
在实际部署中,我建议的顺序是:先上RPKI,再考虑BGPsec。为什么?因为RPKI部署成本低,能解决80%的劫持问题(起源劫持)。BGPsec解决的是剩下的20%(路径劫持),但部署代价大得多。
4.4 知识体系总览
下面这张图把BGPsec的核心逻辑串起来了,我画的时候特意把RPKI的关系也标了出来:
这张图把BGPsec的三个核心模块串起来了。你从左往右看,设计目标决定了签名机制怎么实现,而签名机制又需要和RPKI配合才能发挥最大作用。我个人觉得,理解这三者的关系,比死记硬背协议细节更重要。
好了,BGPsec的核心内容就这些。记住一句话:BGPsec不是银弹,但它和RPKI配合,是目前最靠谱的路由安全方案。下一节咱们聊聊实际部署中的那些坑,我踩过的坑可不少。