Протокол обнаружения соседей IPv6 (NDP): Как устройства находят друг друга
Глубокое погружение в NDP — протокол, заменяющий ARP в IPv6. Узнайте о Router Solicitation, Neighbor Solicitation и механизме разрешения адресов.
NDP заменяет больше, чем просто ARP#
В IPv4 разрешение адресов использует ARP — отдельный протокол второго уровня. Обнаружение маршрутизаторов использует ICMP Router Discovery или DHCP. Сообщения перенаправления используют ICMP. Обнаружение дублирующихся адресов вообще не существует.
IPv6 объединяет все эти функции в протокол обнаружения соседей. NDP обрабатывает:
- Разрешение адресов (работа ARP)
- Обнаружение маршрутизаторов (поиск шлюзов по умолчанию)
- Обнаружение префиксов (изучение сетевых префиксов для автоконфигурации)
- Обнаружение параметров (MTU, hop limit)
- Автоконфигурация адресов (SLAAC)
- Обнаружение дублирующихся адресов (предотвращение конфликтов)
- Доступность соседей (доступен ли мой сосед?)
- Определение следующего транзитного узла (какой маршрутизатор использовать?)
- Сообщения перенаправления (существуют лучшие маршруты)
NDP работает полностью поверх ICMPv6, используя пять типов сообщений (133—137). Это не опция. Заблокируйте NDP, и IPv6 перестанет работать.
TL;DR - Краткое резюме
Ключевые моменты:
- NDP объединяет ARP, обнаружение маршрутизаторов и автоконфигурацию в один протокол, работающий поверх ICMPv6
- Пять типов сообщений (133-137) обрабатывают всё от разрешения адресов до объявлений маршрутизаторов
- Безопасность: Все сообщения NDP требуют Hop Limit 255 для предотвращения атак извне канала
Перейти к: Router Advertisement для деталей SLAAC, Разрешение адресов в действии для практических примеров, или Устранение проблем для распространённых проблем.
Пять типов сообщений NDP#
Все сообщения NDP являются пакетами ICMPv6 с определёнными номерами типов. Понимание этих пяти сообщений означает понимание того, как работают сети IPv6 на фундаментальном уровне.
| Тип | Название | Отправитель | Назначение | Получатель |
|---|---|---|---|---|
| 133 | Router Solicitation (RS) | Хосты | Запрос информации о маршрутизаторе | ff02::2 (all-routers) |
| 134 | Router Advertisement (RA) | Маршрутизаторы | Объявление присутствия и конфигурации | ff02::1 (all-nodes) или unicast |
| 135 | Neighbor Solicitation (NS) | Любой узел | Разрешение адресов, проверка доступности | Solicited-node multicast или unicast |
| 136 | Neighbor Advertisement (NA) | Любой узел | Ответ на NS | Unicast или ff02::1 |
| 137 | Redirect | Маршрутизаторы | Существует лучший следующий транзитный узел | Unicast (исходный отправитель) |
Каждое сообщение NDP имеет общее требование безопасности: Hop Limit должен быть 255. Это предотвращает атаки извне, так как маршрутизаторы уменьшают hop limit. Пакеты от удалённых атакующих приходят с hop limit < 255 и отбрасываются.
Router Solicitation (Тип 133)#
Хосты отправляют Router Solicitation, когда хотят, чтобы маршрутизаторы объявили о себе немедленно, вместо ожидания следующего запланированного Router Advertisement.
Структура ICMPv6:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
| (133) | (0) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-Поля:
- Type: 133
- Code: 0
- Reserved: 32 бита, должно быть нулевым
- Options: Source Link-Layer Address (опционально, включать, если адрес источника не ::)
Когда отправляется:
- Интерфейс поднимается
- Хост загружается
- IPv6-стек инициализируется
- Хосту нужна конфигурация быстро
Адрес источника:
- Link-local адрес (если настроен)
- :: (неопределённый, если адреса ещё нет)
Назначение: ff02::2 (multicast-адрес всех маршрутизаторов)
Hop Limit: 255 (обязательно)
Пример пакета:
IPv6 Header:
Source: fe80::a4b2:c3d4:e5f6:7890
Destination: ff02::2
Next Header: 58 (ICMPv6)
Hop Limit: 255
ICMPv6:
Type: 133 (Router Solicitation)
Code: 0
Options:
Source Link-Layer Address: 00:1a:2b:3c:4d:5eОграничение скорости:
Хосты не должны отправлять Router Solicitation слишком часто. RFC 4861 рекомендует максимум одно в 3 секунды. Это предотвращает перегрузку маршрутизаторов во время нестабильности сети.
Почему это важно:
Без RS хосты ждали бы периодических Router Advertisement (отправляемых каждые несколько минут). RS позволяет хостам получить конфигурацию за секунды вместо минут, ускоряя инициализацию сети.
Router Advertisement (Тип 134)#
Маршрутизаторы отправляют Router Advertisement для объявления своего присутствия, рекламы сетевых префиксов и предоставления параметров конфигурации. Это основа Stateless Address Autoconfiguration (SLAAC).
Структура ICMPv6:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
| (134) | (0) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Cur Hop Limit |M|O|H|Prf|Resvd| Router Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reachable Time |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Retrans Timer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-Поля:
Cur Hop Limit (8 бит): Рекомендуемое значение для поля Hop Limit в исходящих пакетах. Обычно 64. Хосты копируют это в поле Hop Limit заголовка IPv6.
Флаги (8 бит):
- M (Managed Address Configuration): Использовать DHCPv6 для адресов
- O (Other Configuration): Использовать DHCPv6 для другой конфигурации (DNS, NTP и т.д.)
- H (Home Agent): Маршрутизатор является home agent для mobile IPv6 (редко используется)
- Prf (Router Preference): 2-битное предпочтение (00=среднее, 01=высокое, 11=низкое)
- Reserved: 3 бита
Router Lifetime (16 бит): Как долго (в секундах) использовать этот маршрутизатор в качестве шлюза по умолчанию. 0 означает «не шлюз по умолчанию». Максимум 9000 секунд (2,5 часа).
Reachable Time (32 бита): Как долго (в миллисекундах) считать соседа доступным после получения подтверждения доступности. 0 означает неопределённое (использовать значение по умолчанию или ранее полученное).
Retrans Timer (32 бита): Время между повторными передачами Neighbor Solicitation (в миллисекундах). Используется для разрешения адресов и Neighbor Unreachability Detection.
Распространённые опции:
Source Link-Layer Address (Type 1): MAC-адрес маршрутизатора. Позволяет хостам пропустить Neighbor Solicitation для маршрутизатора.
MTU (Type 5): Рекомендуемый MTU для канала. Обычно 1500.
Prefix Information (Type 3): Сетевые префиксы для автоконфигурации адресов. Это критическая опция для SLAAC.
RDNSS (Type 25): Адреса рекурсивных DNS-серверов. RFC 8106.
DNSSL (Type 31): Список поиска DNS. RFC 8106.
Когда отправляется:
- Периодически (каждые 200—600 секунд, обычно 200)
- В ответ на Router Solicitation
- При изменении конфигурации маршрутизатора
Источник: Link-local адрес маршрутизатора (fe80::/10)
Назначение:
- ff02::1 (multicast всех узлов) для периодических объявлений
- Unicast запрашивающему хосту при ответе на RS
Hop Limit: 255 (обязательно)
Пример пакета:
IPv6 Header:
Source: fe80::1
Destination: ff02::1
Next Header: 58 (ICMPv6)
Hop Limit: 255
ICMPv6:
Type: 134 (Router Advertisement)
Code: 0
Cur Hop Limit: 64
Flags: M=0, O=0 (только SLAAC)
Router Lifetime: 1800 секунд (30 минут)
Reachable Time: 30000 мс
Retrans Timer: 1000 мс
Options:
Source Link-Layer Address: 00:11:22:33:44:55
MTU: 1500
Prefix Information:
Prefix: 2001:db8:1234:5678::/64
Valid Lifetime: 86400 (24 часа)
Preferred Lifetime: 14400 (4 часа)
Flags: L=1 (on-link), A=1 (автономный/SLAAC)
RDNSS:
Lifetime: 3600
Addresses: 2001:4860:4860::8888, 2001:4860:4860::8844Комбинации флагов:
| M | O | Поведение |
|---|---|---|
| 0 | 0 | Только SLAAC, без DHCPv6 (наиболее распространённое) |
| 0 | 1 | SLAAC для адресов, DHCPv6 для DNS/NTP и т.д. |
| 1 | 0 | DHCPv6 для адресов (необычно, редко используется) |
| 1 | 1 | DHCPv6 для всего (корпоративные сети) |
Опция Prefix Information:
Эта опция делает возможным SLAAC. Она сообщает хостам, какой сетевой префикс использовать при автоконфигурации адресов.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length | Prefix Length |L|A|R|Reserved1|
| (3) | (4) | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Valid Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Preferred Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Prefix +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Поля:
- Prefix Length: Обычно 64 для SLAAC
- L flag: On-link (префикс находится в локальном канале)
- A flag: Автономный (использовать для SLAAC)
- R flag: Router Address (префикс содержит interface ID маршрутизатора)
- Valid Lifetime: Как долго адреса действительны (обычно 86400 = 24 часа)
- Preferred Lifetime: Как долго использовать адреса для новых соединений (обычно 14400 = 4 часа)
- Prefix: Фактический сетевой префикс (например, 2001:db8:1234:5678::)
Когда A=1, хосты генерируют адреса, комбинируя префикс с идентификатором интерфейса:
Префикс из RA: 2001:db8:1234:5678::/64
Interface ID: a4b2:c3d4:e5f6:7890 (полученный из MAC или случайный)
Результирующий адрес: 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890Router Advertisement критически важны
Заблокируйте ICMPv6 тип 134, и SLAAC перестанет работать. У хостов будут только link-local адреса (fe80::/10) без глобальной связности. Это одна из самых распространённых ошибок конфигурации IPv6 — межсетевые экраны, блокирующие весь ICMPv6 без понимания, какие типы являются обязательными.
Neighbor Solicitation (Тип 135)#
Neighbor Solicitation — это замена ARP в IPv6. Он разрешает IPv6-адреса в адреса канального уровня (MAC) и проверяет, что соседи всё ещё доступны.
Структура ICMPv6:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
| (135) | (0) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Target Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-Поля:
- Type: 135
- Code: 0
- Reserved: 32 бита, должно быть нулевым
- Target Address: Запрашиваемый IPv6-адрес
- Options: Source Link-Layer Address (включается, если источник не ::)
Три варианта использования:
1. Разрешение адресов (замена ARP)#
Хост A должен отправить пакет хосту B в том же канале, но не знает MAC-адрес B.
Процесс:
- A проверяет свой кэш соседей — нет записи для B
- A отправляет NS на solicited-node multicast-адрес B
- B получает NS и отвечает NA, содержащим его MAC
- A кэширует отображение и отправляет исходный пакет
Пример:
# Хост A хочет отправить на 2001:db8::10
IPv6 Header:
Source: 2001:db8::1
Destination: ff02::1:ff00:10 (solicited-node multicast)
Hop Limit: 255
ICMPv6:
Type: 135 (Neighbor Solicitation)
Target Address: 2001:db8::10
Options:
Source Link-Layer Address: 00:1a:2b:3c:4d:5eВычисление solicited-node multicast-адреса:
IPv6 использует solicited-node multicast вместо широковещания для эффективности. Только хосты с похожими адресами слушают каждую solicited-node группу.
Формула: ff02::1:ff + последние 24 бита целевого адреса
Примеры:
2001:db8::10 -> ff02::1:ff00:10
2001:db8::a4b2:c3d4:e5f6:7890 -> ff02::1:ff:f6:7890
fe80::1 -> ff02::1:ff00:1Это уменьшает ненужную обработку. В IPv4 широковещательные ARP достигают каждого хоста в сети. В IPv6 только хосты, чьи адреса заканчиваются теми же 24 битами, присоединяются к multicast-группе и получают NS.
2. Neighbor Unreachability Detection (NUD)#
Проверка того, что ранее доступный сосед всё ещё доступен.
Процесс:
- Хост недавно не получал трафик от соседа
- Хост отправляет NS (unicast) соседу
- Если получен NA, сосед доступен
- Если нет ответа после повторов, сосед считается недоступным
Пример:
IPv6 Header:
Source: 2001:db8::1
Destination: 2001:db8::10 (unicast соседу)
Hop Limit: 255
ICMPv6:
Type: 135 (Neighbor Solicitation)
Target Address: 2001:db8::10
Options:
Source Link-Layer Address: 00:1a:2b:3c:4d:5eNUD работает автоматически в фоновом режиме. Когда хосты отправляют трафик, они отслеживают, отвечают ли соседи. Если сосед молчит, NUD проверяет доступность, прежде чем объявить его мёртвым.
3. Duplicate Address Detection (DAD)#
Перед использованием IPv6-адреса хосты выполняют DAD, чтобы убедиться, что ни один другой узел не использует его. Это предотвращает конфликты адресов в SLAAC.
Процесс:
- Хост генерирует предварительный адрес (через SLAAC, DHCPv6 или ручную настройку)
- Хост отправляет NS с источником :: и целью = предварительный адрес
- Если кто-то отвечает NA, адрес уже используется (конфликт)
- Если нет ответа после таймаута, адрес уникален и может использоваться
Пример:
# Хост хочет использовать 2001:db8::a4b2:c3d4:e5f6:7890
# Сначала отправляет DAD NS
IPv6 Header:
Source: :: (неопределённый адрес — у хоста ещё нет адреса)
Destination: ff02::1:ff:f6:7890 (solicited-node multicast)
Hop Limit: 255
ICMPv6:
Type: 135 (Neighbor Solicitation)
Target Address: 2001:db8::a4b2:c3d4:e5f6:7890
Options: (нет — источник ::)Если другой хост использует этот адрес, он отправляет Neighbor Advertisement. Запрашивающий хост обнаруживает конфликт и должен выбрать другой адрес.
Таймаут DAD: Обычно 1 секунда. Хост ждёт этого времени для ответа. Если тишина, адрес считается уникальным.
Проблема безопасности: DAD не имеет аутентификации. Атакующий может отвечать на каждый запрос DAD, предотвращая настройку адресов хостами. Это называется DAD DoS-атакой. Решения включают SEND (Secure Neighbor Discovery) или RA Guard, но их внедрение ограничено.
Neighbor Advertisement (Тип 136)#
Отправляется в ответ на Neighbor Solicitation или незапрошенным для объявления изменений адреса/канального уровня.
Структура ICMPv6:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
| (136) | (0) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R|S|O| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Target Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-Поля:
Флаги:
- R (Router): Отправитель является маршрутизатором
- S (Solicited): Объявление является ответом на NS
- O (Override): Переопределить существующую запись кэша
Target Address: Адрес, для которого отправляется это объявление
Опции: Target Link-Layer Address (MAC-адрес)
Когда отправляется:
- Ответ на Neighbor Solicitation (S=1)
- Незапрошенное объявление изменения адреса (S=0)
- Gratuitous NA для обновления соседей после изменения адреса канального уровня
Назначение:
- Unicast запросившему узлу (при ответе на NS)
- ff02::1 (all-nodes) для незапрошенных объявлений
Hop Limit: 255 (обязательно)
Пример ответа на NS:
IPv6 Header:
Source: 2001:db8::10
Destination: 2001:db8::1 (unicast запросившему)
Hop Limit: 255
ICMPv6:
Type: 136 (Neighbor Advertisement)
Flags: R=0, S=1 (запрошенный ответ), O=1 (переопределить)
Target Address: 2001:db8::10
Options:
Target Link-Layer Address: 00:aa:bb:cc:dd:eeЗначения флагов:
S=1: Это ответ на ваш NS. Обновите ваш кэш.
S=0: Незапрошенное объявление. Я что-то изменил.
O=1: Переопределите вашу существующую запись кэша этой информацией.
O=0: Обновляйте кэш только если записи не существует.
Пример незапрошенного NA:
Хост меняет свой MAC-адрес (редко, но случается с виртуальными машинами или переконфигурацией интерфейса). Он отправляет незапрошенный NA для обновления соседей:
IPv6 Header:
Source: 2001:db8::10
Destination: ff02::1 (all-nodes)
Hop Limit: 255
ICMPv6:
Type: 136 (Neighbor Advertisement)
Flags: R=0, S=0 (незапрошенный), O=1 (переопределить)
Target Address: 2001:db8::10
Options:
Target Link-Layer Address: 00:ff:ee:dd:cc:bb (новый MAC)Все соседи получают это и обновляют свои кэши.
Redirect (Тип 137)#
Маршрутизаторы отправляют сообщения Redirect для информирования хостов о том, что существует лучший маршрутизатор первого транзитного узла для конкретного назначения.
Структура ICMPv6:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
| (137) | (0) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Target Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Destination Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-Поля:
- Type: 137
- Code: 0
- Target Address: Лучший следующий транзитный маршрутизатор (или назначение, если on-link)
- Destination Address: Назначение, которое должно использовать лучший маршрут
- Options: Target Link-Layer Address, Redirected Header (часть исходного пакета)
Когда отправляется:
Маршрутизатор R1 получает пакет от хоста A, предназначенный хосту B. R1 знает, что маршрутизатор R2 (в том же канале, что и A) является лучшим следующим транзитным узлом для B. R1 перенаправляет пакет R2 И отправляет Redirect A, говоря ему использовать R2 непосредственно в будущем.
Пример сценария:
Топология сети:
Хост A: 2001:db8:1::10
Маршрутизатор R1: 2001:db8:1::1 (шлюз по умолчанию для A)
Маршрутизатор R2: 2001:db8:1::2 (лучший маршрут к 2001:db8:2::/64)
Назначение B: 2001:db8:2::20
Поток:
1. A отправляет пакет B через R1 (шлюз по умолчанию)
2. R1 видит, что R2 — лучший следующий транзитный узел для 2001:db8:2::/64
3. R1 перенаправляет пакет R2
4. R1 отправляет Redirect A:
Target Address: 2001:db8:1::2 (R2)
Destination Address: 2001:db8:2::20 (B)
5. A обновляет таблицу маршрутизации: использовать R2 для 2001:db8:2::/64
6. Будущие пакеты A к B идут напрямую к R2Сообщение Redirect от R1 к A:
IPv6 Header:
Source: fe80::1 (Link-local R1)
Destination: 2001:db8:1::10 (Хост A)
Hop Limit: 255
ICMPv6:
Type: 137 (Redirect)
Target Address: fe80::2 (R2 — лучший следующий транзитный узел)
Destination Address: 2001:db8:2::20 (B — назначение для достижения через R2)
Options:
Target Link-Layer Address: 00:11:22:33:44:55 (MAC R2)
Redirected Header: (заголовок исходного пакета, вызвавшего redirect)Соображения безопасности:
Сообщения Redirect могут быть злоупотреблены. Атакующий в локальном канале мог отправлять вредоносные Redirect для:
- Направления трафика через машину атакующего (человек посередине)
- Блокировки трафика путём перенаправления на несуществующий маршрутизатор
- Создания петель маршрутизации
Защита:
- SEND (Secure Neighbor Discovery) аутентифицирует сообщения Redirect
- Многие хосты игнорируют Redirect от маршрутизаторов, не являющихся шлюзом по умолчанию
- Некоторые сознательные к безопасности сети полностью отключают обработку Redirect
- Redirect должны приходить от текущего маршрутизатора первого транзитного узла (проверяется хостами)
Стоит ли разрешать Redirect?
Домашние/малые сети: Безопасно. Оптимизирует маршрутизацию при наличии нескольких маршрутизаторов.
Корпоративные сети: Часто отключено. Контролируемые таблицы маршрутизации и потенциальные риски безопасности перевешивают выгоды.
Центры обработки данных: Обычно отключено. Статическая маршрутизация или динамические протоколы (BGP, OSPF) управляют маршрутами.
Разрешение адресов в действии#
Давайте проследим полный процесс отправки пакета хостом A хосту B в том же канале.
Начальное состояние:
- Хост A: 2001:db8::1 (MAC: aa:aa:aa:aa:aa:aa)
- Хост B: 2001:db8::10 (MAC: bb:bb:bb:bb:bb:bb)
- Кэш соседей A пуст
Шаг 1: Приложение инициирует соединение
# На хосте A
ping6 2001:db8::10Шаг 2: Проверка кэша соседей
# A проверяет кэш соседей
ip -6 neigh show 2001:db8::10
# (пусто — нет записи)Шаг 3: Отправка Neighbor Solicitation
A отправляет NS на solicited-node multicast-адрес:
IPv6 Header:
Source: 2001:db8::1
Destination: ff02::1:ff00:10 (solicited-node для 2001:db8::10)
Hop Limit: 255
Ethernet Header:
Source MAC: aa:aa:aa:aa:aa:aa
Dest MAC: 33:33:ff:00:00:10 (multicast MAC для ff02::1:ff00:10)
ICMPv6:
Type: 135 (Neighbor Solicitation)
Target Address: 2001:db8::10
Options:
Source Link-Layer Address: aa:aa:aa:aa:aa:aaШаг 4: B получает NS
Хост B слушает ff02::1:ff00:10 (потому что его адрес заканчивается на :10). Он получает NS и обрабатывает его.
Шаг 5: B отправляет Neighbor Advertisement
IPv6 Header:
Source: 2001:db8::10
Destination: 2001:db8::1 (unicast A)
Hop Limit: 255
Ethernet Header:
Source MAC: bb:bb:bb:bb:bb:bb
Dest MAC: aa:aa:aa:aa:aa:aa
ICMPv6:
Type: 136 (Neighbor Advertisement)
Flags: R=0, S=1 (запрошенный), O=1 (переопределить)
Target Address: 2001:db8::10
Options:
Target Link-Layer Address: bb:bb:bb:bb:bb:bbШаг 6: A обновляет кэш соседей
# Кэш соседей A теперь имеет запись
ip -6 neigh show 2001:db8::10
# 2001:db8::10 dev eth0 lladdr bb:bb:bb:bb:bb:bb REACHABLEШаг 7: A отправляет исходный пакет
Теперь, когда A знает MAC B, он отправляет пакет ping:
IPv6 Header:
Source: 2001:db8::1
Destination: 2001:db8::10
Ethernet Header:
Source MAC: aa:aa:aa:aa:aa:aa
Dest MAC: bb:bb:bb:bb:bb:bb (изучен из NA)
ICMPv6:
Type: 128 (Echo Request)Общее время: Миллисекунды. Процесс невидим для приложений.
Состояния кэша соседей#
Записи кэша соседей проходят через несколько состояний, когда NUD отслеживает доступность.
| Состояние | Значение | Следующее действие |
|---|---|---|
| INCOMPLETE | NS отправлен, ожидание NA | Таймаут или получение NA |
| REACHABLE | NA получен недавно, подтверждена доступность | Отправка трафика или таймаут |
| STALE | Запись старая, недавно не подтверждена | Отправка трафика (запускает проверку) |
| DELAY | Трафик отправлен устаревшей записи, ожидание | Таймаут запускает проверку |
| PROBE | Отправка NS для проверки доступности | Получение NA или таймаут |
| FAILED | Нет ответа на проверки | Удаление записи |
Переходы состояний:
INCOMPLETE --получен NA--> REACHABLE
REACHABLE --таймаут--> STALE
STALE --отправлен трафик--> DELAY
DELAY --таймаут--> PROBE
PROBE --получен NA--> REACHABLE
PROBE --таймаут--> FAILEDПроверка кэша соседей (Linux):
ip -6 neigh show
# Пример вывода:
# 2001:db8::1 dev eth0 lladdr aa:aa:aa:aa:aa:aa REACHABLE
# 2001:db8::10 dev eth0 lladdr bb:bb:bb:bb:bb:bb STALE
# fe80::1 dev eth0 lladdr cc:cc:cc:cc:cc:cc DELAYТаймеры:
- Таймаут REACHABLE: 30 секунд (настраивается, из RA Reachable Time)
- Таймаут DELAY: 5 секунд перед переходом в PROBE
- Интервал повторной передачи: 1 секунда (настраивается, из RA Retrans Timer)
- MAX_MULTICAST_SOLICIT: 3 попытки перед объявлением FAILED
Это обеспечивает быстрое обнаружение мёртвых соседей при минимизации ненужного NUD-трафика.
SLAAC: Автоконфигурация адресов#
Объединение Router Advertisement с Duplicate Address Detection создаёт Stateless Address Autoconfiguration. Хосты настраивают себя без DHCP-серверов.
Полный процесс SLAAC:
Шаг 1: Интерфейс поднимается
Хост включает IPv6 на интерфейсе eth0.
Шаг 2: Генерация link-local адреса
fe80:: + идентификатор интерфейса
fe80::a4b2:c3d4:e5f6:7890 (если используется IID, полученный из MAC)
fe80::1234:5678:9abc:def0 (если используется случайный IID)Шаг 3: Выполнение DAD для link-local
Отправка NS с источником :: для проверки уникальности адреса fe80::.
Шаг 4: Отправка Router Solicitation
IPv6 Header:
Source: fe80::a4b2:c3d4:e5f6:7890
Destination: ff02::2
Hop Limit: 255
ICMPv6:
Type: 133 (Router Solicitation)Шаг 5: Получение Router Advertisement
ICMPv6:
Type: 134 (Router Advertisement)
Flags: M=0, O=0 (SLAAC)
Prefix Information:
Prefix: 2001:db8:1234:5678::/64
Flags: A=1 (автономный)
Valid Lifetime: 86400
Preferred Lifetime: 14400Шаг 6: Генерация глобального адреса
Префикс: 2001:db8:1234:5678::/64
IID: a4b2:c3d4:e5f6:7890
Результат: 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890Шаг 7: Выполнение DAD для глобального адреса
Отправка NS для проверки уникальности 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890.
Шаг 8: Настройка адреса
ip -6 addr show eth0
# Вывод:
# inet6 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890/64 scope global dynamic
# inet6 fe80::a4b2:c3d4:e5f6:7890/64 scope linkШаг 9: Установка маршрута по умолчанию
Использование link-local адреса маршрутизатора в качестве шлюза по умолчанию:
ip -6 route show
# Вывод:
# default via fe80::1 dev eth0 metric 1024
# 2001:db8:1234:5678::/64 dev eth0 proto kernel metric 256Общее время: Несколько секунд.
Расширения конфиденциальности (RFC 4941):
IID, полученные из MAC, отслеживаемы в разных сетях. Privacy Extensions генерируют случайные IID, которые периодически меняются.
Исходный: 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890 (статический)
Конфиденциальный: 2001:db8:1234:5678:1a2b:3c4d:5e6f:7a8b (меняется ежедневно)Большинство современных ОС включают расширения конфиденциальности по умолчанию для исходящих соединений, сохраняя стабильный адрес для входящих соединений.
Соображения безопасности#
NDP имеет уязвимости, потому что был разработан в предположении доверенных локальных сетей. Атакующие в том же канале могут:
Поддельные Router Advertisement#
Атакующий отправляет поддельные RA с:
- Неправильным префиксом (блокировка трафика или маршрутизация через атакующего)
- Короткими временами жизни (принудительная частая переконфигурация)
- Флагом M=1 (принудительный DHCPv6 к серверу атакующего)
Воздействие: Полный контроль над конфигурацией хоста.
Смягчение:
- RA Guard: Функция коммутатора, блокирующая RA с портов, не являющихся маршрутизаторами
- SEND (Secure Neighbor Discovery): Криптографическая аутентификация (сложно, редко развёрнуто)
- Router preference: Использование высоких значений предпочтения на легитимных маршрутизаторах
Подмена Neighbor Advertisement#
Атакующий отправляет поддельные NA, заявляя о владении адресом другого хоста.
Воздействие: Атаки человека посередине, перехват трафика.
Смягчение:
- SEND: Аутентифицирует NA
- Port security: Коммутаторы применяют привязки MAC-адресов
- Мониторинг: Обнаружение дублирующихся MAC-адресов
DAD DoS#
Атакующий отвечает на каждый запрос DAD, предотвращая конфигурацию адресов.
Воздействие: Хосты не могут получить адреса, нет связности.
Смягчение:
- SEND: Аутентифицирует сообщения DAD
- Ограничение скорости: Ограничение NA от одного источника
- Статические адреса: Обход SLAAC полностью (не масштабируется)
Атаки Redirect#
Атакующий отправляет поддельные Redirect, направляя трафик через атакующего.
Воздействие: Человек посередине, перехват трафика.
Смягчение:
- Отключить Redirect: Многие ОС позволяют отключить обработку Redirect
- SEND: Аутентифицирует Redirect
- Проверка источника: Хосты должны проверять, что Redirect приходят от текущего маршрутизатора первого транзитного узла
Реальность: Большинство сетей не используют SEND из-за сложности. RA Guard на коммутаторах — практическая защита для корпоративных сетей.
Устранение проблем NDP#
У хоста нет глобального адреса#
Симптомы:
- Только адреса fe80::
- Можно пинговать link-local, но не глобальный
- Нет маршрута по умолчанию
Диагностика:
# Проверка Router Advertisement
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] == 134'
# Проверка приёма RA
sysctl net.ipv6.conf.eth0.accept_ra
# Должно быть 1 или 2 для хостов
# Ручная отправка RS
rdisc6 eth0Распространённые причины:
- Нет маршрутизатора в канале
- Межсетевой экран блокирует тип 134
- accept_ra отключён
- IPv6 forwarding включён (отключает обработку RA)
Исправление: Включить маршрутизатор, разрешить ICMPv6 тип 134, установить accept_ra=1.
Кэш соседей всегда FAILED#
Симптомы:
- Невозможно достичь соседей
- NS отправлен, но NA не получен
- Кэш соседей показывает FAILED
Диагностика:
# Наблюдение за обменом NS/NA
sudo tcpdump -i eth0 -vv 'icmp6 && (ip6[40] == 135 || ip6[40] == 136)'
# Проверка кэша соседей
ip -6 neigh show
# Ручной NS (инструмент ndisc6 для Linux)
ndisc6 2001:db8::10 eth0Распространённые причины:
- Межсетевой экран блокирует типы 135/136
- Целевой хост с отключённым IPv6
- Коммутатор фильтрует multicast
- Неправильный канал (цель в другой подсети)
Исправление: Разрешить NDP через межсетевые экраны, проверить включение IPv6 на цели.
Сбои DAD#
Симптомы:
- Адрес показывает «dadfailed»
- Интерфейс не может настроить адрес
- Журналы ядра показывают конфликты DAD
Диагностика:
# Проверка статуса адреса
ip -6 addr show eth0
# Пример вывода с ошибкой DAD:
# inet6 2001:db8::10/64 scope global tentative dadfailed
# Проверка на дубликат
ping6 -c 1 2001:db8::10Распространённые причины:
- Другой хост использует тот же адрес
- Атакующий подменяет NA (DAD DoS)
- Виртуальные машины с клонированными MAC-адресами
Исправление: Изменить адрес, исследовать дублирующие хосты, проверить конфигурацию VM.
Практические примеры с инструментами#
Мониторинг NDP с tcpdump#
# Весь NDP-трафик
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] >= 133 && ip6[40] <= 137'
# Только Router Advertisement
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] == 134'
# Разрешение адресов (NS/NA)
sudo tcpdump -i eth0 -vv 'icmp6 && (ip6[40] == 135 || ip6[40] == 136)'
# Фильтр по целевому адресу
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] == 135' | grep '2001:db8::10'Ручное управление кэшем соседей#
# Показать всех соседей
ip -6 neigh show
# Показать конкретного соседа
ip -6 neigh show 2001:db8::10
# Удалить запись (принудительное повторное разрешение)
sudo ip -6 neigh del 2001:db8::10 dev eth0
# Добавить статическую запись
sudo ip -6 neigh add 2001:db8::10 lladdr aa:bb:cc:dd:ee:ff dev eth0Тестирование SLAAC#
# Очистка адресов
sudo ip -6 addr flush dev eth0
# Повторное включение IPv6
sudo sysctl -w net.ipv6.conf.eth0.disable_ipv6=0
# Наблюдение за автоконфигурацией
ip -6 addr show eth0
ip -6 route showСвязанные статьи#
- ICMPv6 объяснён — NDP работает поверх ICMPv6. Поймите базовый протокол.
- Типы IPv6-адресов — Узнайте о link-local, solicited-node multicast и других типах адресов, используемых NDP.
- Безопасность IPv6 — Защита NDP от атак при разрешении обязательной функциональности.
Проверьте NDP в действии
Используйте наш инструмент Ping для запуска разрешения адресов и Traceroute, чтобы увидеть, как хосты обнаруживают маршрутизаторы следующего транзитного узла.
Часто задаваемые вопросы#
Почему NDP использует multicast вместо широковещания, как ARP?
Multicast более эффективен. Широковещательные ARP достигают каждого хоста в сети — все должны обработать кадр, даже если они не цель. NDP использует solicited-node multicast-адреса, вычисленные из IPv6-адреса цели. Только хосты с совпадающими адресами присоединяются к этой multicast-группе и получают пакет. Хосты фильтруют несовпадающие multicast на аппаратном уровне (NIC), снижая нагрузку на CPU. В больших сетях с тысячами хостов это создаёт значительную разницу в производительности.
Могу ли я отключить NDP, как могу отключить ARP?
Нет. NDP обязателен для работы IPv6. Он обрабатывает разрешение адресов, обнаружение маршрутизаторов и автоконфигурацию. Отключите NDP, и IPv6 полностью перестанет работать. В отличие от IPv4, где вы можете использовать статические записи ARP, IPv6 требует NDP для Router Advertisement (которые предоставляют шлюзы по умолчанию и префиксы). Даже со статическими соседями у вас не было бы способа узнать маршрутизаторы или автоконфигурировать адреса.
Как Duplicate Address Detection предотвращает конфликты?
Перед использованием любого адреса хосты отправляют Neighbor Solicitation с адресом источника :: (неопределённый) и целью, установленной на адрес, который они хотят использовать. Если другой хост уже использует этот адрес, он отвечает Neighbor Advertisement. Запрашивающий хост видит ответ, обнаруживает конфликт и должен выбрать другой адрес. Если ответ не приходит в течение ~1 секунды, адрес считается уникальным. DAD работает как для link-local, так и для глобальных адресов.
Что такое solicited-node multicast-адреса?
Solicited-node multicast-адреса получаются из последних 24 бит IPv6-адреса по формуле ff02::1:ff:XX:XXXX. Каждый IPv6-адрес автоматически присоединяется к соответствующей solicited-node multicast-группе. При выполнении разрешения адресов отправитель отправляет NS на solicited-node адрес вместо широковещания. Только хосты с адресами, заканчивающимися теми же 24 битами, получают его. Это уменьшает ненужную обработку по сравнению с широковещательным ARP.
Почему пакеты NDP должны иметь Hop Limit 255?
Безопасность. Легитимный NDP всегда исходит из локального канала и устанавливает Hop Limit в 255. Маршрутизаторы уменьшают Hop Limit при пересылке, поэтому пакеты от удалённых атакующих приходят с Hop Limit < 255. Отклоняя пакеты NDP с Hop Limit != 255, хосты защищаются от удалённых атакующих, отправляющих поддельные Router Advertisement, Neighbor Advertisement или Redirect. Эта простая проверка предотвращает многие удалённые атаки без требования сложной аутентификации.
Стоит ли развёртывать SEND (Secure Neighbor Discovery)?
Вероятно, нет. SEND обеспечивает криптографическую аутентификацию для NDP с использованием криптографии с открытым ключом, предотвращая атаки подмены. Теоретически это отлично. На практике это сложно, требует инфраструктуры PKI, имеет плохую поддержку ОС и добавляет задержку к критичным по времени операциям, таким как разрешение адресов. Большинство сетей используют более простые меры смягчения: RA Guard на коммутаторах (блокирует RA с портов, не являющихся маршрутизаторами), мониторинг поддельных RA и физическую/канальную безопасность. SEND подходит для высокозащищённых сред, готовых инвестировать в инфраструктуру и сложность.