这几今天一直在研究思科和Juniper防火墙建立IPSec ×××的MTU问题,

底层基础可以参考思科官方的这篇文章,讲解的十分详细:

http://www.cisco.com/c/en/us/support/docs/ip/generic-routing-encapsulation-gre/25885-pmtud-ipfrag.html

顺便介绍Linux和Windows下两个测试Path MTU的两个小工具:http://packetlife.net/blog/2008/aug/18/path-mtu-discovery/


但是了解这些理论之后,我在测试的时候发现哪怕两台Juniper防火墙(SRX和Netscreen)之间配置了IPSEC ×××,但是MTU仍然是1500(当然DF=1),考虑到ESP和新的包头,这显然不科学(思科ASA之间建立同样的IPSEC ×××,MTU为1438)。


于是找到了下面两篇文章:

http://rtoodtoo.net/ipsec-tcp-mss-df-bit-and-fragmentation-in-srx/

https://kb.juniper.net/InfoCenter/index?page=content&id=kb15263&actp=search

Juniper防火墙默认情况下会重置客户端数据包的DF位,因此即便ping包的数据超过1472,还要经过IPSEC ×××,并且设置为不能分片(DF=1),其也能顺利通过IPSEC ×××。


但是思科默认是清除DF位的,因此如果数据+IPSEC封装超过MTU,那么就会丢包,可以参考下面这篇文章:

http://www.cisco.com/c/en/us/td/docs/security/asa/asa-command-reference/A-H/cmdref1/c6.html

具体配置请参考给出的文章,这里不过多列举这种命令,但是需要注意如果想要修改思科ASA清除DF位,那么应该同时修改接口和crypto map。