Опубликован: 30.07.2013 | Уровень: для всех | Доступ: платный
Лекция 9:

Управление групповым трафиком

Решив вопрос о совместимости на уровне отдельных полей, перейдем к совместимости формата сообщений в целом. По своему формату отчет MLDv2 в корне отличается от отчета MLDv1, так как он содержит переменное число записей о разных группах, а каждая запись имеет определенный тип и может содержать список источников. Лучшее, что мы можем сделать ради совместимости как однозначности интерпретации, — это полностью разделить отчеты MLDv1 и MLDv2. Для этого достаточно назначить отчету MLDv2 новый тип ICMPv6 (143).

Что же касается запросов, то их формат изменился не так радикально. Более того, он вполне отвечает модели расширения протокола MLD, когда новые данные помещаются в конец сообщения, после его совместимой части. Благодаря этому запрос MLDv2 может сохранить за собой тот же самый тип ICMPv6 (130). Если реализация поддерживает обе версии MLD, то ей просто определить версию запроса на входе: запрос MLDv1 всегда длиной 24 байта, тогда как длина запроса MLDv2 — от 28 байт и выше. Диапазон длин от 25 до 27 байт запретный и не отвечает никакой версии MLD.

Обратите внимание, что длина сообщения MLDv2 — как запроса, так и отчета — закодирована в самом сообщении. Поэтому отличить будущие версии от MLDv2 можно будет, только декодировав совместимую с MLDv2 часть.

Наконец, мы добрались до совместимого поведения сторон протокола. Здесь нас, в первую очередь, интересуют два случая: поведение слушателей MLDv1 в ответ на запросы MLDv2 и поведение маршрутизаторов MLDv2 в ответ на отчеты MLDv1. Это видно из таблиц совместимости Табл. 8.6 и Табл. 8.7.

Таблица 8.6. Совместимость слушателей MLD
Версия слушателя Запрос MLDv1 Запрос MLDv2
MLDv1 нет проблем как быть?
MLDv2 отчет MLDv1 нет проблем
Таблица 8.7. Совместимость маршрутизаторов MLD
Версия маршрутизатора Отчет или итог MLDv1 Отчет MLDv2
MLDv1 нет проблем проигнорирует
MLDv2 как быть? нет проблем

Слушатели MLDv2 не должны отвечать отчетами MLDv2 на запросы MLDv1 хотя бы потому, что маршрутизатор MLDv1 проигнорирует их ввиду неизвестного типа ICMPv6.

В первом случае слушатель ответит отчетом MLDv1 о данной группе, или же целой серией отчетов обо всех своих группах, если запрос был общий. Тогда маршрутизатор MLDv2 сможет взять на заметку, что на канале есть как минимум один слушатель MLDv1, и включить режим совместимости.

Это естественным порядком приводит нас ко второму случаю. Маршрутизатор MLDv2 как более современный легко декодирует сообщение MLDv1, поэтому вопрос состоит в том, насколько усложнит реализацию режим совместимости. В частности, понадобится ли маршрутизатору MLDv2 отдельный алгоритм реакции на сообщения MLDv1? К счастью, нет, потому что по содержащейся в них информации отчет и итог MLDv1 — это лишь подмножество многофункциональных отчетов MLDv2. На самом деле, мы об этом уже говорили, так что сейчас нам осталось только составить таблицу соответствия — Табл. 8.8.

Таблица 8.8. Апгрейд" сообщений MLDv1 до MLDv2
Сообщение MLDv1 Эквивалент MLDv2
Отчет IS_EX( \varnothing )
Итог TO_IN( \varnothing )

Благодаря такому соответствию, маршрутизатор MLDv2 может обрабатывать отчеты и итоги MLDv1 по уже готовым правилам протокола MLDv2.

Конечно, маршрутизатору MLDv2 придется учесть, что адрес назначения отчета или итога MLDv1 равен группе, о которой идет речь, а не FF02::16. Это не вызовет проблем, так как маршрутизатор ведет теневой прием всех групп и руководствуется, в первую очередь, опцией "сигнал маршрутизатору" в сообщениях MLD, а не их адресами назначения.

Помимо этих двух очевидных случаев взаимодействия сторон MLD, нам надо обратить внимание на "перекрестное опыление" слушателей и маршрутизаторов (Табл. 8.9). Ведь в принципе слушатели могут получать отчеты, а маршрутизаторы — запросы. К счастью, с первой частью проблем нет, так как отчеты MLDv2 направляются по специальному групповому адресу, и слушатели их не получат, независимо от их версии. Что касается реакции слушателя MLDv2 на отчет MLDv1, связанная с этим оптимизация (подавление отчетов) упразднена, и отчет можно безопасно игнорировать.

Тем не менее, слушателю MLDv2 не запрещено подавлять свои отчеты при получении чужих отчетов MLDv1 [§8.2.2 RFC 3810].

