解析包含未知扩展名的IPv6扩展标头

时间:2013-07-08 03:53:19

标签: networking ip ipv6

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

所以我正在深入阅读IPv6 packet format,我有点像......嗯......我不得不一遍又一遍地阅读它以确保我真的在阅读对的。 在我看来,你必须从40字节的固定标头开始,看看它的下一个标题字段。然后你必须查看下一个标题的下一个标题字段,依此类推,就像一个链表,直到你到达结尾。如果有有效载荷,它将随之而来。

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

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

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

4 个答案:

答案 0 :(得分:95)

  

如果遇到无法识别的扩展标头类型会怎样?

来自RFC 2460

  

如果作为处理标题的结果,则需要继续进行节点      到下一个标题但是当前标题中的Next Header值是      节点无法识别,它应该丢弃数据包并发送一个      ICMP参数问题消息到数据包的来源,带有      ICMP代码值为1(“遇到无法识别的下一个标题类型”)      和ICMP指针字段包含无法识别的偏移量      原始数据包中的值。如果,应采取相同的行动      一个节点在其他任何标头中遇到Next Header值为零      而不是IPv6标题。

答案 1 :(得分:33)

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

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

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

编辑添加:此设计意味着中间件只能改变他们所知道的内容。如果中间框看到它不知道的标题,那么它只有两个选项:拒绝或传递。在IPv4中,它还可以删除未知扩展并传递其余部分。 IMO这个属性使设计更具有可扩展性,而不是可扩展性。

答案 2 :(得分:28)

  

(在现实世界中)无法向IPv6添加新的扩展标头。

不正确,因为:

  1. 只允许目标主机根据无法识别的扩展标头拒绝(the question you linked中提到的一个例外)

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

答案 3 :(得分:4)

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

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