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


113

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

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

问题在于,固定标头或扩展标头中都没有长度字段。您必须具有扩展头类型及其大小的表格,以便可以将此链接列表追到最后。

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

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


10
基于这个问题,看来我并不傻,是的,我正在读正确的话:(在现实世界中)不可能向IPv6添加新的扩展头。 stackoverflow.com/questions/9847923/…–
AdamIerymenko

10
是的,似乎还需要计算头文件的长度才能遍历链接列表:stackoverflow.com/questions/14762193/… 不要误会我的意思。IPv6很棒而且非常需要。但这似乎仍然是头脑僵硬的。
AdamIerymenko

3
规格(链接在顶部注释中)说,路由器不应查看标头,因此不必在意添加的标头。仅目标节点应查看标头。
Anders E. Andersen

2
刚一说明:“头发右脑”是一个相当混乱的拼写和“轻率”应该是首选(来源:TFD
的PzKpfw

2
就只有一种正确的拼写而言,这是“聪明的”。
艾伦B

Answers:


33

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

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

路由器可以路由此类数据包,因为它们所需的只是路由头。深度数据包检测小工具之类的东西需要了解很多,但这毕竟是他们的命运。

编辑添加:此设计意味着中间盒只能更改其所知道的内容。如果中间盒看到它不知道的标题,则只有两个选项:拒绝或继续。在IPv4中,它也可以删除未知扩展名并将其余部分继续传递。IMO的这一特性使设计更具扩展性。


97

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

RFC 2460开始

如果作为处理标头的结果,要求节点前进到下一个标头,但是该节点无法识别当前标头中的“下一个标头”值,则它应该丢弃该数据包并将ICMP参数问题消息发送到源分组的,为1的ICMP代码值(“未识别的下一个首部类型中遇到”)和含有原始数据包内的无法识别的值的偏移的ICMP指针字段。如果节点在除IPv6标头之外的任何标头中遇到下一个标头值为零,则应采取相同的操作。


15
好。我以为我失去了理智。是的,这确实是一个完全不可扩展的设计……至少没有带内信号传输和其他黑客手段。在应用程序协议中,这是可以原谅的,在该协议中,您可以控制两端并且只需要考虑应用程序的新版本,而不能在旨在持续数百年的应用程序中使用?
AdamIerymenko

8
具有忽略未知标头的能力将导致更复杂的问题。(如果中间代理在不了解封装ESP头的情况下修改了TCP头,该怎么办?)在这种情况下,简单性胜过“可扩展”!
jman

4
@Max IPv6实际上具有足够的地址来为地球上的每个原子分配一个地址。没有互联网连接的烤面包机会耗尽这个空间。
泰勒·麦克亨利

8
@Max我不会说我们绝对不需要IPv7,但是有了IPv6,我们有足够的地址空间来为地球大气层(13万公里)中的每立方毫米分配一个唯一的地址...十万倍。所以我的意思是,一旦我们开始在其他星系中定殖,我们可能会担心一些事情,但是在那之前我们应该还算不错。
cincodenada

4
缺少某些上下文:With one exception, extension headers are not examined or processed by any node along a packet's delivery path, until the packet reaches the node (or each of the set of nodes, in the case of multicast) identified in the Destination Address field of the IPv6 header.
Tobu 2013年

28

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

错误,因为:

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

  2. 如果新的扩展头在某种程度上是可选的(最好是可选的),则您将收到有关此的ICMP错误,如果没有,可以再次尝试。


1
而且您确定该ICMP数据包将通过NAT到达实际的发送者吗?
Dexter

5
@Dexter ipv6将会杀死NAT ...希望
Janus Troelsen

2
@Dexter:出于多种原因,这些ICMP数据包需要到达。例如,如果管道的MTU缩小(可能是由于PPPoE或VPN造成了数据包封装),并且正在发送的数据包太大,则将返回ICMP数据包,说明该数据包太大。
Bill Lynch

4
@JanusTroelsen并非每个人都抱有您的希望。
德克斯特(Dexter)

4

更新RFC 6564涵盖了这种情况。它准确地列出了您描述的场景,并为任何新的扩展头(如果有的话)定义了格式,至少在某些情况下,您的中间箱可以使用。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.