Duplicate Address Detection
Duplicate Address Detection (DAD) — это механизм, используемый в компьютерных сетях для проверки уникальности IPv6-адреса в локальной сети (подсети) перед его назначением интерфейсу. Он является обязательной частью протокола Neighbor Discovery Protocol (NDP) для IPv6 и служит для предотвращения конфликтов адресов, когда два или более устройства пытаются использовать один и тот же IP-адрес. В отличие от IPv4, где проверка уникальности часто не производится (используется протокол ARP для разрешения адресов, но не для их предварительной проверки), DAD является стандартной процедурой для большинства типов IPv6-адресов, включая автоконфигурируемые адреса на основе MAC-адреса (EUI-64), временные адреса и адреса, назначенные вручную.
Принцип работы
DAD реализуется на этапе, когда интерфейс получает или генерирует потенциальный IPv6-адрес, но ещё не начинает его использовать для обычной передачи данных. Процесс основан на отправке и приёме специальных сообщений NDP — Neighbor Solicitation (NS) и Neighbor Advertisement (NA).
Инициализация
Когда хост (компьютер, маршрутизатор, смартфон) хочет назначить интерфейсу новый IPv6-адрес (например, после включения, подключения к сети или изменения конфигурации), он временно переводит этот адрес в состояние tentative (предварительный). В этом состоянии адрес не считается активным: хост не отвечает на запросы, адресованные этому адресу, и не использует его в качестве источника для исходящих пакетов, за исключением самого процесса DAD.
Отправка запроса
Хост отправляет Neighbor Solicitation сообщение, в котором:
- Целевой адрес (Target Address) — это проверяемый tentative-адрес.
- Адрес источника (Source Address) — неопределённый адрес (::), так как у интерфейса ещё нет назначенного IPv6-адреса.
- Адрес назначения (Destination Address) — solicited-node multicast address, соответствующий проверяемому адресу. Это многоадресный адрес, на который подписываются все узлы в подсети, у которых есть адрес с тем же последним 24 битами.
Это сообщение фактически является вопросом: «Есть ли в этой сети устройство, которое уже использует адрес X?».
Ожидание ответа
После отправки запроса хост ожидает ответ в течение определённого времени (обычно 1 секунда, но может настраиваться). Если за это время приходит Neighbor Advertisement от другого узла, в котором указан проверяемый адрес, это означает, что адрес уже занят. Если приходит другой Neighbor Solicitation с тем же целевым адресом (от другого узла, который также проходит DAD), это также считается конфликтом.
Результаты
- Адрес уникален: Если в течение тайм-аута не получено ни одного ответа (NA или NS с тем же адресом), адрес переводится из состояния tentative в состояние preferred (предпочтительный) или valid (действительный). Интерфейс начинает использовать его для приёма и передачи данных.
- Конфликт обнаружен: Если получен ответ, DAD считается неудачным. Адрес остаётся в состоянии tentative, но не активируется. Для адресов, полученных через автоконфигурацию без сохранения состояния (SLAAC), хост обычно генерирует новый случайный адрес и повторяет процедуру. Для статически назначенных адресов операционная система может выдать сообщение об ошибке (например, «Duplicate address detected»), и адрес не будет использоваться, пока конфликт не будет разрешён вручную.
Тайминги и параметры
Процесс DAD регулируется несколькими параметрами, определёнными в RFC 4862 (IPv6 Stateless Address Autoconfiguration) и RFC 4861 (Neighbor Discovery for IP version 6):
- DupAddrDetectTransmits: Количество отправляемых NS-сообщений (обычно 1). Если установлено в 0, DAD отключается.
- RetransTimer: Интервал между повторными отправками NS (обычно 1000 миллисекунд). Если отправляется несколько NS (если DupAddrDetectTransmits > 1), то между ними выдерживается этот интервал.
Таким образом, общее время ожидания составляет примерно DupAddrDetectTransmits * RetransTimer. При стандартных настройках (1 отправка, таймер 1 с) DAD занимает около 1 секунды.
Применение в IPv6
DAD применяется для всех типов IPv6-адресов, за исключением нескольких специальных случаев:
- Адреса, полученные по SLAAC: Хост генерирует адрес на основе префикса сети и своего идентификатора (например, EUI-64) и обязательно выполняет DAD.
- Временные адреса (Privacy Extensions): Случайные адреса, генерируемые для повышения конфиденциальности, также проходят DAD.
- Статические адреса: При ручном назначении адреса администратором операционная система также выполняет DAD, чтобы убедиться, что адрес не конфликтует с другими.
- Anycast-адреса: Для anycast-адресов (которые могут быть назначены нескольким интерфейсам) DAD не выполняется, так как множественное использование одного адреса является нормой.
В IPv4 аналогом DAD является Gratuitous ARP (беспричинный ARP), но он используется не столько для проверки уникальности перед назначением, сколько для обновления ARP-таблиц других узлов после смены адреса. В IPv6 DAD является строго обязательным для unicast-адресов.
Ограничения и проблемы
Несмотря на свою полезность, DAD имеет несколько ограничений:
- Задержка при подключении: Каждый новый адрес требует ожидания в 1 секунду для завершения DAD. При большом количестве адресов на интерфейсе (например, при использовании Privacy Extensions, генерирующих много временных адресов) задержка может накапливаться.
- Уязвимость к DoS-атакам: Злоумышленник в той же локальной сети может намеренно отвечать на все NS-запросы DAD, утверждая, что любой проверяемый адрес уже занят. Это приводит к тому, что новые устройства не могут получить адрес, что является формой отказа в обслуживании (Denial of Service). Эта атака известна как DAD DoS или Neighbor Cache Poisoning.
- Работа только в локальной сети: DAD работает только в пределах одного широковещательного домена (канала связи). Он не проверяет уникальность адреса за пределами локальной подсети.
- Зависимость от многоадресной рассылки: Для работы DAD требуется, чтобы все узлы в сети поддерживали многоадресную рассылку (multicast). В некоторых старых или специфических сетях это может быть проблемой.
Историческая справка
Механизм DAD был впервые определён в RFC 1971 (1996 год) как часть протокола IPv6 Stateless Address Autoconfiguration. Позже он был уточнён и включён в RFC 2462 (1998 год) и окончательно стандартизирован в RFC 4862 (2007 год). Основной протокол NDP, в рамках которого работает DAD, описан в RFC 4861 (2007 год). До появления DAD в IPv4 для обнаружения конфликтов адресов использовались нестандартные методы, такие как отправка ARP-запросов для собственного адреса, но эта практика не была обязательной и часто игнорировалась.
Сравнение с IPv4
| Характеристика | IPv4 (Gratuitous ARP) | IPv6 (DAD) |
|---|---|---|
| Обязательность | Необязателен, часто не используется | Обязателен для unicast-адресов |
| Цель | Обновление ARP-таблиц, редко — проверка уникальности | Проверка уникальности перед назначением |
| Сообщения | ARP-запрос/ответ | Neighbor Solicitation/Advertisement |
| Адрес источника | Собственный IP-адрес | Неопределённый адрес (::) |
| Состояние адреса | Не определено | Tentative |
Источники
- RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
- RFC 4862: IPv6 Stateless Address Autoconfiguration
- RFC 4291: IP Version 6 Addressing Architecture
- Таненбаум Э., Уэзеролл Д. «Компьютерные сети» (5-е издание), глава 4.3
- Стивенс У. Р. «TCP/IP. Иллюстрированное руководство», том 1 (глава 8)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →