首页/网络/BGP 与广域网速查/ESP 报文结构:SPI、序列号与 ICV
IPsec VPN60 条

ESP 报文结构:SPI、序列号与 ICV

ESP 头含 SPI 与序列号,尾部有填充与下一头部字段;完整性校验值(ICV)保护载荷完整性,序列号配合抗重放窗口。

BGP 与广域网速查网络更新于 2026-10-13

ESP 报文的组成

ESP(封装安全载荷)是 IPsec 承载业务数据的协议,IP 协议号 50。它的结构可以按「头、载荷、尾」三段来记:头部有 SPI 和序列号,SPI 与目的地址一起在接收端定位属于哪个安全联盟,序列号用于抗重放检查;中间是被加密的原始载荷,密文长度会因块加密填充而增加;尾部有填充长度、下一头部类型,最后是完整性校验值 ICV。理解这个结构对排障很有用:抓包时能看到的只有 SPI、序列号和长度,载荷是密文,而重放与校验失败的判断依据正是序列号与 ICV。

基本信息

协议号IP 协议 50
SPI32 位安全参数索引,与目的地址联合定位 SA
序列号32 位递增,配合抗重放窗口
ICV完整性校验值,覆盖载荷与报文头部字段
传输模式保留原 IP 头,仅保护载荷,常用于主机间
隧道模式整体封装新 IP 头,网关场景常用

典型使用场景

  • 抓包排障:确认是 ESP 还是被 NAT-T 封装进 UDP 4500
  • 定位重放丢弃:核对序列号是否出现回退或重复
  • 校验失败排查:ICV 校验不过多与两端参数或中间改写有关
  • 分析分片问题:隧道模式使报文变长,需评估 MTU 影响
  • 与安全审计沟通:说明可见字段与不可见字段的边界

抓包观察要点

抓包观察要点
# 观察 ESP 报文形态(Wireshark 过滤示例)
# esp || udp.port == 4500
# 关注字段:SPI、Sequence Number、报文长度是否突增
# 判断是否被 NAT-T 封装
tcpdump -ni eth0 'udp port 4500' | head -20
# 直接看裸 ESP
tcpdump -ni eth0 'proto 50' | head -20
# 设备侧查看 SA 的 SPI 与计数
show crypto ipsec sa | include spi|pkts

字段读法

字段位置作用与异常表现
SPI头部定位 SA;两端不一致则无法解密,计数不增长
序列号头部抗重放;回退或重复会被丢弃
填充尾部块加密对齐;分析长度时需扣除
下一头部尾部指明载荷类型(常见为 TCP/UDP)
ICV尾部完整性校验;算法不匹配则校验失败
存在 NAT 时裸 ESP 无法穿过地址转换,报文会被封装进 UDP 4500,此时抓包看到的是 UDP 而不是协议 50;这是判断链路是否走 NAT-T 的直接证据。
隧道模式下 ESP 会额外增加外层 IP 头与 ESP 头尾开销,计算 MTU 与 MSS 时必须把这些字节算进去,否则会出现大包不通。

易错点

  • 以为抓包能看到业务内容:ESP 载荷是密文,只能分析报文形态与计数,需靠解密或日志还原业务
  • 看到 UDP 4500 就判断一定存在 NAT:NAT-T 也会被显式启用,结论要结合两端配置与探测结果
  • 忽略序列号与重放窗口的关联:链路乱序严重时窗口过小会丢包,表现出来像丢包故障
  • 计算 MTU 时只算载荷:漏掉 ESP 头尾与填充,估算偏大导致大包被丢
  • 两端 SA 的 SPI 不一致仍继续排查应用层:先确认 SPI 是否成对,可省下大量时间

数据来源与参考

  • RFC 4303: ESP 报文格式
  • RFC 7296: SA 与 SPI
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