我正在编写一个非常简单的网络过滤器,并到达我想要解析 IPv6 标头以匹配 ICMPv6 类型、TCP/UDP 端口号等内容的位置。
所以我正在深入阅读有关IPv6 数据包格式的内容,我有点……嗯……我不得不一遍又一遍地阅读它,以确保我实际上阅读它是正确的。在我看来,您必须从 40 字节的固定标头开始,然后查看它的下一个标头字段。然后你必须查看下一个标题的下一个标题字段,以此类推,就像一个链表,直到你到达末尾。如果有有效载荷,它将跟随。
问题是固定标头或扩展标头中都没有长度字段。您必须有一个扩展标头类型及其大小的表,以便您可以将这个链表追踪到最后。
这让我觉得这是一个奇怪的,甚至可能是愚蠢的设计。如果我遇到无法识别的扩展标头类型怎么办?我该怎么办?我不知道它的长度。我想我必须将数据包丢弃并阻止它,因为在允许数据包通过的网络过滤器中,攻击者可以通过包含虚假的标头类型来逃避网络过滤器。但这意味着,如果协议被扩展,如果要使用新的扩展,曾经编写的每一个 IPv6 报头解析软件都必须同时更新。
那么,如果我不知道他们使用的扩展名,我该如何解析 IPv6 标头呢?我如何跳过未知扩展的标题,因为我不知道它的长度?