Таблица 8.9. Перекрестное опыление" слушателей MLD
Версия слушателя Отчет или итог MLDv1 Отчет MLDv2
MLDv1 нет проблем не получит
MLDv2 может игнорировать не получит

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

Поэтому, ради устойчивой работы сети, мы объявим нежелательной смешанную конфигурацию с использованием маршрутизаторов MLDv1 и MLDv2 на одном канале. Точнее, пусть маршрутизатор MLDv2 использует только запросы MLDv1, пока на том же канале есть маршрутизаторы MLDv1 [§8.3.1 RFC 3810]. Это приемлемый компромисс, так как маршрутизаторов меньше, чем хостов, а их взаимозаменяемость выше. Если обновление хостов — процесс долгий , трудоемкий и требующий поэтапного подхода, переключение подсети5 В старом смысле этого термина: транзитная инфраструктура сети. на MLDv2 можно провести за один шаг, например, путем установки на канал одного или нескольких новых групповых маршрутизаторов и временного отключения старых. Затем будет достаточно постепенно обновлять старые маршрутизаторы и возвращать их обратно в эксплуатацию.

Предложите решение для вот какой проблемы. Допустим, последний маршрутизатор MLDv1 только что убрали с канала. Но маршрутизаторы MLDv2, находясь в режиме совместимости, получают запросы MLDv1 друг от друга и потому пребывают в уверенности, что режим совместимости по-прежнему необходим. Могут ли маршрутизаторы MLDv2 самостоятельно выйти из режима совместимости, а если да, то как? (RFC предлагает ручную настройку.)

Сводная таблица совместимости между сторонами MLDv1 и MLDv2 будет такой, как показано в Табл. 8.10.

Таблица 8.10. Совместимость между сторонами MLD: сообщения какой версии использовать?
Хосты \downarrow \ Маршрутизаторы \to Только v1 Только v2 v1 и v2
Только v1 v1 Запросы v2, отчеты v1 v1
Только v2 v1 v2 v1
v1 и v2 v1 Запросы v2, отчеты v1 и v2 v1

А вот сравнительная таблица главных характеристик этих протоколов — Табл. 8.11.

Таблица 8.11. Сравнение возможностей MLDv1 и MLDv2
MLDv1 MLDv2
Типы сообщений ICMPv6 "запрос MLD" (130), "отчет MLD" (131), "итог MLD" (132) "запрос MLD" (130), "отчет MLDv2" (143)
Виды запроса Общий и ограниченный группой Общий; ограниченный группой; ограниченный группой и источником
Форма отчета Одна группа на сообщение Несколько групп на сообщение; каждую группу сопровождает режим фильтрации и список источников
Адрес назначения в отчете и итоге Объявляемая группа "Все маршрутизаторы MLDv2"
Выборы генератора запросов По адресу IP По адресу IP
Подавление избыточных отчетов Да Упразднено
Поддержка SSM и SFM Нет Да
Кодирование интервала таймера Целочисленное С плавающей точкой, обратно совместимое

Последним аспектом MLD, который мы не можем обойти вниманием, будет безопасность [§10 RFC 3810]. В какой степени этот протокол защищен от атак, и, с другой стороны, насколько опасны эти атаки? В отличие от ND, состояние стороны MLD зависит только от принятых ею сообщений MLD и не зависит от других внешних событий.

Напротив, состояние ND может зависеть от любых пакетов IPv6. Так, маршрутизатор обращается к модулю ND по приходу каждого транзитного пакета.

Поэтому единственный способ атаковать MLD — это подделка сообщений MLD. Главной мерой защиты от такой подделки будет изоляция канала от любых сообщений MLD извне. Действительно, по своему устройству MLD — стопроцентно внутриканальный протокол. Здесь можно пустить в ход весь арсенал доступных средств. Прежде всего, на выходе адрес источника сообщения MLD обязан быть внутриканальным за тем единственным исключением, что в отчете он может быть неопределенным. Тем не менее, отчеты с неопределенным адресом источника необходимы только для подготовки коммутаторов ЛВС на стадии SLAAC (§5.4.2) или DAD (§5.4.1), тогда как узлы IPv6 вполне могут игнорировать их на входе [§5.2.13 RFC 3810]. Действительно, сообщения ND, из которых состоят SLAAC и DAD, все равно не подлежат маршрутизации, и маршрутизаторам нет дела до членства слушателей в группах искомого узла и группе "все узлы канала". А позднее, когда узел назначит себе внутриканальный адрес, он повторит свои отчеты уже с определенным адресом источника. Поэтому на входе адрес источника в сообщении MLD должен быть внутриканальным, а иначе такое сообщение надо просто игнорировать.

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

