IKE 分片
IKE 分片
功能简介
IPSec 协商阶段使用 UDP 封装 IKE 报文。当使用较大的证书时,UDP 封装后的 IKE 报文(主模式第 5、6 个包,野蛮模式第 1、2 个包,IKEv2)可能会出现 UDP/IP 分片,某些 ISP 或中间安全设备可能将 IKE 分片丢弃,导致 IPSec 无法协商成功。
对于大多数配置,当中间设备丢弃包含较大证书的 IKE 分片而导致 IPSec 协商失败时,开启 IKE Fragmentation 可以解决此问题。
相关信息
IKE Fragmentation 只影响 IKE 协商报文,不处理 ESP 业务流量分片。ESP 相关分片问题请参考 VPN → IPSec VPN → IPSec VPN 排错 → ESP 分片丢包章节。
IKEv1 分片
FortiGate 只会在以下条件同时满足的情况下,对 IKEv1 报文进行预分片:先分片后封装 ISAKMP,保证封装 ISAKMP 后的 IKE 报文小于 576 Bytes。
phase1-interface中的配置包含set fragmentation enable。- IKE 报文封装 IKE 后超过最小 Internet MTU,IPv4 为 576 Bytes,IPv6 为 1280 Bytes。
- 这个 IKE 报文处于重传(retransmit)状态。
默认情况下,IKE Fragmentation 功能是开启的。如果关闭该功能,则 IPSec 不对 IKE 报文进行 IKE 层分片,IKE 报文从物理口发出时,根据物理口 MTU 进行普通 IP 分片。
config vpn ipsec phase1-interface
edit "ToR2"
set fragmentation [enable | disable]
next
endIKEv2 分片
在 IKEv2 协商中,RFC 7383 要求 IKEv2 每一个分片都必须单独进行加密和验证。
IKEv2 通过在 IKE_SA_INIT 报文中的 Notify Payload 携带 IKEV2_FRAGMENTATION_SUPPORTED 来通告和协商 IKEv2 分片能力。如果双方都支持 IKEV2_FRAGMENTATION_SUPPORTED,FortiGate 会直接使用配置的 fragmentation-mtu 对后续 IKEv2 报文进行预分片,不需要像 IKEv1 一样等待重传(retransmit)状态。
FortiGate 需要为每一个发出的 IKEv2 报文保留一份加密前的 IKEv2 Payload,并且只会在以下条件同时满足的情况下,对 IKEv2 报文进行分片:
phase1-interface中的配置包含set fragmentation enable。- 未加密的 IKEv2 Payload 超过了设置的 MTU 值,该值在
phase1-interface中设置,默认 1200。 - 对端发送的 IKE_SA_INIT 报文中,Notify Payload 携带
IKEV2_FRAGMENTATION_SUPPORTED。
config vpn ipsec phase1-interface
edit "ToR2"
set ike-version 2
set fragmentation enable
set fragmentation-mtu [500-16000]
next
end网络拓扑

