由于 Magic Transit 会将您的流量包装在额外的标头中(封装),因此每个数据包中可用于原始数据的有效空间会减少。如果不考虑这种开销,数据包可能会对于网络路径而言过大,从而被丢弃或分片 —— 导致性能降低或连接失败。本页面解释了您需要配置的两个核心值:最大传输单元 (MTU) 和最大分段大小 (MSS)。
最大传输单元 (MTU) ↗ 是一个衡量指标,代表网络连接设备所能接受的最大数据包。MTU 几乎总是应用于网络中开放系统互连 (OSI) 模型的第 3 层,并包括整个数据包,包括所有标头(传输控制协议 (TCP)、网际协议 (IP) 等)以及数据(有效负载)本身。例如,数据包不得超过 1,500 字节才能在互联网中路由。
最大分段大小 (MSS) ↗ 是指您在单个 TCP 数据报数据包中可以发送的数据量。您可以通过从 MTU 中减去 IP 和 TCP 标头的大小来确定此值,这会指示路由器有效负载可以有多大。它适用于网络中 OSI 模型的第 4 层。
关于 MSS/MTU 的一个常见误区是,设置这些值会负面影响性能。虽然会有轻微的性能损失,但如果不配置这些值以适应您网络的特性,情况会更糟。
由于 Magic Transit 使用封装来提供服务,因此了解 MTU 和 MSS 在这种情况下为何重要也同样关键。
封装会增加数据包的字节数,因为 Cloudflare 为每个数据包添加了新的 IP 标头以及(通常)某种封装标头。例如,在网际协议第 4 版 (IPv4) 的通用路由封装 (GRE) 情况下,封装增加了 24 字节 —— 20 字节用于 IPv4 标头,4 字节用于 GRE 隧道标头。
执行 GRE 封装的网络接口需要通过减小其 MTU 来适应增加的开销。由于 MTU 最大大小为 1,500 字节,对于 IPv4 而言,这意味着 MTU 变为 1,476 字节(原始 1,500 字节减去 GRE 封装的 24 字节)。这个减小的 MTU 定义了 GRE 可以封装 the IP 数据包的最大大小。
如果数据包大于网络接口所能接受的大小,网络必须将其丢弃或分片为更小的数据包。发生分片时,Cloudflare 仅接受它可以完全重新组装的数据包。如果缺少某些分片,Cloudflare 将丢弃所有收到的分片。Cloudflare 不会将不完整的数据包转发给客户。
将 TCP 标头中的不分片 (DF) 位设置为 1 表示如果数据包大于中间网络设备可以接受的 MTU,网络必须丢弃该数据包而不是对其进行分片。大多数 TCP 实现将 DF 位设置为 1 以避免分片引起的潜在问题。
如果您遇到分片问题且无法设置 MSS 钳制,Cloudflare 可以为您清除 DF 位。当您启用此选项时,Cloudflare 会对大于 1,500 字节的数据包进行分片,并且您的基础设施在解封装后重新组装这些数据包。请将此作为最后的手段。有关更多信息,请联系您的账户团队。
考虑一个大小为 3,000 字节的 UDP 数据报(8 字节用于 UDP 标头 + 2,992 字节用于 UDP 数据)。为了适应标准 1,500 字节的 MTU,此 UDP 数据报将被分片在三个 IP 数据包中,如下所示:

假设 UDP 数据报的源端口为 389 并且发往 Magic Transit 客户 IP 地址。还假设 Magic Transit 客户已设置防火墙规则,该规则会丢弃源端口为 389 的 UDP 流量(这是一种常见的无连接轻量级目录访问协议 (CLDAP) ↗反射攻击向量)。
前面的三个数据包分片将到达 Cloudflare,但只有第一个分片包含带有源端口信息的 UDP 标头。第二个和第三个分片包含 UDP 数据,但不包含 UDP 标头信息。
那么问题来了:Cloudflare 丢弃了哪些分片,又将哪些分片递送给客户?如果 Cloudflare 仅丢弃分片数据包的第一部分,则在拒绝服务 (DoS) 攻击期间,剩余的部分仍可能产生大量流量。
下图显示了前述示例中的三个 UDP 分片如何流经 Cloudflare 和 Magic Transit。核心要点是:
- Cloudflare 绝不向客户发送不完整的数据包:如果 Cloudflare 没有看到完全重新组装该数据包所需的所有数据包部分,Cloudflare 将不会将部分数据分片发送给客户。
- Cloudflare Network Firewall 作用于完全重新组装的数据包,而不是单个分片:这意味着,例如匹配 UDP/TCP 标头信息的过滤器会应用于完全重新组装的数据包,而不仅仅是初始分片。Cloudflare 不会向客户泄漏非初始分片。
- 客户仍可以看到分片的数据包:在默认情况下(未设置
clear_dont_fragment_bit),Cloudflare 在将数据发送给客户之前,会对其进行分片以适应所配置的隧道 MTU。如果数据包大于 1,476 字节,Cloudflare 将对其进行分片,并将这些分片发送给客户进行重新组装。
在所有情况下,Cloudflare 都会将所有分片发送给客户。
最大分段大小 (MSS) 是一种 TCP 设置,限制 TCP 段的大小。SYN 数据包在三次握手期间设置此选项。
默认情况下,TCP 终端节点根据其本地网络接口 MTU 设置其 MSS 值。例如,对于 IPv4,如果 MTU 为 1,500 字节,则 MSS 变为 1,460 字节(1,500 字节减去 IPv4 标头的 20 字节,减去 TCP 标头的 20 字节)。
MSS 是一个您可以用来配置 TCP 数据包大小行为的工具。如果 TCP 终端节点位于 MTU 减小的网络之后,则将 MSS 值更改为与实际路径 MTU 值相匹配,会强制远程终端节点发送符合指定 MTU 的数据包。因此,如果 IPv4 TCP 终端节点位于 MTU 为 1,476 字节的 GRE 隧道之后,则其 TCP SYN 数据包中的 MSS 值应为 1,436 字节 —— 即 1,476 字节减去 IPv4 标头的 20 字节,再减去 TCP 标头的 20 字节。
修改 MSS 设置的一种方法是通过更改路由器 WAN 接口中网络接口的 MTU,使其与路径 MTU 匹配。另一种修改 MSS 的方法是应用 MSS 钳制(MSS clamp),即在数据包通过中间网络设备(例如路由器)时,将其配置为实时修改 MSS TCP 选项。请注意,在中间网络设备的接口上更改 MTU 不等同于应用 MSS 钳制,它不会改变 TCP MSS 值。
有关根据隧道类型应将 MSS 钳制设置为什么值的信息,请参阅 MSS 钳制建议。
非对称路由是一个常见的场景,特别是对于 Magic Transit。来自互联网的入口流量进入 Cloudflare 网络,然后遍历 GRE 隧道(MTU 为 1,476 字节),而来自数据中心的出口流量则通过直接服务器返回 (DSR) 经由互联网发送(MTU 为 1,500 字节)。
在非对称场景中,您需要减小 Magic Transit 用户向互联网发送的数据包的 MSS 值,以减小从互联网发送到其网络的数据包大小。为此,您必须在客户的终端主机上或在其网络出口流量路径的中间设备上配置 MSS 钳制。下表详细说明了 MSS 值如何影响两条路由路径上的有效负载大小。

上述图表的核心要点:MSS 钳制会影响与应用钳制方向相反的方向上流动的 TCP 数据包的有效负载大小。
MSS 钳制仅影响 TCP 流量。例如,如果您的 Magic Transit 前缀上有一个 Web 服务器,那么 MSS 钳制将对来自直接服务器返回 (DSR) 流量的 TCP 数据生效。然而,对于您的 Magic Transit 隧道内部的任何隧道(隧道内隧道场景),您需要采取不同的方法。

例如,如果您设置了 Magic Transit GRE 隧道,然后又在您的场所中从第三方设备运行了另一个 IPsec 或 GRE 隧道,则 MSS 钳制对封装流量的外部数据包没有影响。这是因为 MSS 钳制仅影响 TCP 流量,而 IPsec/GRE 封装流量是 IP。对于这种场景,您需要进一步降低内部隧道接口的 MTU,无论您的入口流量还是出口流量都是如此。
MSS 值取决于您的网络是如何设置的。
-
Magic Transit 仅限入口流量 (DSR):
- 在您的边缘路由器传输端口上:将 TCP MSS 钳制设置为最大 1,436 字节。
- 在与第三方建立的使用您的 Magic Transit 前缀的任何 IPsec/GRE 隧道上:在内部隧道接口(最可能位于终止 GRE 的路由器后面的独立防火墙上)上应用 MSS 钳制,将当前值减少 24 字节。
-
对于 Magic Transit 入口 + 出口流量:
- 在 Magic Transit GRE 隧道内部接口上:即 Magic Transit 出口流量将通过的接口。在配置隧道后,您的设备可能会自动执行此操作,但这取决于您的设备。将 TCP MSS 钳制设置为最大 1,436 字节。
- 在与第三方建立的使用您的 Magic Transit 前缀的任何 IPsec/GRE 隧道上:在内部隧道接口(最可能位于终止 GRE 的路由器后面的独立防火墙上)上将其当前值减少 24 字节。
对于 IPsec 隧道,您需要指定的值取决于您的网络是如何设置的。MSS 钳制值低于 GRE 隧道,因为物理接口看到的是 IPsec 加密的数据包 ↗,而不是 TCP 数据包,并且 MSS 钳制不适用于这些数据包。
-
Magic Transit 仅限入口流量 (DSR):
- 在您的边缘路由器传输端口上:将 TCP MSS 钳制设置为最大 1,436 字节。
- 在与第三方建立的使用您的 Magic Transit 前缀的任何 IPsec/GRE 隧道上:在内部隧道接口(最可能位于终止 GRE 的路由器后面的独立防火墙上)上将其当前值减少 140 字节。
-
Magic Transit 入口 + 出口流量:
- 在您的边缘路由器上:在您的 Magic Transit IPsec 隧道内部接口(即 Magic Transit 出口流量将通过的接口)上应用此设置。在配置隧道后,您的设备可能会自动执行此操作,但这取决于您的设备。将 TCP MSS 钳制设置为最大 1,360 字节。
- 在与第三方建立的使用您的 Magic Transit 前缀的任何 IPsec/GRE 隧道上:在内部隧道接口(最可能位于您场所内终止 IPsec 设备后面的独立防火墙上)上将其当前值减少 140 字节。