IPSec VPN 原理
IPSec VPN 原理
什么是 IPSEC VPN
IPSec 全称为 Internet Protocol Security,是由 Internet Engineering Task Force (IETF) 定义的安全标准框架,通过在公网上为两个或多个私有网络之间建立 IPsec 隧道,并通过加密和验证算法保证 VPN 连接的安全。IPSEC 协议工作在 IP 层,在 IP 层对数据包进行加密和验证:
- 数据的机密性:IPSec 的发送方对发给对端的数据进行加密;
- 数据的完整性:IPSec 的接收方对接收到的数据进行验证以保证数据在传送的过程中没有被修改;
- 数据来源的认证:IPSec 接收方验证数据的起源;
- 抗重播:IPSec 的接收方可以检测并拒绝到重播的 IP 包;
SA 安全关联
SA(security association)安全关联分为两种:ISAKMP/IKE SA 和 IPsec SA。
ISAKMP/IKE SA:对等体之间的 ISAKMP/IKE SA 用于控制 IPsec 协商数据流,如协商对 IKE 数据流进行加密以及对对等体进行验证的算法,确保协商过程中的安全。
IPsec SA:IPSec SA 用于协商对等体之间真正需要通信的 IP 数据流进行加密的算法,IPSec SA 是单向的,因此至少需要两个: 一个用于入站数据流,另一个用于出站数据流。
IPSEC 安全协议
FortiGate IPSEC VPN 只使用 ESP,不支持 AH。
ESP:ESP(Encapsulating Security Payload),协议号 50,支持认证和加密功能。ESP 在每一个数据包的标准 IP 报头后面添加一个 ESP 报文头,并在数据包后面追加一个 ESP 尾(ESP Trailer 和 ESP Auth data)。
ESP 报文结构如下图:

- SPI:安全参数索引,用于标识 IPSEC SA;
- SEQUENCE NUMBER:序列号,长度 32bit,从 1 开始的递增的计数器,唯一地标识每一个数据包,用于防止重放攻击;
- INITIALIZATION VECTOR (IV):初始向量,一些算法如 AES - GCM、AES - CCM 和 ChaCha20-Poly1305,采用 IV 生成一个随机数,用作加密和解密的输入参数;
- PAYLOAD DATA:负载数据,原始包中可变长的数据内容;
- PADDING:填充字段,需要加密的明文长度(也就是 ESP 报文的结构中,IV + Payload Data + Padding + Pad Length + Next Header 的长度)必须是块长度的整数倍,事实是无法保证最后一个块的大小正好为块长度要求,因此信息必须填充至满足要求。只要是使用对称密钥的块密码工作模式,均可能需要 Padding 字段进行填充;
- PAD LENGHT:填充字段的长度,0 表示没有填充;
- NEXT HEADER:下一头部,标识 ESP 报文头后的负载类型。传输模式下,是被保护的上层协议(TCP 或 UDP)的编号;隧道模式下,是 IP 协议的编号;
- AUTHENTICATION DATA:认证数据,包含数据完整性校验值 ICV,用于接收方进行完整性校验;
ESP 报文抓包示例:

AH:AH(Authentication Header),协议号 51,只提供认证功能,不提供加密功能。
封装模式
IPSEC 隧道模式
在隧道模式下,ESP 头被插到原始 IP 头之前,重新生成一个新的报文头放到 ESP 头之前,保护 IP 头和负载。隧道模式主要应用于 VPN 网关之间或主机与 VPN 网关之间的通信,用来保护 VPN 网关后面的网络。

IPSEC 传输模式
在传输模式下,ESP 头被插入到 IP 头与传输层协议头之间,保护 TCP/UDP/ICMP 的负载。传输模式没有添加额外的 IP 头,因此原始报文中的 IP 地址在加密后报文的 IP 头中是可见的。一般用于 IPsec 加密点等于 IPsec 通信点的环境下或 GRE over IPsec 的环境中。