基础配置
FW1
R1-FG1101E # show vpn ipsec phase1-interface ToR2
config vpn ipsec phase1-interface
edit "ToR2"
set interface "port16"
set authmethod signature
set peertype any
set passive-mode enable
set proposal aes128-sha256
set fragmentation enable
set remote-gw 100.0.3.2
set certificate "R1-FG1101E_FW1"
next
endFW2
R2-FG1101E # show vpn ipsec phase1-interface ToR1
config vpn ipsec phase1-interface
edit "ToR1"
set interface "port16"
set authmethod signature
set peertype any
set proposal aes128-sha256
set fragmentation enable
set remote-gw 100.0.0.2
set certificate "R2-F1101E_FW2"
next
end测试过程
IKEv1
使用 OpenSSL 证书服务器为 FW1 和 FW2 分别颁发 IPSec 证书,密钥长度为 4096 Bits,并导入 FW1 和 FW2,同时导入 CA 证书。FW1 和 FW2 的 IPSec 认证使用证书认证(主模式),并引用各自被颁发的证书。
查看 FW1 和 FW2 的一阶段状态。
FW1:
R1-FG1101E # diagnose vpn ike gateway list vd: root/0 name: ToR2 version: 1 interface: port16 39 addr: 100.0.0.2:500 -> 100.0.3.2:500 created: 355s ago peer-id: C = CN, ST = Haidian, L = Beijing, O = TAC, OU = Fortinet, CN = fw2.summerice2019.com, emailAddress = bbai@fortinet.com peer-id-auth: yes IKE SA: created 1/1 established 1/1 time 10/10/10 ms IPsec SA: created 0/0 id/spi: 269 efdc3e0b977466ff/bd316a8dff131e02 direction: initiator status: established 355-355s ago = 10ms proposal: aes128-sha256 key: 6fb1d2a827b06bfe-61e30fcf2684a052 lifetime/rekey: 86400/85744 DPD sent/recv: 00000000/00000000 peer-id: C = CN, ST = Haidian, L = Beijing, O = TAC, OU = Fortinet, CN = fw2.summerice2019.com, emailAddress = bbai@fortinet.comFW2:
R2-FG1101E # diagnose vpn ike gateway list vd: root/0 name: ToR1 version: 1 interface: port16 39 addr: 100.0.3.2:500 -> 100.0.0.2:500 created: 3556s ago peer-id: C = CN, ST = Haidian, L = Beijing, O = TAC, OU = Fortinet, CN = R1-FG1101E.summerice2019.com, emailAddress = bbai@fortinet.com peer-id-auth: yes IKE SA: created 1/1 established 1/1 time 10/10/10 ms IPsec SA: created 1/1 established 1/1 time 0/0/0 ms id/spi: 69 efdc3e0b977466ff/bd316a8dff131e02 direction: responder status: established 3556-3556s ago = 10ms proposal: aes128-sha256 key: 6fb1d2a827b06bfe-61e30fcf2684a052 lifetime/rekey: 86400/82573 DPD sent/recv: 00000000/00000000 peer-id: C = CN, ST = Haidian, L = Beijing, O = TAC, OU = Fortinet, CN = R1-FG1101E.summerice2019.com, emailAddress = bbai@fortinet.com
在中间设备 Router 上抓取 FW1 和 FW2 的 ISAKMP 协商报文:
格式 4 抓包,可以看到主模式的第 5、6 个包(包含证书)根据 FW1、FW2 出接口的 MTU = 1500 被分别分成了 3 片,总大小(不含 IP 头长度)为
1480 + 1480 + 436 = 3396 Bytes、1480 + 1480 + 388 = 3348 Bytes。RACK1-FG601E # diagnose sniffer packet any 'host 100.0.3.2' 4 interfaces=[any] filters=[host 100.0.3.2] 49.437037 port7 in 100.0.0.2.500 -> 100.0.3.2.500: udp 332 49.437042 port8 out 100.0.0.2.500 -> 100.0.3.2.500: udp 332 49.437145 port8 in 100.0.3.2.500 -> 100.0.0.2.500: udp 192 49.437148 port7 out 100.0.3.2.500 -> 100.0.0.2.500: udp 192 49.437241 port7 in 100.0.0.2.500 -> 100.0.3.2.500: udp 508 49.437243 port8 out 100.0.0.2.500 -> 100.0.3.2.500: udp 508 49.437327 port8 in 100.0.3.2.500 -> 100.0.0.2.500: udp 513 49.437329 port7 out 100.0.3.2.500 -> 100.0.0.2.500: udp 513 49.444845 port7 in 100.0.0.2.500 -> 100.0.3.2.500: udp 3388 (frag 24504:1480@0+) 49.444858 port7 in 100.0.0.2 -> 100.0.3.2: ip-proto-17 (frag 24504:1480@1480+) 49.444860 port7 in 100.0.0.2 -> 100.0.3.2: ip-proto-17 (frag 24504:436@2960) 49.444867 port8 out 100.0.0.2.500 -> 100.0.3.2.500: udp 3388 (frag 24504:1480@0+) 49.444869 port8 out 100.0.0.2 -> 100.0.3.2: ip-proto-17 (frag 24504:1480@1480+) 49.444872 port8 out 100.0.0.2 -> 100.0.3.2: ip-proto-17 (frag 24504:436@2960) 49.451532 port8 in 100.0.3.2.500 -> 100.0.0.2.500: udp 3340 (frag 42137:1480@0+) 49.451545 port8 in 100.0.3.2 -> 100.0.0.2: ip-proto-17 (frag 42137:1480@1480+) 49.451546 port8 in 100.0.3.2 -> 100.0.0.2: ip-proto-17 (frag 42137:388@2960) 49.451551 port7 out 100.0.3.2.500 -> 100.0.0.2.500: udp 3340 (frag 42137:1480@0+) 49.451553 port7 out 100.0.3.2 -> 100.0.0.2: ip-proto-17 (frag 42137:1480@1480+) 49.451555 port7 out 100.0.3.2 -> 100.0.0.2: ip-proto-17 (frag 42137:388@2960)格式 6 抓包,可以看到 FW1 先执行了 IKE 封装,再根据出接口的 MTU = 1500 执行 IP 分片。

