我正在编写一个非常简单的网络过滤器,需要解析IPv6头以匹配ICMPv6类型、TCP/UDP端口号等信息。
于是我深入研究了IPv6数据包格式,但我发现困难重重……我不得不反复阅读,以确保我正确理解它。 我的理解是,你必须从40字节的固定头开始,并查看其下一标头字段。然后你还要查看下一个标头中的下一个标头字段,以此类推,就像一个链接列表,直到到达结尾。如果有有效负载,则会跟随其后。
问题在于,固定头和扩展标头中都没有长度字段。所以,您必须拥有一个扩展标头类型及其大小的表格,以便您可以追踪此链接列表到最后。
这使我感到奇怪,甚至可能是一个毫无逻辑的设计。如果我遇到一个无法识别的扩展标头类型,该怎么办?我不知道它的长度。我想我必须将数据包丢弃并阻止它通过,因为在网络过滤器中允许该数据包通过将允许攻击者通过包含虚假的标头类型来规避网络过滤器。但这意味着,如果该协议被扩展,那么所有已编写的每个IPv6头解析软件必须同时更新,以使用新的扩展。
那么,如果我不知道正在使用哪些扩展,如何解析IPv6标头?如果我不知道长度,如何跳过未知扩展的标头?