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值为零,则应采取相同的操作.
arn*_*rnt 33
如果遇到无法解析的问题,则必须根据已经解析的内容做出决定或执行操作.
设计就是这样,因为在IPv6中,每个扩展头都"包装"了数据包的其余部分.如果您看到路由标头,然后是您从未听说过的某个标头,那么有效负载,则无法解析有效负载.有效载荷的含义原则上取决于您不知道如何解释的标题.
路由器可以路由此类数据包,因为它们只需要路由头.深度包检测小工具等需要了解很多,但无论如何这都是他们的命运.
编辑补充:这个设计意味着中间盒只能改变他们所知道的东西.如果中间框看到它不知道的标题,那么它只有两个选项:拒绝或传递.在IPv4中,它还可以删除未知扩展并传递其余部分.IMO这个属性使设计更具有可扩展性而非可扩展性.
And*_*ner 28
(在现实世界中)不可能向IPv6添加新的扩展头.
不正确,因为:
只允许目标主机根据无法识别的扩展标头拒绝(在您链接的问题中提到的一个例外)
如果你的新扩展标题在某种程度上是可选的(最好是),你将收到关于它的ICMP错误,并且可以在没有它的情况下重试.