parsing包含未知扩展名的IPv6扩展头

我正在编写一个非常简单的networkingfilter,并到达我想要parsingIPv6头的地方,以匹配ICMPv6types,TCP / UDP端口号等。

所以我正在深入阅读有关IPv6数据包格式的内容,我有点像…呃…我需要一遍又一遍地阅读它,以确保我确实正确地阅读了它。 在我看来,你必须从40字节的固定头开始,看看它的下一个头字段。 然后你必须看看下一个标题的下一个标题字段,依此类推,直到你到达最后。 如果有有效载荷,它将随之而来。

问题是在固定头文件或扩展头文件中没有长度字段。 你必须有一个扩展头types和它们的大小表,这样你可以把这个链表追到最后。

这使我感到奇怪,甚至可能是一种疯狂的devise。 如果遇到无法识别的扩展标题types,该怎么办? 我该怎么办? 我不知道它的长度。 我想我必须扔掉数据包并阻止它,因为在一个networkingfilter允许数据包通过允许攻击者通过包含一个伪造头types来逃避networkingfilter。 但是这意味着如果协议被扩展,如果要使用新的扩展名,每个必须同时更新的IPv6头标parsing软件都必须同时更新。

那么,如果我不知道他们使用的扩展名,我怎么能parsingIPv6标头? 我怎样才能跳过一个不知名的扩展头,因为我不知道它的长度?

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

devise就是这样,因为在IPv6中,每个扩展头都“包装”了数据包的其余部分。 如果你看到路由头,那么你从来没有听说过一些头,那么有效载荷,那么你不能分析有效载荷。 有效载荷的含义原则上取决于你不知道如何解释的标题。

路由器可以路由这样的数据包,因为他们只需要路由头。 深度包检测工具和类似的东西需要知道很多,但这就是他们的命运。

编辑补充说:这个devise意味着中间件只能改变他们所知道的东西。 如果中间件看到一个不知道的标题,那么它只有两个选项:拒绝或传递。 在IPv4中,它也可以删除未知的扩展名并传递给其他的扩展名。 国际海事组织这个属性使devise更多,而不是更less的可扩展性。

如果遇到无法识别的扩展标题types,该怎么办?

从RFC 2460 :

如果作为处理报头的结果,节点需要前进到下一个报头,但是当前报头中的下一个报头值不被该节点识别, 则它应丢弃该分组并且向源发送ICMP参数问题消息 ICMP码值为1(遇到“未识别的下一个报头types”),ICMP指针字段包含原始数据包中未识别值的偏移量。 如果节点在除了IPv6报头之外的任何报头中遇到下一个报头值为0,则应采取同样的行动。

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

不正确,因为:

  1. 只有目标主机被允许基于无法识别的扩展头来拒绝(在你链接的问题中提到的那个例外)

  2. 如果你的新的扩展头在某种程度上是可选的(最好是这样),你会收到一个ICMP错误信息,如果没有它,可以再试一次。

RFC 6564更新涵盖了这种情况。 它精确地描述了你描述的场景,并提出了一个新的扩展头的格式(如果有的话),至less在某些时候,你的中间件能够处理。

请记住,它不打算通过创build新的扩展标头来扩展IPv6,而是通过添加新的目标选项来扩展IPv6。 对于你来说,处理未知的目的地选项应该是微不足道的,或者至less要容易得多。