Обнаружение и разрешение конфликтов IP адресов в сети

postimages/2/5216/full/149035.jpg

Периодически на форумах поднимаются вопросы о работе сетей, которые содержат одинаковые IP адреса в одном физическом сегменте. Почитав некоторые форумы, пришёл к выводу, что не все ясно представляют себе весь этот процесс и за факты начинают выдавать какие-то выдумки или догадки, которые не очень близки от истины. Вот и недавно, на одном замечательном ресурсе системных администраторов был поднят вопрос об этом. И я решил как-то прояснить этот вопрос. Формат форумов предполагает обмен цепочками вопрос-ответ небольших объёмов.
Единственная вещь, которая отвечает за контроль дублирования адресов в сети - протокол преобразования адресов ARP. В общем смысле картина выглядит так:

Узел A при получении нового IP-адреса отправляет специальный броадкаст Gratuitous (добровольный) ARP-запрос. Запрос представляет собой ARP-запрос для собственного IP адреса, в котором поле SPA (Source Protocol Address или IP адрес отправителя) и TPA (Target Protocol Address или IP адрес получателя) содержит собственный адрес. Если ответ на запрос получен, то это означает, что в сети есть дублирующийся адрес. Если ответ не был получен, то, соответственно, можно считать, что данный адрес в сети уникальный. С отстутсвием ответа всё понятно как бы, 'нет ножек, нет и мультиков'(c)точка. Гораздо интересней ситуация происходит при получении ответа на такой запрос. Что же происходит в сети в таком случае?