IKE 协议
IKE 协议与 IPSEC 的关系
因特网密钥交换 IKE(Internet Key Exchange)协议建立在 Internet 安全关联和密钥管理协议 ISAKMP 定义的框架上,是基于 UDP 的应用层协议,分 IKEv1 和 IKEv2 两个版本。它为 IPsec 协商建立 SA,并把协商好的参数交给 IPsec,IPsec 使用 IKE 建立的 SA 对 IP 报文加密或认证。

IKE 的安全机制
- DH 秘钥交换算法:DH 是一种公共密钥交换算法,它用于产生密钥材料,并通过 ISAKMP 消息在发送和接收端之间进行密钥材料交换。然后,两端各自计算出完全相同的对称密钥,该对称密钥用于计算加密和验证的密钥。DH 使用密钥组定义自己产生密钥的长度。
| DH Group | Description |
|---|---|
| 1 | More Modular Exponential (MODP) DH Group with a 768-bit modulus |
| 2 | MODP with a 1024-bit modulus |
| 5 | MODP with a 1536-bit modulus |
| 14 | MODP with a 2048-bit modulus |
| 15 | MODP with a 3027-bit modulus |
| 16 | MODP with a 4096-bit modulus |
| 17 | MODP with a 6144-bit modulus |
| 18 | MODP with a 8192-bit modulus |
| 19 | 256-bit random elliptic curve group |
| 20 | 384-bit random elliptic curve group |
| 21 | 521-bit random elliptic curve group |
| 27 | Brainpool 224-bit elliptic curve group |
| 28 | Brainpool 256-bit elliptic curve group |
| 29 | Brainpool 384-bit elliptic curve group |
| 30 | Brainpool 512-bit elliptic curve group |
| 31 | Curve25519 128-bit elliptic curve group |
身份认证
通过 IP 地址或者名称确定双方的身份,有两种身份认证方式:预共享秘钥和数字证书认证。
- 在预共享密钥认证中,通信双方采用共享的密钥对报文进行 Hash 计算,判断双方的计算结果是否相同。如果相同,则认证通过;否则认证失败。
- 在数字证书认证中,通信双方使用 CA 证书进行数字证书合法性验证,双方各有自己的公钥(网络上传输)和私钥(本地存储)。发送方对报文进行 Hash 计算,并用自己的私钥对报文计算结果进行加密,生成数字签名。接收方使用发送方的公钥对数字签名进行解密,并对报文进行 Hash 计算,判断计算结果与解密后的结果是否相同。如果相同,则认证通过;否则认证失败。
IKE 支持的认证算法有:MD5、SHA1、SHA2-256、SHA2-384、SHA2-512。(MD5 和 SHA1 认证算法不安全)
数据加密
身份数据在密钥产生之后加密传送,实现了对身份数据的保护。
IKE 支持的加密算法有:DES、3DES、AES-128、AES-192、AES-256。(DES 和 3DES 加密算法不安全)
PFS
PFS(Perfect Forward Secrecy),即完善的前向安全性,是指一个密钥被破解,并不影响其他密钥的安全性,因为这些密钥间没有派生关系。IPSec SA 的密钥是从 IKE SA 的密钥导出的,由于一个 IKE SA 协商生成一对或多对 IPSec SA,当 IKE 的密钥被窃取后,攻击者将可能收集到足够的信息来导出 IPSec SA 的密钥,PFS 通过执行一次额外的 DH 交换,保证 IPSec SA 密钥的安全。
IKEv1 秘钥协商过程
IKEv1 秘钥协商分为两个阶段:
第一阶段:通信双方协商和建立 IKE 协议本身的使用的安全通道,即建立 IKE SA。
第二阶段:利用第一阶段建立的安全通道建立一对用于数据安全传输的 IPSEC SA。
###IKEv1 第一阶段
IKEv1 第一阶段协商支持两种协商模式:主模式(Main Mode)和野蛮模式(Aggressive Mode)。

