解析包含未知扩展名的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.