113

我正在编写一个非常简单的网络过滤器,并到达我想要解析 IPv6 标头以匹配 ICMPv6 类型、TCP/UDP 端口号等内容的位置。

所以我正在深入阅读有关IPv6 数据包格式的内容,我有点……嗯……我不得不一遍又一遍地阅读它,以确保我实际上阅读它是正确的。在我看来,您必须从 40 字节的固定标头开始,然后查看它的下一个标头字段。然后你必须查看下一个标题的下一个标题字段,以此类推,就像一个链表,直到你到达末尾。如果有有效载荷,它将跟随。

问题是固定标头或扩展标头中都没有长度字段。您必须有一个扩展标头类型及其大小的表,以便您可以将这个链表追踪到最后。

这让我觉得这是一个奇怪的,甚至可能是愚蠢的设计。如果我遇到无法识别的扩展标头类型怎么办?我该怎么办?我不知道它的长度。我想我必须将数据包丢弃并阻止它,因为在允许数据包通过的网络过滤器中,攻击者可以通过包含虚假的标头类型来逃避网络过滤器。但这意味着,如果协议被扩展,如果要使用新的扩展,曾经编写的每一个 IPv6 报头解析软件都必须同时更新。

那么,如果我不知道他们使用的扩展名,我该如何解析 IPv6 标头呢?我如何跳过未知扩展的标题,因为我不知道它的长度?

4

4 回答 4

97

如果我遇到无法识别的扩展标头类型怎么办?

来自RFC 2460

如果由于处理一个报头,节点需要进行下一个报头,但当前报头中的 Next Header 值未被节点识别,则应丢弃该数据包并向源发送 ICMP 参数问题消息数据包的 ICMP 代码值为 1(“遇到无法识别的下一个标头类型”),并且 ICMP 指针字段包含原始数据包中无法识别的值的偏移量。如果节点在除 IPv6 标头之外的任何标头中遇到零下一个标头值,则应采取相同的操作。

于 2013-07-08T03:57:42.320 回答
34

如果遇到无法解析的内容,则必须根据已解析的内容做出决定或执行操作。

之所以这样设计,是因为在 IPv6 中,每个扩展标头都“包装”了数据包的其余部分。如果您看到路由标头,然后是一些您从未听说过的标头,然后是有效负载,那么您将无法解析有效负载。有效载荷的含义原则上取决于您不知道如何解释的标头。

路由器可以路由此类数据包,因为它们所需要的只是路由标头。深度包检测小工具之类的需要知道很多,但无论如何这就是它们的命运。

编辑补充:这种设计意味着中间盒只能改变他们所知道的。如果中间盒看到它不知道的标题,那么它只有两个选择:拒绝或传递。在 IPv4 中,它还可以删除未知扩展名并传递其余部分。IMO 这个属性使设计更具可扩展性。

于 2013-07-08T14:16:26.543 回答
29

(在现实世界中)不可能向 IPv6 添加新的扩展标头。

不正确,因为:

  1. 仅允许目标主机根据无法识别的扩展标头拒绝(您链接的问题中提到了一个例外)

  2. 如果您的新扩展头在某种程度上是可选的(最好是),您将收到一个 ICMP 错误,并且可以在没有它的情况下重试。

于 2013-07-08T04:48:16.183 回答
4

更新RFC 6564涵盖了这种情况。它准确地列出了您描述的场景,并为任何新的扩展标头(如果有的话)提出了一种格式,至少在某些时候,像您这样的中间盒将能够使用这些标头。

请记住,它并非旨在通过创建新的扩展标头来扩展 IPv6,而是通过添加新的目标选项。处理未知的目的地选项应该是微不足道的,或者至少更容易。

于 2013-07-09T03:48:04.190 回答