Разбор заголовков расширений IPv6, содержащих неизвестные расширения

Я пишу очень простой сетевой фильтр и добираюсь до места, где я хочу разбирать заголовки IPv6, чтобы соответствовать типам ICMPv6, номерам портов TCP/UDP и т.д.

Итак, я подробно читаю о формате пакета IPv6, и я вроде как... ну... Мне вроде как пришлось читать это снова и снова, чтобы убедиться, что я действительно читаю его правильно. Мне кажется, что вы должны начать с 40-байтового фиксированного заголовка и посмотреть его следующее поле заголовка. Затем вам нужно посмотреть следующее поле заголовка следующего заголовка и т.д., Как связанный список, до тех пор, пока вы не достигнете конца. Если есть полезная нагрузка, она будет следовать.

Проблема заключается в том, что поле длины не существует ни в фиксированном заголовке, ни в заголовках расширений. У вас должна быть таблица типов заголовков расширений и их размеры, чтобы вы могли преследовать этот связанный список до конца.

Это поражает меня как странный, возможно, даже модный дизайн. Что делать, если я сталкиваюсь с непризнанным типом заголовка расширений? Что я делаю? Я не знаю его длины. Думаю, мне нужно выбросить пакет и заблокировать его, поскольку в сетевом фильтре, разрешающем сквозной пакет, позволит злоумышленнику уклониться от сетевого фильтра, включив поддельный тип заголовка. Но это означает, что если протокол когда-либо расширяется, каждый отдельный файл программного обеспечения для разбора заголовков IPv6, когда-либо написанный, должен быть одновременно обновлен, если будет использоваться новое расширение.

Итак, как я могу разобрать заголовки IPv6, если не знаю, какие расширения они используют? Как я могу пропустить заголовок для неизвестного расширения, так как я не знаю его длины?

Ответ 1

Если вы столкнулись с чем-то, что вы не можете проанализировать, вы должны принять решение или выполнить свое действие на основе того, что вы уже проанализировали.

Конструкция такова, потому что в IPv6 каждый заголовок расширения "обертывает" остальную часть пакета. Если вы видите заголовок маршрутизации, то какой-то заголовок, о котором вы никогда не слышали, а затем полезную нагрузку, тогда вы не можете разобрать полезную нагрузку. Значение полезной нагрузки в принципе зависит от заголовка, который вы не знаете, как интерпретировать.

Маршрутизаторы могут маршрутизировать такие пакеты, потому что все, что им нужно, это заголовок маршрутизации. Глубокие пакеты контроля пакетов и т.д. Должны знать много, но тогда их судьба в любом случае.

Отредактировано для добавления: этот проект означает, что средние поля могут изменять только то, что они знают. Если middlebox видит заголовок, который он не знает, он имеет только два варианта: Отклонить или передать. В IPv4 он также может удалить неизвестное расширение и передать остальные. ИМО это свойство делает дизайн более, а не менее расширяемым.

Ответ 2

Что делать, если я встречаю непризнанный тип заголовка расширения?

Из RFC 2460:

Если в результате обработки заголовка требуется выполнить node   к следующему заголовку, но значение следующего заголовка в текущем заголовке    непризнанный node, , он должен отбросить пакет и отправить    ICMP Параметр Сообщение об ошибке для источника пакета, с    Значение ICMP-кода 1 ( "непризнанный следующий тип заголовка встречен" )    и поле ICMP Pointer, содержащее смещение нераспознанного    значение в исходном пакете. Те же действия следует предпринять, если    a node встречает значение следующего заголовка нуля в любом заголовке другого    чем заголовок IPv6.

Ответ 3

В реальном мире невозможно добавить новый заголовок расширения в IPv6.

Неверно, потому что:

  • Только хост-получатель может отклоняться на основе недопустимых заголовков расширений (с этим единственным исключением, упомянутым в связанном вами вопросе)

  • Если ваш новый заголовок расширения каким-то образом является необязательным (это было бы лучше), вы получите ошибку ICMP об этом и можете попробовать снова без него.

Ответ 4

В этом случае рассматривается обновление RFC 6564. Он описывает именно тот сценарий, который вы описываете, и предлагает формат для любых новых расширительных заголовков (если они когда-либо определены), с которыми могут взаимодействовать средние поля, такие как ваши, по крайней мере, некоторое время.

Имейте в виду, что он не предназначен для расширения IPv6, создавая новые заголовки расширений, но добавляя новые параметры назначения. Это должно быть тривиально или, по крайней мере, намного проще, чтобы вы имели дело с неизвестными параметрами назначения.