🌎 Web | IPSec 传输模式下ESP报文的收发

IPSec 全称为 Internet Protocol Security,是一种工作在 OSI 模型第三层的安全协议,其主要的功能在于认证和加密。

IPSec 的出现,为 IP 协议之前设计的一些不合理性做出了弥补,加强了网络传输的安全性。尽管现在 IPv6 已经内置了 IPSec,但是当今互联网上有着很多的设备只支持 IPv4,因此 IPSec 的存在就显得很有必要。

类型

IPSec 有两种对于数据加密的方式:传输模式和隧道模式

  • 传输模式对于 IP 协议报文的有效数据载荷进行加密
  • 隧道模式对整个 IP 报文进行加密

而报文也可以分为两种类型:

  • AH 认证头保证传输分组的完整性和可靠性
  • ESP 封装安全载荷对分组提供了源可靠性、完整性和保密性的支持

传输模式下的 ESP 报文

上面两种方式和类型可以组合成四种 IPSec 的用法,而当前主流的用法就是 ESP 和隧道模式结合使用。

但这里还是介绍在传输模式下 ESP 报文的装包和拆包的过程

装包

在传输模式下,ESP 不对整个原始的 IP 报文进行加密,只是加密其中不包括 IP 头的有效载荷部分,在这个过程中,原报文的结构会被拆解,在其有效载荷前面加上新的 ESP 协议头,再装回原来的 IP 地址,形成 IPSec 报文。

对一个 TCP 报文进行装包的具体的流程图如下:

1545048443058

首先,对于原始 IP 包,其有效载荷就是除去原来的 IP 头之后的数据,如果这个 IP 包承载的是一个 TCP 报文,那么就包括 TCP 头部信息以及其载荷数据。

(1)把这个有效载荷提取出来,并且在其末尾添加 ESP 尾部信息

1545057337137

ESP 尾部信息分为三部部分:填充、填充长度和Next header

填充和填充长度很好理解,对于一些块加密算法,对于加密的信息的大小有些严格的要求,因此我们需要在数据加密之前先填充到指定的长度,同时为了可以在解密之后可以将填充部分去除,因此还需要加入填充长度。

Next header用于表明被封装的原报文的协议类型,这个类型可以从原始 IP 头中获取。当我们装包完毕之后,IP 包的有效载荷就会变成 ESP 的标识(ESP 结构由 IP 协议号 50 标识),这样接受方才能识别出这个 IP 包的数据类型从而交给相应的上层应用处理,因此需要有另外一个地方存放原来的载荷的协议类型。而把协议类型和数据一起加密则提高了数据的安全性。因为在不知道数据类型的情况下破解加密信息的难度是大大增加的。

(2)根据 SA 给出的加密算法和密钥,对上面得到的有效载荷加 ESP 尾部这个整体进行加密封装

1545057353983

在传输数据之前,收发双方已经通过密钥交换协议 IKE 各自创建了一个 SA,标识着某个被 IPSec 保护的连接,每一个 SA 在 SAD 中都存在一个对应的条目,存放着一些信息,我们使用之前协商好的加密算法和密钥信息对上面这个整体进行加密。

(3)在加密后的密文前面加上 ESP 头

1545057399863

ESP 头包括两个内容:SPI 和顺序号

SPI全称为 Security Parameter Index(安全参数索引),用于将收到的 IPSec 数据包与其对应的 SA 进行关联。接收方根据这个索引可以知道这个报文说对应的 SA,从而选择对应的解密算法和密钥。

顺序号则是为了防止数据回放攻击,以确保能唯一区分每个新的消息,是由对应的 SA 中的顺序号计数器和顺序号溢出计数器所确定的

(4)ESP 头加上密文组成认证部分,对其进行认证,把 32 位的完整性度量值(MAC)附加在后面

1545057420028

其完整性度量算法和验证密钥都从对应的 SA 中获取,然后对 ESP 头和密文这个整体计算出 MAC

(5)最后把原始的 IP 头附加到数据包的前面,并把协议类型设置为 50(ESP)

1545057434134

经过 ESP 装包之后,IP 包的负荷数据格式已经发生了变化,而原来的 IP 协议号和现有的数据类型已经不匹配,因此要把 IP 头的协议类型设置为 ESP,这样接收者才能识别出这个 IP 包的数据类型,从而对其进行拆包

这样,我们就装好了一个 ESP 包

拆包

当我们收到一个 IP 报文之后,如果协议类型为 50,就说明这是一个 ESP 包,我们就可以使用 ESP 拆包的方法对这个 IP 报文进行处理。把这个 IP 包的有效载荷传输到上层程序进行处理

1545058767662

(1)根据 ESP 头中的内容,读取 SPI,根据索引从 SAD 中找到对应的 SA

使用 SPI 可以从 SAD 中找出对应的 SA,SA 中包含着序列号、验证密钥、验证算法、加密密钥、加密算法等信息,用于后面的验证和解密

(2)使用验证密钥和验证算法生成摘要,和附加在 IP 包末尾的完整性校验值 ICV 对比

如果生成的 ICV 和数据包末尾的 ICV 相同,那么就证明这个数据包的有效载荷数据没有经过篡改,是由 SA 中对应的可信的发送方所发送的,并且数据是完整的。

(3)检查 ESP 头中的顺序号 SEQ

为了防止数据重放攻击,我们必须确保这个数据是新鲜的,而不是被第三方截取再重新发送过来的信息,检查 SEQ 是否,判断该信息是否已经收取过了,如果已经处理过这个 IP 包,那么这次收到的包将会被丢弃。

(4)根据 SA 中的解密算法和密钥,解密数据

使用第一步中得到的解密算法和密钥,对 ESP 中已加密的部分进行解密,得到原来的 IP 数据报文ESP 尾

(5)根据 ESP 尾信息,删除填充,得到原来的 IP 数据报文

ESP 尾中存在着原来的 IP 数据报文的协议类型以及填充数据和填充长度,根据这个填充长度,删除填充的数据,我们就可以得到原来的 IP 数据报文

(6)将原 IP 头和原 IP 数据报文组合为原 IP 报文

把从 ESP 尾中的Next header数据填充到原 IP 头的协议类型中,还原出原来的 IP 头,然后和原来的 IP 数据报文合在一起,组合成原 IP 报文,最后根据得到的原 IP 报文的目的地址进行转发或者传递到上层协议

这样,我们就完成拆了一个 ESP 报文。

总结

隧道模式的安全性无疑比传输模式更好,由于时间关系(作业要求)这里只是讲了 IPSec 的传输模式的运行方式。🙈

土豪通道
0%