IPSec 解密
IPSec 解密
加密 IPSec 报文类型
IKE 协商阶段
- IKE 协商阶段,部分 IKE 报文会被加密:
- IKEv1:
- 主模式(Main):Phase 1 第 5、6 个包,Phase 2 全部报文。
- 野蛮模式(Aggressive):Phase 1 第 3 个包,Phase 2 全部报文。
- IKEv2:
- IKE_AUTH 阶段的全部报文。
- CREATE_CHILD_SA 的全部报文。
- IKEv1:
- 报文封装格式(默认端口):
- 没有 NAT - T:以上报文为 UDP 500 封装。
- 有 NAT - T:以上报文为 UDP 4500 封装。
- 如果在 config system settings 下修改了 ike-port 为非 500,例如修改为 5555,不论有没有 NAT - T,IKE 协商报文全部用 UDP 5555 来封装。
- 不仅包含 IKE 协商报文,IPSec 协商成功后或协商中发送的被加密的 Information 报文也属于此类型。
- 当遇到 IKE 协商失败的情况时,如果 IKE Debug 无法判断具体的原因,可能需要解密 IKE 报文来进行判断。
IPSec 业务阶段
- IPSec 业务阶段,所有的业务流量会被 ESP 封装并加密。
- 报文封装格式:
- 没有 NAT - T:所有的加密报文为 IP Protocol 50 的 ESP 包。
- 有 NAT - T:所有的加密报文为 UDP 4500 封装(默认端口)的 ESP 包。
- 如果在 config system settings 下修改了 ike-port 为非 500,例如修改为 5555:
- 没有 NAT - T,所有的加密报文为 IP Protocol 50 的 ESP 包。
- 有 NAT - T:所有的加密报文为 UDP 5555 封装的 ESP 包。
- 当遇到 IPSec 隧道两端内网的 PC 无法互相通信时,在 FortiGate 上抓取明文,报文都已送入隧道接口,但不确定 ESP 报文是否正确发出和接收,此时可以抓取 ESP 并解密后判断业务流量丢失是发生在 FortiGate 还是外部网络。
ESP 解密步骤
关闭 FortiGate IPSec 一阶段配置中的 npu-offload(VM 虚机不需要执行此步骤),否则抓出的 ESP 包解密后无法看到正确的明文。
重要
执行此操作后,IPSec 隧道会新进行协商,且之后 IPSec 业务流量无法被 NP 加速,请在非业务窗口期执行。
或不执行此步,使用中间可抓包的设备(如交换机的端口镜像)执行抓包操作。
config vpn ipsec phase1-interface edit "to_Home_WAN1" set npu-offload disable next end执行如下
get vpn ipsec tunnel name <Tunnel_name>命令收集当前 IPSec 隧道的解密信息:
- local-gateway:本地 IPSec 加密点 IP 为 172.22.6.128
- remote-gateway:对端 IPSec 加密点 123.112.241.12
- inbound(解密方向):
- SPI:ae302828
- enc:解密算法为 AES - CBC,解密密钥为 c868e83ee8db83545caa8ba5934d4e87b74d33fb340de74d48f093a6a270237e
- auth:验证算法为 sha256,验证密钥为 25bdd6f80db24fd2712eaa5b7246ec9855c97a00abf5e621b6fd5a3e7b4709e5
- outbound(加密方向):
- SPI:4906cc41
- enc:解密算法为 AES - CBC,解密密钥为 b5905acef4a4406e49579e6d21e3ba5b04570d29b4c26b63fcf98092e12db42f
- auth:验证算法为 sha256,验证密钥为 a47b7d28ac667c874487bd2c894a6f4c98f078ea336125d615474295b8fc7cac
以上密钥信息也可以通过
diagnose debug application ike -1的输出结果中找到。FortiGate # diagnose debug application ike -1 FortiGate # diagnose debug enable ...... ike 0:to_Home_WAN1:221:to_Home_WAN1:18115: IPsec SA dec spi ae302828 key 32:C868E83EE8DB83545CAA8BA5934D4E87B74D33FB340DE74D48F093A6A270237E auth 32:25BDD6F80DB24FD2712EAA5B7246EC9855C97A00ABF5E621B6FD5A3E7B4709E5 ike 0:to_Home_WAN1:221:to_Home_WAN1:18115: IPsec SA enc spi 4906cc41 key 32:B5905ACEF4A4406E49579E6D21E3BA5B04570D29B4C26B63FCF98092E12DB42F auth 32:A47B7D28AC667C874487BD2C894A6F4C98F078EA336125D615474295B8FC7CAC ike 0:to_Home_WAN1:221:to_Home_WAN1:18115: added IPsec SA: SPIs=ae302828/4906cc41 ike 0:to_Home_WAN1: HA send IKE connection add 172.22.6.128->123.112.241.12 ......在 IPSec 通讯接口上抓取 ESP 包:
- 没有 NAT - T:抓取 IP Protocol 50 的报文。
- 有 NAT - T:抓取 UDP 4500 的报文(默认端口,如果在 config system settings 下修改了 ike-port,则抓取 UDP 对应的端口号,详见 VPN 技术 → IPSec VPN → 点到点 VPN → 修改 IPSec 协商端口章节)。
这里我们以有 NAT - T 环境为例,在 ESP 报文的出接口 wan1 上抓取 UDP 4500 的 ESP 加密报文,如果没有 NAT - T,则抓取 IP Protocol 50 的报文(GUI 方式抓包方法详见 故障排查 → Sniffer 工具 → 通过 GUI 界面抓包章节)。
重要
也可以在 CLI 下使用 sniffer 抓取格式 6 的 ESP 报文,再转换为 Wireshark 可以打开的格式,详见如下章节:故障排查 → Sniffer 工具 → 使用 wireshark 打开抓包文件。

