如何在Scapy中正确配置BGP AS_PATH属性构造合法Update报文
故障原因
你构造的AS_PATH属性触发Wireshark畸形告警,核心是字段赋值不符合RFC 4271的BGP协议规范:attribute字段传入None,没有填充合法的AS路径结构,同时type_flags、type_code、attr_len的传值方式也不符合要求。
AS_PATH属性的合法构造规则
AS_PATH是公认必遵传递属性,构造时必须严格遵循以下结构:
- type_flags:不能仅传字符串"Transitive"。常规场景下(属性内容长度≤255字节)值为
0x40(二进制01000000,仅Transitive标志位置1);如果属性内容长度超过255字节,需要开启扩展长度位,值为0x50。 - type_code:AS_PATH对应的固定类型码为
2,不要传入字符串值。 - attr_len:不能设为
None,需要填写后续attribute字段的实际字节长度。 - attribute:禁止传None,必须按AS路径段结构逐字节填充,每个路径段的结构为:
- 1字节段类型:常用值为
2(AS_SEQUENCE,有序AS路径序列)、1(AS_SET,无序AS集合) - 1字节段内AS计数:标记当前段包含的AS号数量
- AS号列表:每个AS号占4字节(适配当前主流的4字节AS规范,即RFC 6793;旧2字节AS环境每个AS号占2字节,需和BGP会话协商的AS能力保持一致),所有整数值均按大端序编码。
- 1字节段类型:常用值为
修正代码示例(基于Scapy框架)
以下示例构造AS_PATH为AS_SEQUENCE类型,包含65001、65002两个私有AS号的合法属性:
# 组装AS_PATH属性载荷 as_path_content = b"\x02" # 段类型为AS_SEQUENCE as_path_content += b"\x02" # 段内包含2个AS号 as_path_content += (65001).to_bytes(4, byteorder="big") as_path_content += (65002).to_bytes(4, byteorder="big") setAS = BGPPathAttr( type_flags=0x40, type_code=2, attr_len=len(as_path_content), attribute=as_path_content )
校验提示
- 如果是2字节AS的老旧组网环境,AS号转2字节大端整数即可,attr_len同步按实际长度计算。
- 开启扩展长度位(type_flags=0x50)时,长度字段会自动占2字节,Scapy框架会根据type_flags自动适配长度字段的编码宽度,无需手动处理。
- 报文构造完成后可先调用
.show()方法核对各字段的字节值,确认结构正确后再发送,Wireshark即可正常解析。
内容的提问来源于stack exchange,提问作者Luiz Buzza
相关产品推荐
相关产品推荐

