Przetwarzanie nagłówków rozszerzeń IPv6 zawierających nieznane rozszerzenia

113

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?

AdamIerymenko
źródło
10
Na podstawie tego pytania wygląda na to, że nie jestem głupi i tak, czytam to dobrze: (w prawdziwym świecie) niemożliwe jest dodanie nowego nagłówka rozszerzenia do IPv6. stackoverflow.com/questions/9847923/…
AdamIerymenko
10
I tak, wydaje się również, że obliczanie długości nagłówka wymaga przejścia przez listę połączoną: stackoverflow.com/questions/14762193/ ... Nie zrozum mnie źle. IPv6 jest niesamowity i bardzo potrzebny. Ale to wciąż wydaje się szalone.
AdamIerymenko
3
Specyfikacja (link w górnym komentarzu) mówi, że routery nie powinny patrzeć na nagłówki, więc nie powinno się obchodzić, jakie nagłówki dodajesz. Tylko węzeł docelowy powinien patrzeć na nagłówki.
Anders E. Andersen
2
Tylko uwaga: „włosy z mózgiem” to dość myląca pisownia, a „zając mózg” powinno być preferowane (źródło: tfd )
pzkpfw
2
O ile istnieje tylko jedna poprawna pisownia, która brzmi „zając mózg”.
Alan B

Odpowiedzi:

33

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.

arnt
źródło
97

Co się stanie, jeśli napotkam nierozpoznany typ nagłówka rozszerzenia?

Z RFC 2460 :

Jeśli w wyniku przetwarzania nagłówka węzeł musi przejść do następnego nagłówka, ale wartość następnego nagłówka w bieżącym nagłówku jest nierozpoznana przez węzeł, powinien odrzucić pakiet i wysłać komunikat ICMP o problemie z parametrem do źródła pakietu , z wartością kodu ICMP równą 1 („napotkano nierozpoznany typ następnego nagłówka”) i polem wskaźnika ICMP zawierającym przesunięcie nierozpoznanej wartości w oryginalnym pakiecie. To samo należy wykonać, jeśli węzeł napotka wartość następnego nagłówka równą zero w dowolnym nagłówku innym niż nagłówek IPv6.

Oliver Charlesworth
źródło
15
Dobry. Myślałem, że tracę rozum. Więc tak, to naprawdę jest całkowicie nierozszerzalny projekt ... przynajmniej bez sygnalizacji w paśmie i innych hacków. Jest to wybaczalne w protokole aplikacji, w którym kontrolujesz oba końce i musisz brać pod uwagę tylko nowe wersje swojej aplikacji, ale nie w przypadku czegoś, co ma przetrwać ... setki lat?
AdamIerymenko
8
Możliwość ignorowania nieznanych nagłówków prowadziłaby do znacznie bardziej skomplikowanych problemów. (A co by było, gdyby pośredni proxy zmodyfikował nagłówki TCP bez wiedzy o hermetyzującym nagłówku ESP?) W tym przypadku prostota jest lepsza od „rozszerzalności”!
jman
4
@Max IPv6 ma dość dosłownie wystarczającą liczbę adresów, aby przypisać jeden do każdego atomu na Ziemi. Nie ma liczby tosterów podłączonych do Internetu, które wyczerpią tę przestrzeń.
Tyler McHenry,
8
@Max Nie powiem, że absolutnie nigdy nie będziemy potrzebować IPv7, ale dzięki IPv6 mamy wystarczająco dużo przestrzeni adresowej, aby nadać każdemu milimetrowi sześciennemu atmosfery ziemskiej (130 000 km w górę) unikalny adres ... 100 000 razy. Mam na myśli to, że kiedy zaczniemy kolonizować inne galaktyki, możemy mieć się czym martwić, ale do tego czasu powinniśmy być całkiem nieźli.
cincodenada
4
Brakuje 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.
jakiegoś
28

Dodanie nowego nagłówka rozszerzenia do IPv6 jest (w prawdziwym świecie) niemożliwe.

Niepoprawnie, ponieważ:

  1. Tylko host docelowy może odrzucić na podstawie nierozpoznanych nagłówków rozszerzeń (z jednym wyjątkiem wymienionym w powiązanym pytaniu )

  2. 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.

Andreas Klöckner
źródło
1
I jesteś pewien, że ten pakiet ICMP przejdzie przez NAT do faktycznego nadawcy?
Dexter,
5
@Dexter ipv6 zabije NAT ... miejmy nadzieję
Janus Troelsen
2
@Dexter: Te pakiety ICMP muszą przybyć z wielu powodów. Na przykład, jeśli zmniejszyła się wartość MTU potoku (być może nastąpiła enkapsulacja pakietów z powodu PPPoE lub VPN), a wysyłany pakiet jest za duży, pakiet ICMP zostanie zwrócony z informacją, że pakiet jest za duży.
Bill Lynch,
4
@JanusTroelsen nie wszyscy podzielają Twoje nadzieje.
Dexter,
4

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.

Michael Hampton
źródło