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

Ada*_*nko 111 ip networking ipv6

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

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

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

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

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

Oli*_*rth 95

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

来自RFC 2460:

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

  • 好.我以为我正在失去理智.所以是的,它确实是一个完全不可扩展的设计......至少没有带内信令和其他黑客攻击.这在一个应用程序协议中是可以理解的,在这个应用程序协议中你可以控制两端,只需要考虑你的应用程序的新版本,但不能设计为持续数百年的东西? (14认同)
  • 能够忽略未知标题会导致更复杂的问题.(如果中间代理在不知道封装ESP头的情况下修改了TCP头怎么办?)在这种情况下,简单性胜过"可扩展"! (8认同)
  • @Max我不会说我们绝对不会需要IPv7,但是使用IPv6我们有足够的地址空间来为地球大气层(130,000公里)提供每个*立方毫米*一个独特的地址......超过100,000次.所以我的意思是,一旦我们开始殖民其他星系,我们可能会有一些需要担心的事情,但在那之前我们应该相当不错. (8认同)
  • @Max IPv6具有足够的地址来为地球上的每个原子分配一个地址.没有多少互联网连接的烤面包机会耗尽这个空间. (4认同)
  • 缺少某些上下文:`有一个例外,任何节点都不会沿着数据包的传递路径检查或处理扩展头,直到数据包到达节点(或多播节点中的每个节点)在IPv6标头的目标地址字段 (4认同)
  • 看到你的编辑,似乎很明确.问题是,这确实使协议不可扩展,因为出于安全原因,智能路由器和过滤器无法传递具有无法识别的扩展头的数据包.哇. (3认同)
  • 我们可能不需要新的_IP_标头,但我们肯定会更频繁地使用新的扩展标头(http://en.wikipedia.org/wiki/IPv6_packet#Extension_headers)! (3认同)

arn*_*rnt 33

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

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

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

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


And*_*ner 28

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

不正确,因为:

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

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

  • @Dexter ipv6会杀死NAT ......希望如此 (5认同)
  • @JanusTroelsen不是每个人都有你的希望. (3认同)
  • @Dexter:由于多种原因,这些 ICMP 数据包需要到达。例如,如果管道的MTU缩小了(可能是因为PPPoE或者VPN发生了数据包封装),并且发送的数据包过大,则会返回ICMP数据包,说明数据包过大。 (2认同)