Ich schreibe einen sehr einfachen Netzfilter und komme dahin, wo ich IPv6-Header analysieren möchte, um Dinge wie ICMPv6-Typen, TCP / UDP-Portnummern usw. abzugleichen.
Ich lese also ausführlich über das IPv6-Paketformat und ich denke, ich musste es immer wieder lesen, um sicherzugehen, dass ich es tatsächlich richtig gelesen habe. Mir scheint, Sie müssen mit dem festen 40-Byte-Header beginnen und sich das nächste Header-Feld ansehen. Dann müssen Sie sich das nächste Headerfeld des nächsten Headers usw. wie eine verknüpfte Liste ansehen, bis Sie das Ende erreichen. Wenn es Nutzlast gibt, wird es folgen.
Das Problem ist, dass weder im festen Header noch im Erweiterungsheader ein Längenfeld vorhanden ist. Sie müssen eine Tabelle mit Erweiterungsheadertypen und deren Größen haben, damit Sie diese verknüpfte Liste bis zum Ende verfolgen können.
Dies scheint mir ein seltsames, möglicherweise sogar hasenhirniges Design zu sein. Was passiert, wenn ich auf einen nicht erkannten Erweiterungsheadertyp stoße? Was mache ich? Ich weiß nicht, wie lang es ist. Ich denke, ich muss das Paket wegwerfen und blockieren, da in einem Netzfilter, der das Paket durchlässt, ein Angreifer dem Netzfilter ausweichen kann, indem er einen falschen Headertyp hinzufügt. Dies bedeutet jedoch, dass, wenn das Protokoll jemals erweitert wird, jede einzelne jemals geschriebene IPv6-Header-Parsing-Software gleichzeitig aktualisiert werden muss, wenn die neue Erweiterung verwendet werden soll.
Wie kann ich IPv6-Header analysieren, wenn ich die verwendeten Erweiterungen nicht kenne? Wie kann ich einen Header für eine unbekannte Erweiterung überspringen, da ich deren Länge nicht kenne?
quelle
Antworten:
Wenn Sie auf etwas stoßen, das Sie nicht analysieren können, müssen Sie Ihre Entscheidung treffen oder Ihre Aktion basierend auf dem ausführen, was Sie bereits analysiert haben.
Das Design ist so, weil in IPv6 jeder Erweiterungsheader den Rest des Pakets "umschließt". Wenn Sie den Routing-Header sehen, dann einen Header, von dem Sie noch nie gehört haben, dann die Nutzlast, dann können Sie die Nutzlast nicht analysieren. Die Bedeutung der Nutzlast hängt im Prinzip von dem Header ab, den Sie nicht interpretieren können.
Router können solche Pakete weiterleiten, da sie lediglich den Routing-Header benötigen. Deep Packet Inspection Gadgets und dergleichen müssen viel wissen, aber das ist sowieso ihr Schicksal.
Bearbeitet, um hinzuzufügen: Dieses Design bedeutet, dass Middleboxes nur das ändern können, was sie wissen. Wenn eine Middlebox einen Header sieht, den sie nicht kennt, hat sie nur zwei Möglichkeiten: Ablehnen oder Weitergeben. In IPv4 könnte es auch die unbekannte Erweiterung entfernen und den Rest weitergeben. IMO macht diese Eigenschaft das Design mehr als weniger erweiterbar.
quelle
Aus RFC 2460 :
quelle
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.
Falsch, weil:
Nur der Zielhost darf basierend auf nicht erkannten Erweiterungsheadern ablehnen (mit der einen Ausnahme, die in der von Ihnen verknüpften Frage erwähnt wird ).
Wenn Ihr neuer Erweiterungsheader in irgendeiner Weise optional ist (es sollte besser sein), erhalten Sie einen ICMP-Fehler darüber und können es ohne ihn erneut versuchen.
quelle
Das Update RFC 6564 deckt diesen Fall ab. Es beschreibt genau das von Ihnen beschriebene Szenario und legt ein Format für alle neuen Erweiterungsheader (falls vorhanden) fest, mit denen Middleboxen wie Ihre zumindest zeitweise arbeiten können.
Beachten Sie, dass IPv6 nicht durch Erstellen neuer Erweiterungsheader, sondern durch Hinzufügen neuer Zieloptionen erweitert werden soll. Es sollte trivial oder zumindest viel einfacher sein, mit unbekannten Zieloptionen umzugehen.
quelle