原始报文文件:IKE_Fragment.pcapng。
在中间设备 Router 的 port7(针对 FW1 到 FW2 的方向)下开启丢弃分片包功能,使 FW1 发送的主模式第 5 个包被丢弃并进入重传状态,进而触发 FW1 的 IKE Fragmentation。
config system interface edit "port7" set drop-fragment enable next end再次在中间设备 Router 上抓取 FW1 和 FW2 的 ISAKMP 协商报文:
格式 4 抓包,可以看到 FW1 发出的主模式第 5 个包(包含证书)根据 FW1 出接口的 MTU = 1500 被分成了 3 片,总大小(不含 IP Header)为
1480 + 1480 + 436 = 3396 Bytes。由于 Router 的 port7 开启了分片丢弃,这三个分片未被转发到 port8。FW1 的 IKE 协商进入重传状态后触发 IKE Fragmentation,按照 Internet MTU = 576 对第 5 个包进行预分片。此时会先分片,再封装 ISAKMP Header;抓包中显示的 UDP 长度 544 和 376 不包含 IP Header 和 UDP Header,总长度(不含 IP Header)为544 * 6 + 376 + 8(UDP Header) * 7 = 3696。RACK1-FG601E # diagnose sniffer packet any 'host 100.0.3.2' 4 interfaces=[any] filters=[host 100.0.3.2] 19.622150 port7 in 100.0.0.2.500 -> 100.0.3.2.500: udp 332 19.622157 port8 out 100.0.0.2.500 -> 100.0.3.2.500: udp 332 19.622252 port8 in 100.0.3.2.500 -> 100.0.0.2.500: udp 192 19.623133 port7 out 100.0.3.2.500 -> 100.0.0.2.500: udp 192 19.623227 port7 in 100.0.0.2.500 -> 100.0.3.2.500: udp 508 19.623230 port8 out 100.0.0.2.500 -> 100.0.3.2.500: udp 508 19.623306 port8 in 100.0.3.2.500 -> 100.0.0.2.500: udp 513 19.623308 port7 out 100.0.3.2.500 -> 100.0.0.2.500: udp 513 19.630961 port7 in 100.0.0.2.500 -> 100.0.3.2.500: udp 3388 (frag 24507:1480@0+) 19.630973 port7 in 100.0.0.2 -> 100.0.3.2: ip-proto-17 (frag 24507:1480@1480+) 19.630975 port7 in 100.0.0.2 -> 100.0.3.2: ip-proto-17 (frag 24507:436@2960) 22.617820 port8 in 100.0.3.2.500 -> 100.0.0.2.500: udp 513 22.617824 port7 out 100.0.3.2.500 -> 100.0.0.2.500: udp 513 22.617908 port7 in 100.0.0.2.500 -> 100.0.3.2.500: udp 544 22.617911 port8 out 100.0.0.2.500 -> 100.0.3.2.500: udp 544 22.617913 port7 in 100.0.0.2.500 -> 100.0.3.2.500: udp 544 22.617915 port8 out 100.0.0.2.500 -> 100.0.3.2.500: udp 544 22.617918 port7 in 100.0.0.2.500 -> 100.0.3.2.500: udp 544 22.617920 port8 out 100.0.0.2.500 -> 100.0.3.2.500: udp 544 22.617922 port7 in 100.0.0.2.500 -> 100.0.3.2.500: udp 544 22.617924 port8 out 100.0.0.2.500 -> 100.0.3.2.500: udp 544 22.617929 port7 in 100.0.0.2.500 -> 100.0.3.2.500: udp 544 22.617931 port8 out 100.0.0.2.500 -> 100.0.3.2.500: udp 544 22.617933 port7 in 100.0.0.2.500 -> 100.0.3.2.500: udp 544 22.617935 port8 out 100.0.0.2.500 -> 100.0.3.2.500: udp 544 22.617936 port7 in 100.0.0.2.500 -> 100.0.3.2.500: udp 376 22.617938 port8 out 100.0.0.2.500 -> 100.0.3.2.500: udp 376 22.624409 port8 in 100.0.3.2.500 -> 100.0.0.2.500: udp 3340 (frag 42163:1480@0+) 22.624420 port8 in 100.0.3.2 -> 100.0.0.2: ip-proto-17 (frag 42163:1480@1480+) 22.624422 port8 in 100.0.3.2 -> 100.0.0.2: ip-proto-17 (frag 42163:388@2960) 22.624428 port7 out 100.0.3.2.500 -> 100.0.0.2.500: udp 3340 (frag 42163:1480@0+) 22.624430 port7 out 100.0.3.2 -> 100.0.0.2: ip-proto-17 (frag 42163:1480@1480+) 22.624433 port7 out 100.0.3.2 -> 100.0.0.2: ip-proto-17 (frag 42163:388@2960)
提示
FW2 到 FW1 的方向没有丢弃分片包的动作,所以 FW2 发给 FW1 的 IKE 报文仍然按照原始分片方式,先封装 IKE,再根据出接口 MTU 进行 IP 分片。这说明 IKE Fragmentation 不需要协商,可以单方向生效。
格式 6 抓包,可以看到 IKE Fragmentation 执行的是先分片后封装 IKE。每个包都有 ISAKMP 封装,并包含 Fragmentation Payload,用于标识该 IKE 报文的分片序列,便于接收方重组。

相关信息
未触发 IKE Fragmentation 前的原始 Data 长度为
3396 - 8(UDP Header) - 16(SPI) - 1(Next Payload) - 1(Version) - 1(Exchange Type) - 1(Flags) - 4(Message ID) - 4(Length) = 3360 Bytes,IKE Fragmentation 后的原始 Data 长度为3696 - 44(Fragmentation Payload 1~6) * 6 - 72(Fragmentation Payload 7) = 3360 Bytes,两者原始 Data 长度一致。- 原始报文文件:IKE_Fragment_enable.pcapng。
查看 IKE debug 信息,可以看到进入重传模式后触发了 IKE Fragmentation。
ike 0:ToR2:275: retransmission, re-send last message ike 0:ToR2:275: fragment on 544 byte boundary ike 0:ToR2:275: send fragment len 544 id 1 index 1 last 0 ike 0:ToR2:275: sent IKE msg (retransmit): 100.0.0.2:500->100.0.3.2:500, len=544, id=4747dd36d159b27b/928cbb1951a80e00 ike 0:ToR2:275: send fragment len 544 id 1 index 2 last 0 ike 0:ToR2:275: sent IKE msg (retransmit): 100.0.0.2:500->100.0.3.2:500, len=544, id=4747dd36d159b27b/928cbb1951a80e00 ike 0:ToR2:275: send fragment len 544 id 1 index 3 last 0 ike 0:ToR2:275: sent IKE msg (retransmit): 100.0.0.2:500->100.0.3.2:500, len=544, id=4747dd36d159b27b/928cbb1951a80e00 ike 0:ToR2:275: send fragment len 544 id 1 index 4 last 0 ike 0:ToR2:275: sent IKE msg (retransmit): 100.0.0.2:500->100.0.3.2:500, len=544, id=4747dd36d159b27b/928cbb1951a80e00 ike 0:ToR2:275: send fragment len 544 id 1 index 5 last 0 ike 0:ToR2:275: sent IKE msg (retransmit): 100.0.0.2:500->100.0.3.2:500, len=544, id=4747dd36d159b27b/928cbb1951a80e00 ike 0:ToR2:275: send fragment len 544 id 1 index 6 last 0 ike 0:ToR2:275: sent IKE msg (retransmit): 100.0.0.2:500->100.0.3.2:500, len=544, id=4747dd36d159b27b/928cbb1951a80e00 ike 0:ToR2:275: send fragment len 376 id 1 index 7 last 1查看连接一阶段建立状态,连接正常建立。
R1-FG1101E # diagnose vpn ike gateway list vd: root/0 name: ToR2 version: 1 interface: port16 39 addr: 100.0.0.2:500 -> 100.0.3.2:500 created: 19s ago peer-id: C = CN, ST = Haidian, L = Beijing, O = TAC, OU = Fortinet, CN = fw2.summerice2019.com, emailAddress = bbai@fortinet.com peer-id-auth: yes IKE SA: created 1/1 established 1/1 time 3000/3000/3000 ms IPsec SA: created 0/0 id/spi: 272 4747dd36d159b27b/928cbb1951a80e00 direction: initiator status: established 19-16s ago = 3000ms proposal: aes128-sha256 key: fbccacf66b8f53ff-45734e851fbe3742 lifetime/rekey: 86400/86083 DPD sent/recv: 00000000/00000000 peer-id: C = CN, ST = Haidian, L = Beijing, O = TAC, OU = Fortinet, CN = fw2.summerice2019.com, emailAddress = bbai@fortinet.com
IKEv2
相关信息
IKEv2 以下仅作简单示例。
在 IKE_SA_INIT 报文中查看 Notify Payload,可以看到 IKEv2 通过
IKEV2_FRAGMENTATION_SUPPORTED通告和协商分片能力,且后续 IKEv2 报文直接使用 1200 Bytes(默认配置)的 MTU 进行预分片。
原始报文文件:IKEv2_fragmentation.pcapng。
查看 IKE debug 信息,可以看到
IKEV2_FRAGMENTATION_SUPPORTED字段的协商过程,以及 FortiGate 执行 IKEv2 分片的动作。...... ike V=root:0:d08d63eb84620f84/0000000000000000:4: received notify type FRAGMENTATION_SUPPORTED ...... ike V=root:0:SLK_Remote_VPN:4: processing notify type FRAGMENTATION_SUPPORTED ...... ike V=root:0:SLK_Remote_VPN:4: splitting payload len=1407 into 2 fragments ...... ike V=root:0:SLK_Remote_VPN:4: splitting payload len=1407 into 2 fragments ...... ike V=root:0:SLK_Remote_VPN:4: splitting payload len=1407 into 2 fragments ......在 FortiClient 场景下启用 IKEv2 Fragmentation。FortiClient 默认关闭
IKEV2_FRAGMENTATION_SUPPORTED支持,需要在 EMS 推送的配置中(Endpoint Profiles > Remote Access > IPsec VPN tunnel > Phase 1)开启IKE Fragmentation。或在 XML 文件中增加<enable_ike_fragmentation>1</enable_ike_fragmentation>配置。<ipsecvpn> <connections> <connection> <name>你的IPsec连接名称</name> <ike_settings> <enable_ike_fragmentation>1</enable_ike_fragmentation> ......
总结
- IKE Fragmentation 用于避免 IKE 协商阶段产生普通 IP 分片,降低中间设备丢弃 IP 分片导致协商失败的概率。
- IKEv1 只有触发 IKE 重传机制后才会触发 IKE Fragmentation;在 IKEv1 场景下,此功能不需要双方协商,可以单方向生效。
- IKEv2 通过 IKE_SA_INIT 报文中的
IKEV2_FRAGMENTATION_SUPPORTED协商分片能力。双方都支持后,FortiGate 不需要等待重传即可按照fragmentation-mtu对后续 IKEv2 报文进行预分片。