ESP 传输模式
装包过程
原始 IP 报文可分为 IP 头、TCP 头以及载荷数据三个部分。在 ESP 传输模式下,IPSec 报文的装包过程为:
-
在原 IP 报文末尾添加 ESP 尾(ESP Trailer)信息。ESP 尾包含三个部分:Padding、Pad Length 和 Next Header。
-
由于之后的加密过程可能会采用块加密算法,所以当最后一块长度不足时就需要填充信息,这就是 Padding 部分。
-
为方便解包时顺利找出 Padding 部分,所以在此添加填充长度,也就是 Pad Length 部分。
-
Next Header 部分则是记录被封装的原报文的协议类型(TCP)。
-
-
将 TCP 头、载荷数据以及第 1 步得到的 ESP 尾作为一个整体进行加密封装。具体的加密算法与密钥由 SA 给出。
-
为第 2 步得到的加密数据添加 ESP 头(ESP Header)。ESP 头包含两个部分:SPI 和 Sequence Number。
-
SPI 是 Security Parameters Index 的缩写,它是一个 32 位的数字,为连接的设备指定一个特定的 SA。接收方可通过 SPI 确定使用哪个 SA 对接收包进行安全性检查,并决定加密算法、密钥以及其它参数。
-
Sequence Number 是一个严格单调递增的数字,每发送一个包都会在原有数值上加一,因此可用于防止重放攻击。
-
-
对 ESP 头和密文作为一个整体进行验证,得到一个 32 位整数倍的完整性度量值(Integrity Check Value),并附在 ESP 报文的尾部。完整性度量算法(验证算法)以及验证密钥需要由 SA 给出。
-
加上原来的 IP 头并将协议类型设置为 ESP(协议号为 50),最终构成 IPSec 报文。
(图片来源:http://www.unixwiz.net/techtips/iguide-ipsec.html)
拆包过程
在 ESP 传输模式下,IPSec 报文的拆包过程为:
-
接收方收到 IP 报文后,发现协议类型是 ESP。首先查看 ESP 头中的 SPI,决定数据报文所对应的 SA,获得对应的模式(隧道模式或传输模式)以及安全规范。
-
计算 ESP 头和密文整体的摘要,与附在 ESP 报文末尾的完整性度量值进行对比,验证数据的完整性。
-
检查 ESP 头中的 Sequence Number,确保之前没有接收过该报文。
-
根据 SA 所提供的加密算法和密钥,解密被加密过的数据,得到 TCP 头、载荷数据以及 ESP 尾。
-
通过 ESP 尾的 Next Header 部分确定被封装的原报文的协议类型(TCP);通过 ESP 尾的 Pad Length 部分找出填充字段的长度,删除填充字段后得到 TCP 头和载荷数据,再加上原来的 IP 头(协议类型设置为 TCP)就得到原来的 IP 报文了。
-
根据得到的原 IP 报文的目的地址进行转发。