执行两个 IPSec 站点之间的流量访问后,停止抓包后下载抓包文件,使用 Wireshark 打开下载的抓包文件,右键点击任意一个 ESP 报文,依次选择“协议首选项 → Encapsulating Security Payload → ESP SAs...”。

点击左下角的➕,分别新建 outbound 方向和 Inbound 方向的 SA,根据步骤 2 或 3 收集到的网关地址、SPI、算法及密钥信息,填入相应的配置中,填写完成后,点击 OK 按钮。


- 所有的 SPI、加密密钥、验证密钥填入时前边都要加入字符 0x,如 outbound 方向的 SPI 应填写为 0x4906cc41。
- 加密算法和验证算法根据步骤 2 或 3 收集到的算法选择,这里选择为 AES - CBC [RFC3602] 和 HMAC-SHA-256-128 [RFC4868]。
此时即可以看到 ESP 中加密的明文内容。

注意事项
如果在
config system settings下修改了 ike-port,且存在 NAT - T 环境,则抓取 ESP 报文时过滤 UDP 端口为设置的 ike-port 端口号(详见 VPN 技术 → IPSec VPN → 点到点 VPN → 修改 IPSec 协商端口章节),如下所示,将两端 FortiGate 的 ike-port 均修改为 5555。config system settings set ike-port 5555 endESP 报文抓取后并使用 Wireshark 打开,由于 ESP 报文被 UDP 5555 封装,Wireshark 无法直接解析出这是 ESP 报文,而是识别为其他协议。这时我们需要右键点击抓到的 UDP 5555 报文,选择“Decode As...”按钮。

在弹出的“Decode As...”窗口中,选择 UDP 5555 的当前列为“UDPENCAP”,即 UDP 封装的 ESP。

再次查看抓到的 ESP 包,Wireshark 可以解析到 ESP 包头,随后继续使用本章节介绍的 ESP 解密方法进行解密即可。

IKE 解密步骤
IKEv1
抓取 IKE 报文不需要关闭 npu-offload。首先在 IKE 协商前开启抓包,这里我们以有 NAT - T + IKEv1 主模式的环境为例,抓取 UDP 500 或 UDP 4500 的数据包。如果没有 NAT - T,则只需抓取 UDP 500 的数据包(GUI 方式抓包方法详见 故障排查 → Sniffer 工具 → 通过 GUI 界面抓包章节)。
重要
也可以在 CLI 下使用 sniffer 抓取格式 6 的 IKE 报文,再转换为 Wireshark 可以打开的格式,详见如下章节:故障排查 → Sniffer 工具 → 使用 wireshark 打开抓包文件。

