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: