路由协议报文结构深度解析
各位好,我是老张。干网络安全这行十几年了,处理过的路由协议攻击案例少说也有几十起。今天咱们聊聊一个基础但极其重要的东西——报文结构。
你想想看,不懂报文结构,你怎么做攻击溯源?就像法医不懂人体解剖,那还怎么破案?说白了,报文就是路由协议的「DNA」,每一比特都藏着线索。
OSPF报文头与LSA类型分析
OSPF是我个人最常打交道的IGP协议之一。它的报文头结构其实很简洁,一共24字节。我习惯把它分成三块来看:
- 版本号:目前主流是v2(IPv4)和v3(IPv6)
- 类型:1-5分别代表Hello、DD、LSR、LSU、LSAck
- 校验和:这里有个坑,我后面会讲
OSPF报文头核心字段(24字节)
| 偏移 | 字段 | 长度 | 说明 |
|---|---|---|---|
| 0 | Version | 1字节 | 2或3 |
| 1 | Type | 1字节 | 报文类型 |
| 2 | Packet Length | 2字节 | 含头部总长度 |
| 4 | Router ID | 4字节 | 发送路由器标识 |
| 8 | Area ID | 4字节 | 区域标识 |
| 12 | Checksum | 2字节 | 整个报文校验 |
| 14 | AuType | 2字节 | 认证类型 |
| 16 | Authentication | 8字节 | 认证数据 |
LSA类型这块,我记得刚入行时总搞混。其实核心就记住这几种:
- Type 1(Router LSA):每个路由器都会生成,描述自己的直连接口
- Type 2(Network LSA):由DR生成,描述广播网段内的所有路由器
- Type 3(Summary LSA):ABR生成,用于跨区域路由汇总
- Type 4(ASBR Summary LSA):指向ASBR的下一跳信息
- Type 5(AS External LSA):ASBR引入的外部路由
实战小技巧:我在一次溯源中发现,攻击者伪造了Type 1 LSA,把Router ID改成受害者的IP。这时候你只要对比LSA的Advertising Router和实际的Router ID,就能发现猫腻。
BGP OPEN/UPDATE/NOTIFICATION报文结构
BGP的报文结构比OSPF复杂一些。我处理过一个案例,攻击者利用BGP OPEN报文中的Hold Time字段做手脚,让邻居路由器频繁重置会话。
OPEN报文核心字段:
- Version:目前是4
- My Autonomous System:自己的AS号
- Hold Time:建议的保持时间(秒)
- BGP Identifier:Router ID
- Optional Parameters:TLV格式的可选参数
UPDATE报文是BGP的灵魂,它包含:
- Withdrawn Routes Length:撤销路由长度
- Withdrawn Routes:被撤销的前缀列表
- Total Path Attribute Length:路径属性总长度
- Path Attributes:AS_PATH、NEXT_HOP、MED等
- NLRI:新增的前缀
注意:我曾经遇到一个攻击,攻击者在UPDATE报文中插入了大量虚假的AS_PATH属性,导致路由表膨胀到内存溢出。所以检查AS_PATH的长度和AS_SEQUENCE的完整性,是溯源的关键步骤。
NOTIFICATION报文结构很简单:
- Error Code:错误大类(1-6)
- Error Subcode:具体错误原因
- Data:附加诊断信息
嗯,这里要注意,NOTIFICATION报文的Data字段经常被忽略。但我在一次溯源中,就是通过Data字段里的错误子码,锁定了攻击者伪造的UPDATE报文类型。
IS-IS TLV编码解析
IS-IS的TLV编码,说白了就是「类型-长度-值」的嵌套结构。我个人觉得它比OSPF灵活,但也更容易被利用。
常见的TLV类型:
| Type | 名称 | 用途 |
|---|---|---|
| 1 | Area Addresses | 区域地址 |
| 2 | IS Neighbors | 邻居信息 |
| 128 | IP Internal Reachability | 内部IP可达性 |
| 130 | IP External Reachability | 外部IP可达性 |
| 137 | Dynamic Hostname | 动态主机名 |
你想想看,TLV的Length字段只有1字节,最大255。如果攻击者把Length改成0或者大于实际数据长度,就会导致解析器崩溃。这就是经典的TLV长度溢出攻击。
溯源要点:检查TLV的Length字段是否与实际数据匹配。我曾经在抓包中发现一个TLV的Type=137(Dynamic Hostname),但Length=255,明显是伪造的。正常的主机名不会超过64字节。
MD5认证与TCP-AO安全机制
最后聊聊认证。MD5认证在BGP和OSPF中用了很多年,但说实话,它已经不够安全了。
MD5认证的问题:
- 密钥是明文配置的,容易被抓包获取
- MD5算法本身有碰撞风险
- 没有密钥轮换机制
TCP-AO(TCP Authentication Option)是替代方案:
- 使用HMAC算法,更安全
- 支持密钥ID和密钥轮换
- 可以防止重放攻击
我的建议:如果你还在用MD5认证,赶紧升级到TCP-AO。我在一个金融客户那里,就是因为MD5密钥被破解,导致BGP会话被劫持,路由被篡改,损失惨重。
TCP-AO的报文结构其实很简单:
- Kind:TCP选项类型(29)
- Length:总长度
- Key ID:标识使用的密钥
- MAC:消息认证码
为什么TCP-AO更安全?因为它把密钥ID和MAC绑定在一起,攻击者即使拿到了报文,也无法伪造有效的MAC。而且密钥可以定期更换,不像MD5那样一个密钥用几年。
避坑指南:我曾经遇到一个案例,客户升级到TCP-AO后,发现BGP邻居一直无法建立。排查了半天,原来是两端的Key ID不匹配。记住,Key ID必须全局唯一,而且两端要一致。
好了,报文结构这块就聊这么多。记住一句话:报文是路由协议的「指纹」,学会看报文,你就能在攻击溯源中占得先机。
公众号:蓝海资料掘金营,微信deep3321