Я пишу очень простой сетевой фильтр и добираюсь до места, где хочу проанализировать заголовки IPv6, чтобы они соответствовали таким вещам, как типы ICMPv6, номера портов TCP / UDP и т. Д.
Итак, я подробно читаю о формате пакетов IPv6 , и я вроде как ... ну ... мне как бы приходилось читать его снова и снова, чтобы убедиться, что я действительно читаю его правильно. Мне кажется, вам нужно начать с 40-байтового фиксированного заголовка и посмотреть на его следующее поле заголовка. Затем вы должны смотреть на следующее поле заголовка следующего заголовка и так далее, как на связанный список, пока не дойдете до конца. Если есть полезная нагрузка, она последует.
Проблема в том, что ни в фиксированном заголовке, ни в расширенных заголовках нет поля длины. У вас должна быть таблица типов заголовков расширений и их размеров, чтобы вы могли пройти этот связанный список до конца.
Мне это кажется странным, возможно, даже заячьим мозгом. Что делать, если я обнаружу нераспознанный тип заголовка расширения? Что мне делать? Я не знаю его длины. Я предполагаю, что мне нужно выбросить пакет и заблокировать его, поскольку в сетевом фильтре разрешение прохождения пакета позволит злоумышленнику уклониться от сетевого фильтра, включив фиктивный тип заголовка. Но это означает, что если протокол когда-либо будет расширен, каждая отдельная часть программного обеспечения для анализа заголовка IPv6, когда-либо написанная, должна быть одновременно обновлена, если новое расширение будет использоваться.
Итак, как я могу разобрать заголовки IPv6, если я не знаю, какие расширения они используют? Как пропустить заголовок для неизвестного расширения, если я не знаю его длины?