路由协议报文结构深度解析

各位好,我是老张。干网络安全这行十几年了,处理过的路由协议攻击案例少说也有几十起。今天咱们聊聊一个基础但极其重要的东西——报文结构。

你想想看,不懂报文结构,你怎么做攻击溯源?就像法医不懂人体解剖,那还怎么破案?说白了,报文就是路由协议的「DNA」,每一比特都藏着线索。

OSPF报文头与LSA类型分析

OSPF是我个人最常打交道的IGP协议之一。它的报文头结构其实很简洁,一共24字节。我习惯把它分成三块来看:

  • 版本号:目前主流是v2(IPv4)和v3(IPv6)
  • 类型:1-5分别代表Hello、DD、LSR、LSU、LSAck
  • 校验和:这里有个坑,我后面会讲

OSPF报文头核心字段(24字节)

偏移字段长度说明
0Version1字节2或3
1Type1字节报文类型
2Packet Length2字节含头部总长度
4Router ID4字节发送路由器标识
8Area ID4字节区域标识
12Checksum2字节整个报文校验
14AuType2字节认证类型
16Authentication8字节认证数据

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名称用途
1Area Addresses区域地址
2IS Neighbors邻居信息
128IP Internal Reachability内部IP可达性
130IP External Reachability外部IP可达性
137Dynamic 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必须全局唯一,而且两端要一致。

好了,报文结构这块就聊这么多。记住一句话:报文是路由协议的「指纹」,学会看报文,你就能在攻击溯源中占得先机。

路由协议报文结构知识体系 报文结构深度解析 OSPF报文结构 报文头(24字节) Version/Type/Length Router ID/Area ID Checksum/Auth LSA类型(1-5) Router/Network/Summary ASBR/AS External BGP报文结构 OPEN报文 Version/AS/Hold Time BGP Identifier Optional Parameters UPDATE/NOTIFICATION Withdrawn/Attributes/NLRI Error Code/Subcode/Data IS-IS TLV编码 TLV结构 Type(1字节) Length(1字节) Value(可变长度) 常见TLV类型 Area/IS Neighbors IP Reachability MD5认证 vs TCP-AO

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