发起 IKE 协商或重协商,并保存抓取的 IKE 协商报文(ISAKMP)。
协商完成后,在 FortiGate 上执行
get vpn ike gateway <tunnel_name>获取 IKE 密钥信息,需要获取 2 个如下信息。
- 发起方的 SPI(Cookie):这个值从“id/spi”项的值中“/”前边的 16 进制字符获取,此例中为 7992f75f885621d0(发起方的 Cookie 永远在“/”符号之前)。
- key:54e29ac67129db6d96c7e03b20b877f2bdb4b15288826e8e13cb202b0bb2cccf(需要将中间的“-”字符删除)。
以上解密材料也可以通过
diagnose debug application ike -1的协商过程输出结果中找到()。FortiGate # diagnose debug application ike -1 FortiGate # diagnose debug enable ...... ike 0:to_Home_WAN1:291: ISAKMP SA 7992f75f885621d0/f522761ae47783ad key 32:54E29AC67129DB6D96C7E03B20B877F2BDB4B15288826E8E13CB202B0BB2CCCF ......使用 Wireshark 打开步骤 2 中抓取的 IKE 协商报文(ISAKMP)。可以看到 IKEv1 主模式从第 5 个报文开始加密。右键点击任意一个 ISAKMP 报文,依次选择“协议首选项 → Internet Security Association and Key Management Protocol → IKEv1 Decryption Table...”。

在弹出的“IKEv1 Decryption Table”窗口中,点击左下角的➕按钮,在“Initiator's COOKIE”中填写步骤 3 或 4 获取的发起方的 SPI(Cookie):7992f75f885621d0;在“Encryption Key”中填写步骤 3 或 4 获取的 key 54e29ac67129db6d96c7e03b20b877f2bdb4b15288826e8e13cb202b0bb2cccf。随后点击 OK 按钮。

此时即可以看到 IKEv1 协商报文中加密的明文内容。

IKEv2
抓取 IKE 报文不需要关闭 npu-offload。首先在 IKE 协商前开启抓包,这里我们以有 NAT - T + IKEv2 的环境为例,抓取 UDP 500 或 UDP 4500 的数据包。如果没有 NAT - T,则只需抓取 UDP 500 的数据包(GUI 方式抓包方法详见 故障排查 → Sniffer 工具 → 通过 GUI 界面抓包章节)。
重要
也可以在 CLI 下使用 sniffer 抓取格式 6 的 IKE 报文,再转换为 Wireshark 可以打开的格式,详见如下章节:故障排查 → Sniffer 工具 → 使用 wireshark 打开抓包文件。