主模式
主模式包含 3 次双向交换,用到了 6 条 ISAKMP 信息。
1.第 1 和 2 个包用于安全提议交换。
a. 在第 1 个包中,发起方 SPI 设置为随机值,而响应方 SPI 设置为 0;在第 2 个数据包中,响应方 SPI 必须用新值回复,并且整个协商保持相同的 SPI 值。
b. 对 Vendor ID 进行处理,以确定对等体是否支持 NAT-T、DPD 等。
c. 协商安全协商加密和验证的算法。


2.第 3 和 4 个包用于密钥信息交换
通过 DH 公钥值和 nonce 值,两个对等体将生成一个名为 SKEYID 的种子密钥。为了不同的目的,将使用该种子密钥生成另外 3 个会话密钥:
SKEYID_d:作为阶段 2 生成 KEY 的材料;
SKEYID_a:用来 ISAKMP 包完整性用的 key;
SKEYID_e:用来加密 ISAKMP 包的 key;
nonce:随机生成的数字,用于防重放攻击。

3.第 5 和 6 个包用于身份和认证信息交换
第 5 和 6 个包是加密的,目的是确认对方的身份。如果是使用预共享密钥,那么验证包括检查双方是否有相同的预共享密钥。如果是证书,则对等体交换证书,并假设签署双方的 CA 是受信任的,则验证成功。

野蛮模式
野蛮模式只用到 3 个包。
1.第 1 个包,发起方发送安全提议、DH 公开值、临时值 (nonce),以及身份 ID 供响应方验证。

2.第 2 个包,响应方用选定提议的所有参数,DH 公开值进行应答,以及身份 ID 供发起方验证。

3.第 3 个包,发起方发送验证数据。

IKEv1 第二阶段
IKEv1 协商阶段二的目的就是建立用来安全传输数据的 IPSec SA,并为数据传输衍生出密钥。该采用快速模式(Quick Mode),使用 IKEv1 协商阶段一中生成的密钥对 ISAKMP 消息的完整性和身份进行验证,并对 ISAKMP 消息进行加密,从而保证了数据交换的安全性。
IKEv1 第二阶段有 3 个包:
1.第 1 个包,发起方发送本端的安全参数:被保护的数据流和 IPSec 安全提议等,以及身份认证信息。

2.第 2 个包,响应方发送确认的安全参数和身份认证信息并生成 IPSEC 数据传输密钥。

3.发起方发送确认信息,确认与响应方可以通信,协商结束。

IKEv2 秘钥协商过程
IKEv2 使用 2 次交换共 4 个包就可以完成一对 IPSec SA 的建立,如果建立的 IPSec SA 大于一对时,每一对 IPSec SA 只需额外增加 1 次 CREATE_CHILD_SA 交换就可以完成。IKEv2 定义了 4 种交换:初始交换(Initial Exchanges)、认证交换(IKE_AUTH)、创建子 SA 交换(Create_Child_SA Exchange)以及通知交换(Informational Exchange)。
初始交换
IKEv2 通过初始交换就可以完成第一对 IPSec SA 的协商建立。
第 1 和 2 个包,IKE_SA_INIT 交换;协商 IKE SA 加密和验证算法,交换临时随机数和 DH 交换,然后生成一个共享密钥材料,通过这个共享密钥材料可以衍生出 IPSec SA 的所有密钥。

第 3 和 4 个包,IKE_AUTH 交换;完成身份认证、对前两条信息的认证和 IPSec SA 的参数协商,第 3 和 4 个包是加密的,其中可以包含一对用于 ESP 封装的 IPSec SA。

创建子 SA 交换
当一个 IKE SA 需要创建多对 IPSEC SA 时,则创建子 SA 交换来协商后续其他的 IPSec SA。创建子 SA 交换还可以用于 IKE SA 的重协商。

