8. Path MTU/DF 处理
对出站包应用 AH 或 ESP 会增大包的大小,因而可能导致该包超过其将要经过的 SA 的路径 MTU(PMTU)。IPsec 实现也可能收到未经认证的 ICMP PMTU 消息,如果它选择根据该消息采取行动,则结果会影响出站流量处理。本节描述 IPsec 实现处理这两个 PMTU 问题所需的处理过程。
8.1. DF 位
当流量通过隧道模式 SA 承载时,所有 IPsec 实现都必须(MUST)支持将 DF 位从出站包复制到其所发出的隧道模式头的选项。这意味着必须(MUST)能够为每个 SA 配置实现对 DF 位的处理方式(设置、清除、从内层头复制)。这适用于内层和外层头均为 IPv4 的 SA。
8.2. 路径 MTU(PMTU)发现
本节讨论 IPsec 对未经保护的路径 MTU 发现消息的处理。此处使用术语“ICMP PMTU”指代如下 ICMP 消息:
IPv4(RFC 792 [Pos81b]):
- 类型 = 3(目的不可达)
- 代码 = 4(需要分片但已设置 DF 位)
- 下一跳 MTU 位于 ICMP 头第二个字的低 16 位(在 RFC 792 中标为“未使用”),高 16 位设为零
IPv6(RFC 2463 [CD98]):
- 类型 = 2(包过大)
- 代码 = 0(需要分片)
- 下一跳 MTU 位于 ICMP6 消息的 32 位 MTU 字段中
8.2.1. PMTU 的传播
当某个 IPsec 实现收到一个未经认证的 PMTU 消息,且被配置为处理(而非忽略)此类消息时,它会将该消息映射到其对应的 SA。此映射通过从 PMTU 消息的载荷中提取头部信息,并应用第 5.2 节所述过程来实现。该消息所确定的 PMTU 用于更新 SAD 的 PMTU 字段,同时考虑将要应用的 AH 或 ESP 头的大小、任何密码同步数据,以及在隧道模式 SA 情况下额外 IP 头所施加的开销。
在原生主机实现中,可以以与未受保护通信相同的粒度维护 PMTU 数据,因此不会损失功能。PMTU 信息的信令在主机内部完成。对于所有其他 IPsec 实现选项,PMTU 数据必须通过合成 ICMP PMTU 消息来传播。在这些情况下,IPsec 实现应该(SHOULD)等待出站流量被映射到 SAD 条目。当此类流量到达时,如果该流量将超过更新后的 PMTU 取值,则必须(MUST)按如下方式处理:
情形 1:原始(明文)包是 IPv4 且设置了 DF 位。实现应该(SHOULD)丢弃该包并发送一条 PMTU ICMP 消息。
情形 2:原始(明文)包是 IPv4 且清除了 DF 位。实现应该(SHOULD)根据其配置进行分片(加密之前或之后),然后转发这些分片。它不应该(SHOULD NOT)发送 PMTU ICMP 消息。
情形 3:原始(明文)包是 IPv6。实现应该(SHOULD)丢弃该包并发送一条 PMTU ICMP 消息。
8.2.2. PMTU 老化
在所有 IPsec 实现中,与某个 SA 关联的 PMTU 必须(MUST)被“老化”,并且需要某种机制及时更新 PMTU,尤其是用于发现 PMTU 是否小于当前网络条件所需的值。给定的 PMTU 必须保持足够长的时间,使包能够从 SA 的源到达对端,并在当前 PMTU 过大时传播一条 ICMP 错误消息。
实现应该(SHOULD)使用路径 MTU 发现文档(RFC 1191 [MD90] 第 6.3 节)中描述的方法,该方法建议定期将 PMTU 重置为第一跳数据链路 MTU,然后让正常的 PMTU 发现过程按需更新 PMTU。该周期应该(SHOULD)是可配置的。
相关小节: