Разбор заголовков расширений 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, создавая новые заголовки расширений, но добавляя новые параметры назначения. Это должно быть тривиально или, по крайней мере, намного проще, чтобы вы имели дело с неизвестными параметрами назначения.