Узел, который отправляет в сеть Gratuitous запрос становится т.н. Атакующим узлом (Offening Node), а узел, который ответил на этот запрос становится т.н. Атакуемым узлом (Defending Node). Что происходит на каждом из узлов в процессе обнаружения конфликта:
  • на Атакующем узле. Если адрес настраивается вручную, то при получении ответа на Gratuitous запрос инициализация адреса сбрасывается (т.е. узел не присвоит интерфейсу конфликтующий адрес). Об этом будет записано в системном журнале, ну и на экране появится ошибка. Если же адрес настраивается через DHCP, то клиент проверяет на конфликт адрес, который клиент получил от DHCP-сервера в пакете DHCPOFFER. Если адрес из DHCPOFFER является дублирующим (не уникальным), то клиент получив ответ на Gratuitous запрос отправит DHCP-серверу пакет DHCPDECLINE. Этот адрес в зависимости от реализации DHCP-сервера может помечаться как неисправный и будет удалён из пла свободных адресов. Клиент будет снова пробовать получить IP-адрес от DHCP-сервера отправкой в сеть пакета DHCPDISCOVER.
    <li>на Атакуемом узле. Атакуемый узел определят конфликт очень просто - если поле SPA (Source Protocol Address или IP адрес отправителя), то узел констатирует конфликт. Этот факт будет так же зарегистрирован в журнале событий и пользователю будет выдана ошибка. При этом, атакуемый узел не сбросит с себя конфликтный IP-адрес (что сделает Атакующий узел).

    Когда конфликт констатирован, начинает работать механизм разрешения конфликта. Суть проблемы конфликта заключается в следующем:
    После отправки добровольного запроса по правилу работы ARP-протокола остальные клиенты сегмента обновят свои записи в ARP кэше со схемы:
  • [Конфликтующий адрес:MAC атакуемого узла] (т.к. до этого момента IP-адрес атакуемого узла был уникален) будет заменён на схему: [Конфликтующий IP адрес:MAC атакующего узла]. Если атакуемый узел будет являться шлюзом по умолчанию, то все внешние запросы (которые идут на шлюз) будут перенаправлены с шлюза на атакующий узел (который проводит проверку своего адреса и на самом деле не является шлюзом). В такой ситуации сегмент потеряет связь с внешним миром, т.к. после запроса все машины перепишут новый MAC для шлюза. Однако, ARP ответ атакуемого узла на добровольный запрос не обновляет/исправляет ошибочные записи в ARP кэшах остальных машин в сегменте. Для этого атакуемый узел отправляет в сеть другой широкополосный ARP-запрос, как бы он сам проверял свой адрес на конфликт (атакуемый и атакующий узел меняются ролями). Этим запросом атакуемый узел обратно исправляет записи в кэшах ARP остальных машин в сегменте на правильные значения (ведь, атакующий узел не может использовать конфликтный IP). Но на этот запрос уже атакуемый (до этого он был атакующим) уже никто не ответит, т.к. изначально Атакующий узел к этому времени снимет с себя конфликтный IP-адрес.

    В итоге мы получаем картину из последовательного обмена тремя кадрами. Для наглядности привожу трассировку с Network Monitor:
    1. добровольный запрос атакующего узла:
    Frame:
    - Ethernet: Etype = ARP
    + DestinationAddress: *BROADCAST
    + SourceAddress: Microsoft Corporation 55578E
    EthernetType: ARP, 2054(0x806)
    - Arp: Request, 192.168.1.13 asks for 192.168.1.13
    HardwareType: Ethernet
    ProtocolType: Internet IP (IPv4)
    HardwareAddressLen: 6 (0x6)
    ProtocolAddressLen: 4 (0x4)
    OpCode: Request, 1(0x1)
    SendersMacAddress: 00-03-FF-55-57-8E
    SendersIp4Address: 192.168.1.13
    TargetMacAddress: 00-00-00-00-00-00
    TargetIp4Address: 192.168.1.13
    2. ответ атакуемого узла на добровольный запрос:
    Frame:
    - Ethernet: Etype = ARP
    + DestinationAddress: *BROADCAST
    + SourceAddress: Intel Corporation 54578E
    EthernetType: ARP, 2054(0x806)
    UnkownData: Binary Large Object (18 Bytes)
    - Arp: Response, 192.168.1.13 at 00-18-DE-54-57-8E
    HardwareType: Ethernet
    ProtocolType: Internet IP (IPv4)
    HardwareAddressLen: 6 (0x6)
    ProtocolAddressLen: 4 (0x4)
    OpCode: Response, 2(0x2)
    SendersMacAddress: 00-18-DE-54-57-8E
    SendersIp4Address: 192.168.1.13
    TargetMacAddress: 00-00-00-00-00-00
    TargetIp4Address: 0.0.0.0
    3. добровольный запрос уже атакуемого узла:
    Frame:
    - Ethernet: Etype = ARP
    + DestinationAddress: *BROADCAST
    + SourceAddress: Intel Corporation 54578E
    EthernetType: ARP, 2054(0x806)
    - Arp: Request, 192.168.1.13 asks for 192.168.1.13
    HardwareType: Ethernet
    ProtocolType: Internet IP (IPv4)
    HardwareAddressLen: 6 (0x6)
    ProtocolAddressLen: 4 (0x4)
    OpCode: Request, 1(0x1)
    SendersMacAddress: 00-18-DE-54-57-8E
    SendersIp4Address: 192.168.1.13
    TargetMacAddress: 00-00-00-00-00-00
    TargetIp4Address: 192.168.1.13


    Небольшое пояснение к трассировке: MAC=00-03-FF-55-57-8E - это MAC-адрес атакующего узла, который пытается присвоить себе конфликтный адрес (192.168.1.13). MAC=00-18-DE-54-57-8E - это MAC-адрес атакуемого узла, который уже находится в сети и ему присвоен конфликтный адрес (192.168.1.13).

    Последним кадром заново переписываются таблицы ARP-кэшей остальных узлов в сегменте на правильные значения.

    Однако, хочу добавить, что обмен Gratuitous-запросами и ответами происходит только при инициализации адреса. Если, например, узел будет сконфигурирован на конфликтный адрес до подключения узла в сеть, то после включения узла с конфликтным адресом обмен такими добровольными запросами-ответами происходить не будет. Поэтому оба узла будут продолжать использовать один конфликтный адрес, но при каждом ARP запросе оба узла будут генерировать ошибки о конфликте адресов.
    • 18 апреля 2008, 11:18
    • Ferret
    • просмотров: ~4971
    • рейтинг: ?

    Комментарии (3)

    Вы - anonymous, войти ?

    можно использовать bbcode-теги
    [b]жирный текст[/b]
    [i]курсив[/i]
    [u]underline[/u]
    [s]зачеркнутый текст[/s]
    [size=20px]размер шрифта[/size]
    всякие изменения текста
    [left][/left]
    [right][/right]
    [center][/center]
    позиционирование элементов: картинки, текст и т.д
    [url][/url]
    [email][/email]
    внутри тега [url] помещайте ссылки, а внутри [email] адрес электронной почты;
    так же [url] можно использовать в виде:
    [url=http://example.com]пример[/url],
    [url=http://test.ru][img]http://flickr.com/givemeimg.png[/img][/url]
    [code][/code]
    [quote][/quote]
    внутри тега [code] можно помещать программный код (подстветка попытается включиться автоматически); для выделения цитат используйте [quote]
    также можно напрямую указать язык [code=cpp]int i;[/code]
    [list][/list]
    создаем списки, каждый элемент пишется после [*].

    Можно указывать маркер - [list=marker].
    возможные маркеры 1(decimal), i(lower-roman), I(upper-roman), a(lower-alpha), A(upper-alpha). Примеры:

    [list][*]1 элемент[*]2 элемент[*]3 элемент[/list]
    [list=1][*]1 элемент[*]2 элемент[*]3 элемент[/list]
    [list=A][*]1 элемент[*]2 элемент[*]3 элемент[/list]
    [table][/table]
    оформляем таблицу, используя внутренние теги [tr] и [td].
    [tr] - строка, [td] - поле в строке,
    [table=100%] - можно задавать ширину в процентах, по-умолчанию ширина 100%
    [td=2] - можно задавать сколько столбцов входит в это поле. Пример:

    [table=50%][tr][td]столбец 1[/td][td]столбец 2[/td][/tr][tr][td]значение 1[/td][td]значение 2[/td][/tr][tr][td=2]сразу 2 столбца[/td][/tr][/table]
    [img][/img]
    тег для вставки фото или картинок, мы любим картинки. Примеры использования:

    [img]http://ya.ru/logo.png[/img],
    [img=100x100px]http://ya.ru/logo.png[/img]
    [img=fullimg.url]thumbimg.url[/img],
    Пожалуйста загружайте картинки на наш сайт, либо вставляйте с бекбоновских ресурсов.
    [video][/video]
    Проигрывает видео, внутрь вставляем ссылки на видео, поддерживается Play.Ykt.Ru(нужно вставить ссылку на страницу с видео) и tv.ykt.ru(нужно вставить ссылку на адрес файла)