Маршрутизаторам к тому же запрещено продвигать пакеты MLD куда бы то ни было. Продвижение MLD в другие каналы запрещено из соображений безопасности, а в тот же самый канал — ради устойчивости сети. Как мы уже отмечали, зацикливание группового трафика может иметь лавинный характер, когда каждая копия пакета рождает несколько копий следующего поколения и т.д. По этой причине MLD не защищают при помощи GTSM, а наоборот, устанавливают в пакетах MLD "предельное число шагов" равным 1. Ведь продвижение пакетов MLD в другие каналы уже заблокировано зонной архитектурой, тогда как продвижение в тот же самый канал она вполне допускает, как было сказано в §2.4.

Справившись с внешними врагами, мы можем перейти к врагам внутриканальным, а они, конечно, более опасны. Главная угроза исходит здесь от подделки или просто несанкционированной отправки запросов MLD. Для начала злоумышленник способен провести атаку на выборы генератора. Для этого ему достаточно вести передачу запросов с как можно меньшего внутриканального адреса, например, FE80:: или FE80::1. Заполучив роль генератора запросов, или параллельно с этой атакой, злоумышленник может подавить всякую маршрутизацию группового трафика в данный канал. Для этого ему достаточно периодически высылать запрос, ограниченный никому не интересной группой. Как нетрудно убедиться, в этом случае законные маршрутизаторы будут вечно пребывать в состоянии пассивных наблюдателей, а слушатели никогда не получат повод послать свои отчеты. В результате законные маршрутизаторы будут обманным способом убеждены в том, что никаких слушателей на канале просто нет.

На первый взгляд, такой атаке можно противопоставить модифицированную процедуру выборов, когда таймер OQPT перезапускается только по общему запросу. Однако у злодея в запасе есть ответный ход: слать общий запрос по адресу "все маршрутизаторы MLDv2", FF02::16. Маршрутизаторы обязаны принять и обработать такой запрос, как обычно [§5.1.15 RFC 3810]. В ответ злодею представим себе, что мы внесли поправку в протокол, и теперь общий запрос обязан быть адресован группе "все узлы", FF02::1. Тогда злодей разыграет козырь и пошлет такой запрос инкапсулированным в кадр Ethernet, где адрес назначения MAC равен 33-33-00-00-00-16. Благодаря фильтрации группового трафика на канальном уровне, в коммутируемой ЛВС такой кадр с большой вероятностью попадет только к маршрутизаторам MLDv26 Marc "vanHauser" Heuse. Recent advances in IPv6 insecurities. 27th Chaos Communication Congress. Berlin, 2010. http://events.ccc.de/congress/2010/Fahrplan/events/3957.en.html .

Практический рецепт против такой атаки — это не принимать пакеты с адреса FE80:: , потому что это зарезервированный в §6.1 адрес anycast, и вручную назначить законным маршрутизаторам наименьшие внутриканальные адреса: FE80::1, FE80::2 и т.д. Однако у злодея снова появится шанс, как только маршрутизатор FE80::1 выйдет из строя, например, из-за атаки типа "отказ в обслуживании".

В стратегической перспективе, достойный ответ атакам на MLD — это сертификация групповых маршрутизаторов аналогично SEND из §6.3.

В то же время, подделка отчетов MLD — это оксюморон, так как вступление в группу или просто начало ее приема — добровольная операция, доступная любому узлу канала. Конечно, злоумышленник может провести атаку типа "отказ в обслуживании", послав отчет о приеме большого числа групп, а вдобавок замести следы, подделав адрес источника. С первой частью этой атаки можно бороться, ограничив на маршрутизаторе число продвигаемых групп, — это все равно придется сделать из соображений устойчивости. Что касается подделки адреса источника, то здесь она не несет критической опасности, так как в MLD "личность" слушателя практически неважна, хотя ловить злоумышленника будет чуть сложнее.

Другое дело, что бесконтрольное вступление хостов в группы небезопасно и может привести, например, к утечке конфиденциального трафика. Чтобы управлять членством в группах, понадобится инфраструктура аутентификации и авторизации слушателей MLD. Альтернативное решение проблемы состоит в сквозной защите группового трафика [RFC 3740], а это лучше отвечает фундаментальному принципу TCP/IP: не рассчитывай на помощь транзитных узлов, если без нее можно обойтись.

Небезопасна и передача трафика группе, которую может вести любой источник. Режимы SFM и SSM сами по себе не делают ее безопасной, так как адрес источника можно подделать. Здесь тоже поможет система сквозной защиты, этакий "групповой IPsec".

Сергей Субботин
Сергей Субботин

"Теоретически канал с адресацией EUI 64 может соединить порядка 2^63 "

запись вида 2^63  не понятна и отнимает время на попытку ее осмыслить.

ее можно заменить например на записи вида  264  или 1,8 * 1019

 

Павел Афиногенов
Павел Афиногенов

Курс IPv6, в тексте имеются ссылки на параграфы. Разбиения курса на параграфы нет.

Александр Худышкин
Александр Худышкин
Россия
Константин Второв
Константин Второв
Россия, Бокситогорск, ЛГОУ им. А.С.Пушкина, 2003