Piszę bardzo prosty filtr sieciowy i docieram do miejsca, w którym chcę przeanalizować nagłówki IPv6, aby dopasować takie rzeczy, jak typy ICMPv6, numery portów TCP / UDP itp.
Więc czytam dogłębnie o formacie pakietów IPv6 i jestem tak jakby… cóż… Musiałem czytać go w kółko, aby upewnić się, że właściwie czytam. Wydaje mi się, że musisz zacząć od 40-bajtowego stałego nagłówka i spojrzeć na jego następne pole nagłówka. Następnie musisz spojrzeć na następne pole nagłówka następnego nagłówka i tak dalej, jak połączona lista, aż dojdziesz do końca. Jeśli jest ładunek, to nastąpi.
Problem polega na tym, że nie ma pola długości ani w stałym nagłówku, ani w nagłówkach rozszerzeń. Musisz mieć tabelę typów nagłówków rozszerzeń i ich rozmiarów, abyś mógł ścigać tę połączoną listę do końca.
Wydaje mi się, że to dziwny, być może wręcz zającowy projekt. Co się stanie, jeśli napotkam nierozpoznany typ nagłówka rozszerzenia? Co ja robię? Nie znam jego długości. Myślę, że muszę wyrzucić pakiet i zablokować go, ponieważ w filtrze sieciowym przepuszczenie pakietu pozwoliłoby atakującemu na ominięcie filtru sieciowego poprzez włączenie fałszywego typu nagłówka. Ale to oznacza, że jeśli protokół zostanie kiedykolwiek rozszerzony, każdy pojedynczy fragment oprogramowania analizującego nagłówek IPv6, jaki kiedykolwiek został napisany, musi być jednocześnie aktualizowany, jeśli ma być używane nowe rozszerzenie.
Jak więc mogę przeanalizować nagłówki IPv6, jeśli nie znam rozszerzeń, których używają? Jak mogę pominąć nagłówek nieznanego rozszerzenia, skoro nie znam jego długości?
źródło
Odpowiedzi:
Jeśli napotkasz coś, czego nie możesz przeanalizować, musisz podjąć decyzję lub wykonać akcję na podstawie tego, co już przeanalizowałeś.
Projekt jest taki, ponieważ w IPv6 każdy nagłówek rozszerzenia „zawija” resztę pakietu. Jeśli widzisz nagłówek routingu, to nagłówek, o którym nigdy nie słyszałeś, a następnie ładunek, nie możesz przeanalizować ładunku. Znaczenie ładunku zależy w zasadzie od nagłówka, którego nie wiesz, jak zinterpretować.
Routery mogą kierować takie pakiety, ponieważ potrzebują tylko nagłówka routingu. Gadżety do głębokiej inspekcji pakietów i tym podobne muszą dużo wiedzieć, ale i tak taki jest ich los.
Edytowano w celu dodania: ten projekt oznacza, że middlebox może zmienić tylko to, co znają. Jeśli middlebox widzi nagłówek, którego nie zna, ma tylko dwie opcje: Odrzuć lub przekaż dalej. W IPv4 może również usunąć nieznane rozszerzenie i przekazać resztę. IMO ta właściwość sprawia, że projekt jest bardziej niż mniej rozszerzalny.
źródło
Z RFC 2460 :
źródło
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.
Niepoprawnie, ponieważ:
Tylko host docelowy może odrzucić na podstawie nierozpoznanych nagłówków rozszerzeń (z jednym wyjątkiem wymienionym w powiązanym pytaniu )
Jeśli twój nowy nagłówek rozszerzenia jest w jakiś sposób opcjonalny (lepiej, żeby był), otrzymasz komunikat o błędzie ICMP i możesz spróbować ponownie bez niego.
źródło
Aktualizacja RFC 6564 obejmuje ten przypadek. Przedstawia dokładnie opisywany przez ciebie scenariusz i przedstawia format dla wszelkich nowych nagłówków rozszerzeń (jeśli jakiekolwiek są kiedykolwiek zdefiniowane), z którymi boksy środkowe, takie jak twój, będą mogły pracować przynajmniej przez pewien czas.
Należy pamiętać, że celem protokołu IPv6 nie jest tworzenie nowych nagłówków rozszerzeń, ale dodawanie nowych opcji miejsca docelowego. Poradzenie sobie z opcjami nieznanego miejsca docelowego powinno być trywialne lub przynajmniej znacznie łatwiejsze.
źródło