发起 IKE 协商或重协商,并保存抓取的 IKE 协商报文(ISAKMP)。
协商完成后,在 FortiGate 上执行
get vpn ike gateway <Tunnel_name>获取 IKE 密钥信息,需要获取 8 个如下信息。
- 发起方的 SPI(Cookie):这个值从“id/spi”项的值中“/”前边的 16 进制字符获取,此例中为 9b81bb2ff4687f35(发起方的 Cookie 永远在“/”符号之前)。
- 响应方的 SPI(Cookie):这个值从“id/spi”项的值中“/”后边的 16 进制字符获取,此例中为 c589483b12220768(响应方的 Cookie 永远在“/”符号之后)。
- 加密算法:从“proposal”项中获取,此例为 AES-128。
- 验证算法:从“proposal”项中获取,此例为 SHA-256。
- SK_ei:44655c0119f850aa413ac8a3382e9cf1(需要将中间的“-”字符删除)。
- SK_er:85b64b08dd028d1d-3142238395fcdb00(需要将中间的“-”字符删除)。
- SK_ai:b416e2d3d84af464966a40d04798a805eac288448d2940d2f56f42ef13c5c7af(需要将中间的“-”字符删除)。
- SK_ar:cb2308de4db789ea2ced21363bf1cc3fd3fa379a1391a7f430376dd12c06ca87(需要将中间的“-”字符删除)。
以上解密材料也可以通过
diagnose debug application ike -1的协商过程输出结果中找到()。FortiGate # diagnose debug application ike -1 FortiGate # diagnose debug enable ...... ike 0: comes 123.112.242.243:500->172.22.6.128:500,ifindex=5,vrf=0.... ike 0: IKEv2 exchange=SA_INIT_RESPONSE id=9b81bb2ff4687f35/c589483b12220768 len=432 ...... ike 0:to_Home_WAN1:297: matched proposal id 1 ike 0:to_Home_WAN1:297: proposal id = 1: ike 0:to_Home_WAN1:297: protocol = IKEv2: ike 0:to_Home_WAN1:297: encapsulation = IKEv2/none ike 0:to_Home_WAN1:297: type=ENCR, val=AES_CBC (key_len = 128) ike 0:to_Home_WAN1:297: type=INTEGR, val=AUTH_HMAC_SHA2_256_128 ike 0:to_Home_WAN1:297: type=PRF, val=PRF_HMAC_SHA2_256 ike 0:to_Home_WAN1:297: type=DH_GROUP, val=MODP2048. ike 0:to_Home_WAN1:297: lifetime=86400 ...... ike 0:to_Home_WAN1:297: IKE SA 9b81bb2ff4687f35/c589483b12220768 SK_ei 16:44655C0119F850AA413AC8A3382E9CF1 ike 0:to_Home_WAN1:297: IKE SA 9b81bb2ff4687f35/c589483b12220768 SK_er 16:85B64B08DD028D1D3142238395FCDB00 ike 0:to_Home_WAN1:297: IKE SA 9b81bb2ff4687f35/c589483b12220768 SK_ai 32:B416E2D3D84AF464966A40D04798A805EAC288448D2940D2F56F42EF13C5C7AF ike 0:to_Home_WAN1:297: IKE SA 9b81bb2ff4687f35/c589483b12220768 SK_ar 32:CB2308DE4DB789EA2CED21363BF1CC3FD3FA379A1391A7F430376DD12C06CA87 ......使用 Wireshark 打开步骤 2 中抓取的 IKE 协商报文(ISAKMP)。可以看到 IKEv2 从 IKE_AUTH Initiator Request 报文开始加密。右键点击任意一个 ISAKMP 报文,依次选择“协议首选项 → Internet Security Association and Key Management Protocol → IKEv2 Decryption Table...”。

在弹出的“IKEv2 Decryption Table”窗口中,点击左下角的➕按钮,依次填写步骤 3 或 4 获取的解密材料信息。随后点击 OK 按钮。


此时即可以看到 IKEv2 协商报文中加密的明文内容。

注意事项
如果在
config system settings下修改了 ike-port,无论是否存在 NAT - T 环境,抓取 IKE 协商报文时要过滤 UDP 对应设置的 ike-port 端口号(详见 VPN 技术 → IPSec VPN → 点到点 VPN → 修改 IPSec 协商端口章节),如下所示,将两端 FortiGate 的 ike-port 均修改为 5555,所有的 IKE 协商包和 Information 报文会被 UDP 5555 封装。config system settings set ike-port 5555 endIKE 报文抓取后并使用 Wireshark 打开,由于 IKE 报文被 UDP 5555 封装,Wireshark 无法直接解析出这是 ISAKMP 报文,而是识别为其他协议。这时我们需要右键点击抓到的 UDP 5555 报文,选择“Decode As...”按钮。

在弹出的“Decode As...”窗口中,选择 UDP 5555 的“当前”列为“UDPENCAP”,然后点击 OK 按钮后(注意在修改了 ike-port 后,这里要选择 UDPENCAP,而不是 ISAKMP)。

可以看到 Wireshark 可以解析到 IKEv1 和 IKEv2 的 ISAKMP 协商报文。随后继续使用本章节介绍的 IKE 解密方法进行解密即可。
IKEv1:

IKEv2:
