分片头部(Fragment Header)用于IPv6源节点向目的节点发送一个大于路径MTU的数据报。
一、优势
IPv6 分片头具有多种优势,可提高网络效率,包括减少数据包延迟和减少网络拥塞。使用 IPv6 分片头,数据包在源处而不是中间路由器进行分段,从而节省时间和资源。此外,此过程可确保将数据有效传送到预期目的地,而不会在整个网络中造成不必要的流量或延迟。
IPv6 分片头的另一个显着优势是它们能够处理比 IPv4 更大的数据包。此功能降低了与打包相关的开销成本,并有助于保证在带宽容量较低的网络上传输大文件时获得更好的性能。例如,用户可以将高清视频文件作为一个整体发送,而不是将其分成较小的块并在收到后重新组装它们。
总之,由于其在跨网络高效传输数据包方面具有众多优势,同时通过优化使用每个数据报(数据包)内的可用空间来最大限度地降低基础设施成本,因此任何现代互联网协议实现都应该包括对 IPv6 分片头的支持。
二、结构与原理
1280字节是整个网络中针对IPv6定义的链路层最小MTU(见[RFC2460]的第五节)。在IPv4中,这个值可能是576。在IPv4中,如果数据报大小超过下一跳MTU,任何主机或路由器可将该数据报分片,IPv4头部中第二个32位字段标识分片信息。如下图
在IPv6中,仅数据报的发送者可以执行分片操作。这就是说,中间路由器或着主机不再需要处理分片报文,这样会提高分片报文处理效率,因为分片报文的重组和分片都是耗cpu的。在这种情况下需要添加一个分片头部。
- 下一个标头(Next Header):下一个标头是一个 8 位字段,用于标识分段标头之后存在的标头类型。
- 保留(Rserved):这是一个 8 位字段,目前完全为零。将来,我们可能会在这里找到一些有用的东西来填充。另外,还保留了一个额外的 2 位字段以供以后使用。
- 片段偏移量(Fragment Offset):它与IPv4中的大小完全相同,大小为 13 位。正如我们在 IPv4 中扩大分段偏移一样,我们也会在 IPv6 中做同样的事情。
- 更多片段(M):这里的更多片段位用"M"表示。这是一个一位字段,告诉我们后面是否有更多片段。如果更多片段位为零,则表示其最后一个片段,如果为 1,则它可以是除最后一个之外的任何数据包。
- 识别号(Identification Number):特定数据包的所有片段的识别号字段都相同,其大小是 IPv4 中的两倍。在数据包标识符字段中为 32 位,在 IPv4 中为 16 位。
分片头部包括的信息与IPv4头部中的相同,只不过标识符字段变成32位,而不是IPv4采用的16位。这个更大的字段提供了在网络中容纳更多分片的能力。图显示了分片头部采用的格式
IPv6分片头部包含一个32位的标识符字段(是IPv4中标识符字段的两倍).M位字段表明该分片是否为原始数据报的最后一个分片。与IPv4一样,分片偏移字段给出了有效载荷在原始数据报中以8字节为单位的偏移量。
上图中,保留字段和2位的Res字段都为0,并且都会被接收方所忽略。分片偏移字段表明数据以8字节为单位的偏移量放置在分片头部之后(相对于原始IPv6数据报的"可分片部分"),如果M字段设置为1,表示在数据报中包含更多分片。如果该值为0,表示该分片是原始数据报的最后一个分片。
在分片过程中,输入的数据报称为"原始数据报",它由两部分组成:"不可分片部分"和"可分片部分"。不可分片部分包括IPv6头部和任何到达目的地之前需要由中间节点处理的扩展头部(即包括路由头部之前的所有头部,如果有逐跳选项扩展头部,则是该头部之前的所有头部)。可分片部分包括数据报的其余部分(即目的选项头部,上层头部和有效载荷数据)。简单说,就是有些扩展头部是不允许分片的,需要每个分片报文都携带不允许分片的部分。
分片头部尝试通过支持 1280 字节的最小数据包大小来尽可能减少分段的使用。如上图所示,如何根据发送方知道的 MTU 进行分片。IPv6 和其他扩展标头是不可分段的部分,因为每个分段都必须经过节点或路由器,并且在每个路由器处都需要存储在这些扩展标头中的信息。这就是 IPv6 数据包分为两部分的原因。一个是不可碎片部分,另一个是可碎片部分。不可分片的部分在其间不会遇到任何修改,而可分片的另一部分则被分为许多小片段,如片段 1、片段 2,依此类推。创建小片段后,片段标头和特定片段(如片段 1)连接到不可分段部分并发送到目的地。有效负载长度在分片后可能会发生变化,并且在添加分片标头后,相应的字段(如下一个标头、标识号、分片偏移量)和更多分片位会被适当填充
当原始数据报被分片后,将会产生多个分片,其中每个分片都包含一个原始数据报综合那个不可分片部分的副本,但是需要修改每个IPv6头部的负载长度字段,以反映它所描述的分片报文大小。在不可分片部分之后,每个新的分片都包含一个分片头部,其中包含一个分片相应的分片偏移字段(例如第一个分片的偏移量为0),以及一个原始分组的标识符字段的副本,最后一个分片的M(更多分片)位字段设置为0。
三、分片示例分析
假设我们有一个正好 370 字节宽的 IPv6 数据报。IPv6数据报由一个40字节的IP报头、四个30字节的扩展报头和210字节的数据组成。其中两个扩展标头是不可分段的,而两个是可分段的。我们必须通过 MTU 仅 230 字节的链路发送此信息。需要三个片段,而不是您可能期望的两个片段,因为每个片段必须包含两个 30 字节的不可片段扩展标头,并且长度是 8 的倍数。在此 IPv6 片段示例中,一个 370 字节的 IPv6 数据报包含四个 30 字节的 IPv6 数据报。扩展头分为三个片段。
分片的概念与IPv4中的相同。但是,碎片发生的位置不同。在 IPv4 中,如果数据报的大小大于数据报传输的网络的 MTU,则需要源或路由器进行分段。在 IPv6 中,只有原始源可以分段。源必须使用路径 MTU 发现技术来查找路径上任何网络支持的最小 MTU 路径上任何网络支持的 MTU。然后使用这些知识对源进行碎片化。如果源不使用路径 MTU 发现技术,它将数据报分段为 1280 字节或更小,这是连接到互联网的最低限度。
四、安全性分析与建议
IPv6 分片头部用于 IPv6 数据包的分段和重组。虽然分段/重组机制的许多安全隐患在 IPv4 世界中已为人所知,但一些相关问题已经渗透到 IPv6 实现中。这些范围从 DoS 攻击到信息泄漏,如[ RFC7739 ]、[ Bonica-NANOG58 ]和[ Atlasis2012 ]中讨论的。
在检查 IPv6 分段示例时,主要问题之一是第一个分段可能没有所需的上层(TCP 和 UDP)信息。安全设备需要此信息来确定数据包是否符合其配置的策略和规则。碎片可能会混淆数据,使其能够通过安全设备。路由器和无状态设备通常只查看包含标头信息的第一个片段。许多小片段用于隐藏或 DoS 攻击节点。攻击者将数据包分解成许多小碎片数据包,绕过安全设备。每个小片段看起来都是合法的,但一旦重新组装,整个数据包就会被用来发起攻击。攻击者通过将攻击内容压缩成许多小片段来隐藏他的真实意图。这些可能会被仅查看未碎片部分的设备传递并且看不到。
碎片和碎片重组可能会在中间节点中产生意外且有害的行为。网络碎片化过程可能导致IP 安全问题。 碎片可用于各种攻击,例如指纹识别、IPS 插入/规避、防火墙规避和远程代码执行。分片攻击:攻击者利用 IPv6 分片过程中的漏洞,导致网络设备花费过多的资源来重组分片数据包。其他攻击包括 重叠片段、不完整片段集、隧道内片段和嵌套片段。嵌套片段是具有多组片段标头的数据包,这在标准 IP 网络中绝不会出现。源仅创建一个片段标头。重叠片段可用于操作系统指纹识别和 IPS/IDS 规避。碎片攻击可用于 DoS(终端主机)。如果主机无法正确处理碎片数据包,攻击者可以发送许多碎片数据包,这些碎片数据包将由内核内存处理,从而耗尽内核处理合法碎片的能力。Whisker、Fragrouter 和 Scapy 等许多工具都可以制作这些数据包。
RFC 5722 建议禁止重叠片段。RFC 规定,如果 IPv6 主机执行重组并包含确定重叠的片段,则整个数据报将被默默丢弃。没有错误消息被发送回发送主机。Antonios Atlasis 进行的测试证明,没有一个操作系统符合 RFC 5722。
与 IPv4 世界一样,IPv6 安全功能由带有 "fragments"关键字 的 ACL 组成。ACL 匹配非初始 IPv6 分片。初始 IPv6 分段包含第 3 层和第 4 层的信息。Cisco IOS 具有称为虚拟重组的功能,可检查分段数据包。它是输入 ACL 的次要对象,这意味着输入 ACL 有第一次机会检查传入数据包。它重新组装碎片数据包,检查任何无序的碎片,将它们放回正确的顺序,然后向上发送协议栈。