ESP 传输模式

装包过程

原始 IP 报文可分为 IP 头、TCP 头以及载荷数据三个部分。在 ESP 传输模式下,IPSec 报文的装包过程为:

  1. 在原 IP 报文末尾添加 ESP 尾(ESP Trailer)信息。ESP 尾包含三个部分:Padding、Pad Length 和 Next Header。
    • 由于之后的加密过程可能会采用块加密算法,所以当最后一块长度不足时就需要填充信息,这就是 Padding 部分。
    • 为方便解包时顺利找出 Padding 部分,所以在此添加填充长度,也就是 Pad Length 部分。
    • Next Header 部分则是记录被封装的原报文的协议类型(TCP)。
  2. 将 TCP 头、载荷数据以及第 1 步得到的 ESP 尾作为一个整体进行加密封装。具体的加密算法与密钥由 SA 给出。
  3. 为第 2 步得到的加密数据添加 ESP 头(ESP Header)。ESP 头包含两个部分:SPI 和 Sequence Number。
    • SPI 是 Security Parameters Index 的缩写,它是一个 32 位的数字,为连接的设备指定一个特定的 SA。接收方可通过 SPI 确定使用哪个 SA 对接收包进行安全性检查,并决定加密算法、密钥以及其它参数。
    • Sequence Number 是一个严格单调递增的数字,每发送一个包都会在原有数值上加一,因此可用于防止重放攻击。
  4. 对 ESP 头和密文作为一个整体进行验证,得到一个 32 位整数倍的完整性度量值(Integrity Check Value),并附在 ESP 报文的尾部。完整性度量算法(验证算法)以及验证密钥需要由 SA 给出。
  5. 加上原来的 IP 头并将协议类型设置为 ESP(协议号为 50),最终构成 IPSec 报文。

(图片来源:http://www.unixwiz.net/techtips/iguide-ipsec.html)

拆包过程

在 ESP 传输模式下,IPSec 报文的拆包过程为:

  1. 接收方收到 IP 报文后,发现协议类型是 ESP。首先查看 ESP 头中的 SPI,决定数据报文所对应的 SA,获得对应的模式(隧道模式或传输模式)以及安全规范。
  2. 计算 ESP 头和密文整体的摘要,与附在 ESP 报文末尾的完整性度量值进行对比,验证数据的完整性。
  3. 检查 ESP 头中的 Sequence Number,确保之前没有接收过该报文。
  4. 根据 SA 所提供的加密算法和密钥,解密被加密过的数据,得到 TCP 头、载荷数据以及 ESP 尾。
  5. 通过 ESP 尾的 Next Header 部分确定被封装的原报文的协议类型(TCP);通过 ESP 尾的 Pad Length 部分找出填充字段的长度,删除填充字段后得到 TCP 头和载荷数据,再加上原来的 IP 头(协议类型设置为 TCP)就得到原来的 IP 报文了。
  6. 根据得到的原 IP 报文的目的地址进行转发。

Updated: