对于FortiGate的IPSec隧道来说,首先在没有进行PMTU发现时,PMTU会继承IPSec Tunnel Interface的MTU。
如以下示例中(Version 7.0.3 GA),Hub端开启了net-device,IPSec Tunnel对应的物理口的MTU为1500,动态生成的Tunnel1_0的MTU为1420。此时使用VPN内网PC进行访问,查看生成的路由缓存表中,对应的流量的PMTU也继承为1420。
SH-HE (root) # **diagnose netlink interface list | grep port1**
if=port1 family=00 type=1 index=9 **mtu=1500** link=0 master=0
SH-HE (root) # **diagnose netlink interface list | grep Tunnel1**
if=Tunnel1 family=00 type=768 index=47 mtu=1420 link=0 master=0
if=Tunnel1_0 family=00 type=768 index=65 **mtu=1420** link=47 master=0
SH-HE (root) # **diagnose ip rtcache list | grep Tunnel1_0 -A 1**
......
10.80.252.129@11(port3)->10.35.253.3@65(Tunnel1_0) gwy=10.255.99.248 prefsrc=10.80.252.130
ci: ref=1 lastused=0 expire=0 err=00000000 used=11 br=0 **pmtu=1420**
<aside> 💡 不同的算法这些值也是不一样的,可以参考这里。
</aside>
当FortiGate上的IPSec phase1-interface中的ip-fragmentation使用post-encapsulation时,如果原始的Payload较大,封装ESP后,超过了物理接口的MTU,则会产生ESP分片包到Internet(参考Post-encapsulation)。
当IPSec ESP(或UESP)报文在Internet上传输时,我们经常会遇到一些运营商丢弃ESP分片报文的情况,导致IPSec接收方收到的ESP报文分片缺失(通常丢的都是MF位置1的那片)。
通过在IPSec的phase1-interface中将ip-fragmentation配置为pre-encapsulation,可以避免FortiGate自身产生ESP分片报文(参考Pre-encapsulation)。
<aside> 💡 pre-encapsulation:用户数据内容本身比较大,需要拆分到合适的大小后,对多个内容块进行ESP封装,目的是防止FortiGate产生ESP分片包。 post-encapsulation(符合RFC4303):对大多数用户数据内容直接ESP封装,然后再根据物理口MTU进行分片,如果用户数据+ESP封装的大小超过了物理口的MTU,则一定会产生ESP分片。
</aside>
虽然当FortiGate上的IPSec phase1-interface中启用pre-encapsulation时,默认的接口MTU配置下,防火墙不会发出超过物理接口MTU=1500的ESP分片报文。但如果ESP在Internet上的传输路径中,存在MTU小于1500的设备时,仍然会在传输过程中产生ESP分片包,这样仍然存在ESP分片包被丢弃的风险。
根据历史case来看,国内的ISP丢弃分片包的case时有发生,ISP处理此类case费力费时,所以建议客户启用pre-encapsulation解决。

R1-FG1101E # show vpn ipsec phase1-interface ToR2
config vpn ipsec phase1-interface
edit "ToR2"
set interface "port16"
set peertype any
set net-device disable
set passive-mode enable
set proposal aes128-sha256
set **ip-fragmentation pre-encapsulation**
set remote-gw 100.0.3.2
set psksecret ENC Z8JY4iWGlEVkd9FBHND38mehwVdARcHczR3QcrxWjT60LTWVr1+CirMEFhzQdLZWBK+HWBCsGowDBXAzPqLPd2VfyW4Cl/w1n7Axa0B1e0oh+zTSdKr1auFuCMn/p/IkQpiHCY5AWV1E8GQcteDZ6zv7fpWqnTD0crmVSydT/Qpk5p844Oxgf02k9AfDRcY29j8Gcw==
next
end
R1-FG1101E # show vpn ipsec phase2-interface ToR2
config vpn ipsec phase2-interface
edit "ToR2"
set phase1name "ToR2"
set proposal **aes256-sha384**
next
end
R2-FG1101E # show vpn ipsec phase1-interface ToR1
config vpn ipsec phase1-interface
edit "ToR1"
set interface "port16"
set peertype any
set net-device disable
set exchange-interface-ip enable
set proposal aes128-sha256
set **ip-fragmentation pre-encapsulation**
set dpd disable
set remote-gw 100.0.0.2
set psksecret ENC Lv4Etajj6H2abp3coiBKezA+1aP7epa+KIUb6TpVECqC/MO8vweHdqW4mTfE+PJnm3xmywcheaxr7r/jNRimIuRbripGvAdvk9V8ezgTsInYXXWmmt1+twvGPPxfCKUxGHHJHVgozsun3uH5TMDmMwmgRkWL0sq7YR+Zv5lyrDhi7XZcJdioL60aa3RCqNyzc+hZYw==
next
end
R2-FG1101E # show vpn ipsec phase2-interface ToR1
config vpn ipsec phase2-interface
edit "ToR1"
set phase1name "ToR1"
set proposal **aes256-sha384**
set auto-negotiate enable
next
end