通知交换
IPSEC 两端有时会传递一些控制信息,例如错误信息或者通告信息,这些信息在 IKEv2 中是通过通知交换完成的。

NAT 穿越
疑问:ESP 隧道模式默认只支持一对一 NAT 转换,不支持 PAT;ESP 传输模式不支持 NAT。如果 FortiGate 位于企业内部,运营商出口有单独的设备做 NAT,那么 IPSEC 流量如何穿越 NAT?
解决方案:
NAT-T 技术,即在 IP 和 ESP 报文之间插入一个 8 个字节 UDP 头部 (端口号默认为 4500),FortiGate 默认 enable NAT-T

NAT-T 由三部分组成:
首先是判断远程对等体是否支持 NAT-T;
其次是检测对等体之间的路径上是否有 NAT;
最后决定如何使用 UDP 封装来处理 NAT。
IKEv1 穿越 NAT
IKEv1 第一阶段协商支持两种协商模式:主模式(Main Mode)和野蛮模式(Aggressive Mode)。


主模式
第 1 和 2 个包协商是否支持 NAT-T

第 3 和 4 个包,发起方插入了两个 NAT - D 载荷。第一个 NAT - D 载荷包含 IKE 对等体的 IP 地址和端口的 Hash 值,第二个 NAT - D 载荷包含本端的 IP 地址和端口的 Hash 值。响应方也计算这两个 Hash 值,两方计算的哪个 Hash 值不相等,表明哪个设备在 NAT 网关后面。

完成 NAT-T 检测后,如果发现 NAT 网关,则后续 UDP 报文端口号修改为 4500。
当 UDP 封装的是 ISAKMP 消息,会增加一个 non-ESP marker(为 4 个值为 0 的字节),以示跟封装 ESP 报文有区别。

野蛮模式
第 1 个包,发起方在 IKE 消息中插入 Vendor ID 来告知对方自己支持 NAT 穿越。

第 2 个包,响应方确认支持 NAT-T,并携带两个 NAT - D 载荷。第一个 NAT - D 载荷包含 IKE 对等体的 IP 地址和端口的 Hash 值,第二个 NAT - D 载荷包含本端的 IP 地址和端口的 Hash 值。

第 3 个包,发起方同样携带自己的两个 NAT-T 载荷,响应方也计算这两个 Hash 值,两方计算的哪个 Hash 值不相等,表明哪个设备在 NAT 网关后面,但这个包的数据内容是加密的。完成 NAT-T 检测后,如果发现 NAT 网关,则从此 UDP 报文开始端口号修改为 4500。
当 UDP 封装的是 ISAKMP 消息,会增加一个 non-ESP marker(为 4 个值为 0 的字节),以示跟封装 ESP 报文有区别。

IKEv2 穿越 NAT
第 1 和 2 个包,在 IKE 消息中插入两个载荷,第一个载荷 NAT_DETECTION_SOURCE_IP 包含本端的 IP 地址和端口的 Hash 值,第二个载荷 NAT_DETECTION_DESTINATION_IP 包含对端的 IP 地址和端口的 Hash 值。这两个通知载荷用于检测在将要建立 IPSec 隧道的两个网关之间是否存在 NAT,如果接收到的 NAT_DETECTION_SOURCE 通知载荷没有匹配数据包 IP 头中的源 IP 和端口的 Hash 值,则说明对端位于 NAT 网关后面。如果接收到的 NAT_DETECTION_DESTINATION_IP 通知载荷没有匹配数据包 IP 头中的目的 IP 和端口的 Hash 值,则意味着本端位于 NAT 网关之后。

第 3 和 4 个包,完成 IKE_SA_INIT 后,发现 NAT 设备,后续 UDP 报文端口号修改为 4500。
当 UDP 封装的是 ISAKMP 消息,会增加一个 non-ESP marker(为 4 个值为 0 的字节),以示跟封装 ESP 报文有区别。
