Я пишу очень простой сетевой фильтр и добираюсь до места, где хочу проанализировать заголовки IPv6, чтобы они соответствовали таким вещам, как типы ICMPv6, номера портов TCP / UDP и т. Д.
Итак, я подробно читаю о формате пакетов IPv6 , и я вроде как ... ну ... мне как бы приходилось читать его снова и снова, чтобы убедиться, что я действительно читаю его правильно. Мне кажется, вам нужно начать с 40-байтового фиксированного заголовка и посмотреть на его следующее поле заголовка. Затем вы должны смотреть на следующее поле заголовка следующего заголовка и так далее, как на связанный список, пока не дойдете до конца. Если есть полезная нагрузка, она последует.
Проблема в том, что ни в фиксированном заголовке, ни в расширенных заголовках нет поля длины. У вас должна быть таблица типов заголовков расширений и их размеров, чтобы вы могли пройти этот связанный список до конца.
Мне это кажется странным, возможно, даже заячьим мозгом. Что делать, если я обнаружу нераспознанный тип заголовка расширения? Что мне делать? Я не знаю его длины. Я предполагаю, что мне нужно выбросить пакет и заблокировать его, поскольку в сетевом фильтре разрешение прохождения пакета позволит злоумышленнику уклониться от сетевого фильтра, включив фиктивный тип заголовка. Но это означает, что если протокол когда-либо будет расширен, каждая отдельная часть программного обеспечения для анализа заголовка IPv6, когда-либо написанная, должна быть одновременно обновлена, если новое расширение будет использоваться.
Итак, как я могу разобрать заголовки IPv6, если я не знаю, какие расширения они используют? Как пропустить заголовок для неизвестного расширения, если я не знаю его длины?
источник
Ответы:
Если вы столкнетесь с чем-то, что не можете разобрать, вам придется принять решение или выполнить действие на основе того, что вы уже проанализировали.
Дизайн таков, потому что в IPv6 каждый заголовок расширения «обертывает» остальную часть пакета. Если вы видите заголовок маршрутизации, затем какой-то заголовок, о котором вы никогда не слышали, затем полезную нагрузку, тогда вы не можете проанализировать полезную нагрузку. Значение полезной нагрузки в принципе зависит от заголовка, который вы не знаете, как интерпретировать.
Маршрутизаторы могут маршрутизировать такие пакеты, потому что им нужен только заголовок маршрутизации. Устройствам глубокой проверки пакетов и тому подобному нужно много знать, но в любом случае это их судьба.
Отредактировано для добавления: этот дизайн означает, что промежуточные ящики могут изменять только то, что они знают. Если промежуточный ящик видит заголовок, о котором он не знает, то у него есть только два варианта: отклонить или передать. В IPv4 он также может удалить неизвестное расширение и передать остальное. ИМО, это свойство делает дизайн более, чем менее расширяемым.
источник
Из RFC 2460 :
источник
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.
Неправильно, потому что:
Только хосту назначения разрешено отклонять на основе нераспознанных заголовков расширений (с одним исключением, упомянутым в вопросе, который вы связали )
Если ваш новый заголовок расширения каким-то образом является необязательным (лучше), вы получите сообщение об ошибке ICMP и сможете повторить попытку без него.
источник
Обновление RFC 6564 охватывает этот случай. Он точно описывает сценарий, который вы описываете, и предлагает формат для любых новых заголовков расширений (если они когда-либо были определены), с которыми промежуточные ящики, такие как ваш, смогут работать, по крайней мере, некоторое время.
Имейте в виду, что он предназначен не для расширения IPv6 путем создания новых заголовков расширения, а путем добавления новых параметров назначения. Это должно быть тривиально или, по крайней мере, намного проще для вас иметь дело с неизвестными вариантами назначения.
источник