ICMPv6 как единый служебный протокол IPv6: сообщения об ошибках, Neighbor Discovery Protocol (NDP), DAD, NUD и автонастройка через Router Advertisement.
Что такое Solicited-Node Multicast Address и чем он лучше ARP broadcast?
Через какие состояния проходит механизм NUD (Neighbor Unreachability Detection)?
Что означают флаги M=1 и O=0 в Router Advertisement?
Как IPv6 обеспечивает отказоустойчивость шлюза без протоколов HSRP/VRRP?
Что такое SEND и какую проблему он решает?
Какие флаги M и O в Router Advertisement соответствуют режиму чистого SLAAC?
Чем ICMPv6 отличается от ICMPv4 по своей роли?
NDP в IPv6 заменяет ARP — Neighbor Discovery Protocol выполняет аналогичные функции через ICMPv6
ICMPv6 — расширенная версия ICMP для IPv6, включающая NDP и автоконфигурацию
ICMPv6 и NDP: служебные сообщения IPv6, DAD, NUD — одна тема в двух курсах
ICMPv6 (Internet Control Message Protocol for IPv6) — служебный протокол, необходимый для корректной работы IPv6.
В IPv4 тоже был ICMP — его RFC имел номер 792, рядом с RFC 791 для самого IPv4. Номера неслучайно шли подряд: ICMP v4 был служебным протоколом, помогавшим IPv4 нормально существовать. Изначально он не задумывался как часть протокола, но уже на этапе стандартизации стало понятно, что без него никак.
Для IPv6 протокол ICMP уже является неотъемлемой частью протокола. Без него использовать IPv6 не получится. Все служебные механизмы, которые в IPv4 требовались отдельно, вынесены в этот специальный служебный протокол.
ICMPv6 имеет необычный код вложения. В IPv4 коды были такие:
| Протокол | Код в IPv4 | Код в IPv6 |
|---|---|---|
| ICMP | 1 | 58 |
| TCP | 6 | 6 |
| UDP | 17 | 17 |
| ESP | 50 | 50 |
| AH | 51 | 51 |
В IPv6 почти все коды сохранились, но единица зарезервирована под опции, а ICMPv6 получил новый номер Next Header = 58.
Формат заголовка аналогичен ICMPv4:
Контрольная сумма вычисляется от IP-заголовка по тому же принципу, что и в IPv4 — дополнение до единицы (Internet Checksum).
Все задачи, которые были в ICMP для IPv4, плюс дополнительные функции:
Тип сообщения указывает на глобальный характер содержимого. Старший бит определяет категорию:
Аналог типа 3 в ICMPv4. Генерируется, когда невозможно доставить пакет до получателя:
Далее уже кодом уточняется причина: недоступный порт UDP, отсутствие маршрута (no route to host), невозможность обнаружить канальный адрес получателя в connected-сети и т.д.
Специально отделен от Destination Unreachable. Если пакет не может пройти по линку из-за ограничения MTU, это не ошибка доставки — это указание отправителю переотправить пакет меньшего размера.
Сообщение содержит:
Например, вы отправляете пакет с MTU 1500, а на промежуточном линке MTU = 1400. Маршрутизатор возвращает Packet Too Big с указанием: "больше чем 1400 не пролезает". Отправитель заносит это в специальный список и при следующей отправке использует максимальный размер 1400 байт.
Таким образом, для каждого узла, с которым ведется взаимодействие, хранится отдельная запись о максимальном размере пакета (Path MTU Discovery).
Если у пакета закончился Hop Limit (аналог TTL), это тоже не ошибка доставки. Это означает, что пакет отправлен с недостаточными параметрами. Если бы отправитель выставил больший Hop Limit, пакет бы прошел.
Принципиальная разница:
Генерируется, когда пакет некорректно составлен. Например:
Другие пакеты до того же получателя при этом могут дойти нормально.
| Тип | Название | Назначение |
|---|---|---|
| 128 | Echo Request | Запрос ping |
| 129 | Echo Reply | Ответ на ping |
| 133 | Router Solicitation (RS) | Запрос информации о маршрутизаторах |
| 134 | Router Advertisement (RA) | Ответ маршрутизатора с настройками |
| 135 | Neighbor Solicitation (NS) | Запрос канального адреса соседа |
| 136 | Neighbor Advertisement (NA) | Ответ с канальным адресом |
| 137 | Redirect | Перенаправление трафика |
В IPv4 Echo Request имел тип 8, код 0, а Echo Reply — тип 0, код 0 (странно, что они совсем непохожи). В IPv6 типы 128 и 129 идут рядом.
NDP использует 5 типов сообщений: 133--137. Они делятся на две группы:
Если узел отправляет пакет маршрутизатору, а тот видит, что next hop находится в одной connected-среде с отправителем, маршрутизатор посылает Redirect. Узлу предлагается отправлять трафик напрямую на другой маршрутизатор, минуя промежуточный.
Это экономит ресурсы: без Redirect один и тот же пакет дважды проходит через интерфейс промежуточного маршрутизатора. Механизм существовал и в IPv4, но из-за проблем безопасности мало кто им пользовался. В IPv6 он сохранился, потому что в определенных ситуациях бывает полезен.
В NBMA-средах (например, Frame Relay) прямое взаимодействие между узлами может быть невозможно, и тогда Redirect не применяется.
В IPv4 для обнаружения канальных адресов использовался ARP с широковещательной рассылкой. Все узлы в сети вынуждены были обрабатывать каждый ARP-запрос.
В IPv6 широковещания нет. Можно было бы использовать мультикаст-адрес "все узлы" (FF02::1), но тогда все равно все бы напрягались, а реальный обладатель IP-адреса — только один.
Вместо этого IPv6 использует Solicited-Node Multicast Address (SNMA) — группу узлов, у которых IP-адреса заканчиваются на одинаковые 24 бита.
Формат SNMA:
FF02::1:FF00:0/104
FF — мультикаст02 — scope = link-local (в пределах канала)::1:FF — фиксированный префикс (104 бита)Пример: для адреса FE80::2AA:FF:FE28:9C5A последние 24 бита — 28:9C5A. SNMA-адрес: FF02::1:FF28:9C5A.
Если адреса генерируются по схеме Modified EUI-64, последние 24 бита берутся из части MAC-адреса (Vendor Assigned ID), которая назначается на заводе случайным образом. Вероятность совпадения последних 24 бит у двух устройств крайне мала. Поэтому в каждой SNMA-группе обычно находится всего один узел.
Даже если адреса назначены вручную и у нескольких узлов совпали хвосты — будет группа из 2--3 абонентов, а не все.
Мультикастовый IPv6-адрес отображается в мультикастовый MAC-адрес Ethernet по схеме:
33:33 + последние 4 байта IPv6-адреса
Для SNMA FF02::1:FF28:9C5A MAC-адрес будет: 33:33:FF:28:9C:5A.
Если коммутатор поддерживает MLD snooping, он доставит кадр только на нужные порты. Если не поддерживает — разошлет всем (Unknown Multicast Flooding), но конечные узлы отбросят кадр на канальном уровне, не тратя ресурсы на разбор IP.
На этом же механизме построена проверка адресов на конфликт. Когда узел хочет занять IP-адрес (назначенный вручную или придуманный автоматически):
:: (пустой, "я не знаю свой адрес") на SNMA-адрес проверяемого адресаПри DAD ответ (NA) идет из-под link-local на FF02::1 (все узлы), потому что запрашивающий не раскрыл свой адрес, и персонально ему ответить невозможно.
NUD — механизм обнаружения недоступности соседей. В IPv4 такого штатного механизма не было.
Если вы отправляете соседу данные по UDP и он не отвечает — непонятно, то ли приложение молчит, то ли сосед сдох. NUD решает эту задачу: отправляем NS, получаем NA — сосед живой; не получаем — сосед мертв.
Самый правильный способ проверить доступность соседа в одном канале — не ping, а NS/NA.
Если взаимодействие идет по TCP, протокол сам имеет встроенные таймеры проверки. Поэтому при наличии активного TCP-соединения сосед считается живым без дополнительных NS.
В IPv6 есть кэш Neighbor Discovery (аналог ARP-кэша в IPv4). Каждая запись может быть в одном из состояний:
| Состояние | Описание |
|---|---|
| Incomplete | NS отправлен, NA не получен. Нормальное взаимодействие невозможно |
| Reachable | Есть свежее свидетельство доступности (NA или TCP-ответ). Все в порядке |
| Stale | Таймер reachable time истек, но данные соседу не отправляются. Сидим на попе ровно |
| Delay | Отправили данные соседу в состоянии stale, ждем подтверждения. NS отправляется неагрессивно |
| Probe | Агрессивно отправляем пачку NS, ждем хотя бы один NA |
| (запись удалена) | Сосед признан недоступным |
NUD щупает только соседей в одном канале, но позволяет обнаружить проблемы и с удаленными узлами. Если узел A общается с узлом B через маршрутизатор R:
:: на FF02::2 (все маршрутизаторы)FF02::1 (все узлы)Маршрутизаторы периодически рассылают RA по расписанию (например, раз в 10 секунд). Но если узел проснулся и хочет получить настройки немедленно, он может отправить RS внепланово.
Внутри RA используются опции в формате TLV (Type, Length, Value). Ключевая опция — Prefix Information (тип 3, длина 4 блока по 8 байт = 32 байта).
Содержимое опции Prefix Information:
| Поле | Размер | Описание |
|---|---|---|
| Type | 1 байт | Значение: 3 |
| Length | 1 байт | Значение: 4 (блоков по 8 байт) |
| Prefix Length | 1 байт | Длина маски (например, 64) |
| Флаги L, A | 2 бита | См. ниже |
| Reserved | Нули | |
| Valid Lifetime | 4 байта | Время жизни адреса (в секундах) |
| Preferred Lifetime | 4 байта | Время в состоянии preferred (в секундах) |
| Reserved | 4 байта | Нули |
| Prefix | 16 байт | Сам префикс сети |
В одном RA может быть несколько опций Prefix Information — по одной на каждую сеть, настроенную на интерфейсе маршрутизатора.
Помимо опций, сам заголовок RA содержит:
| Поле | Описание |
|---|---|
| Cur Hop Limit | Рекомендуемый Hop Limit для клиентов |
| Флаги M, O | Управление DHCP (см. ниже) |
| Router Lifetime | Время жизни маршрутизатора как шлюза по умолчанию (в секундах). 0 = не использовать как шлюз |
| Reachable Time | Таймер для NUD: время, в течение которого сосед считается живым |
| Retransmission Timer | Интервал агрессивных проверок в NUD |
Router Lifetime должен быть заведомо больше интервала рассылки RA. Например, если RA рассылается раз в 10 секунд, Router Lifetime можно поставить 30--35 секунд. Тогда потеря 1--2 RA не приведет к удалению шлюза по умолчанию из таблицы маршрутизации клиентов, а 3 потерянные подряд RA означают, что маршрутизатор сдох.
Срок жизни маршрутизатора и срок жизни префиксов (Valid/Preferred Lifetime) — это разные вещи. Маршрутизатор может быть признан мертвым, но адреса из его префиксов продолжат жить по своим таймерам.
Даже при M = 1, если в RA есть Prefix Information с флагом A = 1, узел может придумать адрес и по SLAAC тоже. Конкретное поведение зависит от операционной системы.
Если M = 1, флаг O роли не играет — вы и так получите все настройки с DHCP-сервера вместе с адресом. Флаг O важен, когда M = 0: адрес придумываете сами через SLAAC, а за опциями идете на DHCPv6.
В IPv4 не было штатного механизма переключения между маршрутизаторами. Приходилось использовать протоколы FHRP (First Hop Redundancy Protocols):
Эти протоколы создают виртуальный MAC-адрес, который обслуживает один маршрутизатор, а второй стоит в резерве. При отказе основного резервный подхватывает работу. HSRP дополнительно умеет синхронизировать таблицы трансляции NAT между маршрутизаторами.
В IPv6 можно повесить один и тот же IP-адрес на два маршрутизатора — это штатное поведение:
FD00::/64)На Cisco для использования Subnet Router Anycast нужно указать ключевое слово anycast:
ipv6 address FD00::/64 anycast
Штатный механизм IPv6 обеспечивает переключение за ~5 секунд, даже при максимально агрессивных таймерах. Для субсекундного переключения по-прежнему нужны FHRP-протоколы (HSRP v2, VRRP, GLBP), которые все поддерживают IPv6 и могут обнаружить отказ за ~50 миллисекунд.
Но для обычной компании 5-секундная задержка при аварии вполне приемлема. Это дешевый механизм отказоустойчивости без дополнительных технологий.
Можно анонсировать с каждого маршрутизатора свой префикс. Клиенты получат адреса из обоих сетей и при отказе одного маршрутизатора переключатся на другой адрес. Менее элегантно, чем anycast, но работает.
В IPv4 ARP легко подделать — нет проверки, кто кому что послал. Любой мог заявить: "У меня такой IP, посылайте трафик мне."
В IPv6 та же проблема: если на канальном уровне мультикаст не поддерживается и NS/NA уходят широковещанием, злоумышленник может подслушать запрос и подделать ответ.
Теоретически можно защитить NDP с помощью IPsec, но для этого нужно прописать Security Associations попарно между всеми узлами. В сети из 100 узлов на каждом нужно настроить 99 записей с параметрами шифрования. Автоматически согласовать ключи (через IKE) невозможно — мы еще не знаем канальный адрес соседа. Поэтому IPsec для NDP абсолютно нецелесообразен.
SEND — механизм, позволяющий подписывать (не шифровать) сообщения Neighbor Discovery без IPsec. Основан на CGA (Cryptographically Generated Addresses):
На практике проще использовать вендорские механизмы защиты. Например, на оборудовании Cisco можно запретить прием NA от соседей, которые не могли легитимно получить заявленный IP-адрес.
ICMPv6 — ключевой протокол для работы IPv6. Он объединяет в себе функции, которые в IPv4 были разнесены по нескольким протоколам (ICMP, ARP, IGMP), и добавляет новые возможности: автонастройку адресов (SLAAC), обнаружение недоступности соседей (NUD), штатную отказоустойчивость шлюза по умолчанию через anycast.
В следующем уроке разбирается DHCPv6 — не все задачи DHCP из IPv4 можно решить средствами ICMPv6, и DHCPv6 позволяет делать некоторые вещи довольно удобно.