Skip to content

Latest commit

 

History

History
124 lines (76 loc) · 13.2 KB

lecture.adoc

File metadata and controls

124 lines (76 loc) · 13.2 KB

Протокол ARP

Протокол ARP решает задачу сопоставления MAC адреса по IP адресу. ARP (Address Resolution Protocol) описан в RFC 826, в его задачу входит разрешение (т.е. узнать) MAC адрес по определенному IP адресу.

В иерархии протоколов, ARP инкапсулируется в Ethernet и работает в формате запрос-ответ, как изображено на рисунке. В ARP-запросе указывается искомый IP адрес, чей MAC адрес требуется найти. В ARP-ответе должен прийти искомый MAC адрес.

Схема работы ARP.
Figure 1. Схема работы ARP.

ARP имеет следующий формат (рисунок ниже). Из множества полей наибольший интерес представляет:

  • Sender hardware address (SHA) - MAC адрес отправителя.

  • SPA - IP адрес отправителя

  • THA - MAC адрес назначения

  • TPA - IP адрес назначения

Формат ARP.
Figure 2. Формат ARP.

В нашем примере:

  • поле SHA будет установлено в 00:00:00:00:00:01

  • поле SPA - 10.0.0.0.1

  • поле THA - 00:00:00:00:00:00 (т.е. пустое, так как именно MAC адрес мы и не знаем)

  • поле TPA - 10.0.0.0.2

Так как хост отправителя не знает какому MAC адресу нужно отправить запрос, то на канальном уровне ARP-запрос имеет широковещательный адрес, т.е. в поле MAC адрес назначения устанавливается FF:FF:FF:FF:FF:FF. Таким образом, ARP-запрос обрабатывается всеми хостами, которые его получат.

Получив ARP-запрос хост сравнивает IP адрес назначения (TPA) со своим. Если у него нет такого IP адреса, то запрос игнорируется. Если у хоста оказался IP адрес назначения, он отправляет ARP-ответ, в котором указывает свой MAC адрес. В нашем примере ARP ответ будет выглядеть вот так:

  • поле SHA будет установлено в 00:00:00:00:00:02

  • поле SPA - 10.0.0.0.2

  • поле THA - 00:00:00:00:00:01

  • поле TPA - 10.0.0.0.1

Обратите внимание, что поля источника содержат информацию об отправителе. Если это ARP запрос, то в полях SHA и SPA будет отправитель ARP-запроса (00:00:00:00:00:01 и 10.0.0.1 соответственно). А если это ARP-ответ, то в полях SHA и SPA будет информация об отправителе ARP-ответа (00:00:00:00:00:02 и 10.0.0.2 соответственно).

Так как в ARP-запросе есть информация про MAC адрес отправителя, ARP-ответ уже не широковещательный, а отправляется на конкретный MAC адрес.

Запустим сеть по адресу https://miminet.ru/web_network?guid=d9012b77-fd52-48b0-b618-a3c3f55caf15 и посмотрим за ее работой. Первым делом мы видим, что хост 1 отправляет ARP-запрос (ARP-request), после получает ARP-ответ (ARP-response) и только потом уже отправляет ICMP пакеты.

ARP запрос и ARP ответ.(https://miminet.ru/web_network?guid=d9012b77-fd52-48b0-b618-a3c3f55caf15).
Figure 3. ARP запрос и ARP ответ. (https://miminet.ru/web_network?guid=d9012b77-fd52-48b0-b618-a3c3f55caf15)

Таким образом ARP решает проблему связки сетевого и канального уровня. Возможно вы обратили внимание, что мы не изобразили место ARP в модели ISO/OSI. Это все потому, что непонятно, к какому уровню его отнести. С одной стороны он работает с IP адреса, т.е. знает про сетевой уровень. С другой стороны он работает с MAC адресами. Чтобы не вести бесконечные споры, ARP по модели ISO/OSI называют протокол уровня 2,5.

ARP кэш

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

ARP кэш представляет собой таблицу из 3-х колонок, как на рисунке:

  • IP адрес

  • MAC адрес

  • Тип записи

ARP-кэш (Windows).
Figure 4. ARP-кэш (Windows).

Вы можете посмотреть свой ARP-кэш при помощи команды arp -a. Она одинаково работает под Windows, Linux и MacOS.

Каждому IP адресу соответствует определенный MAC адрес. Как только хост через ARP протокол определил MAC адрес другого хоста, он заносит эту информацию к себе в ARP-кэш. Таким образом, при отправке последующих пакетов он сможет их отправлять сразу, без предварительного разрешения MAC адреса.

Третье поле в ARP-кэше, тип записи, бывает двух типов:

  • динамический

  • статический

Динамический тип означает, что запись была добавлена через работу ARP протокола и она должна быть удалена через определенное время. У каждой ОС есть свои временные промежутки, через которые запись в ARP-кэше динамическим типом будет удалена. Например, у ОС Windows это 30-45 секунд, при условии, что хост не будет пользоваться конкретной записью из ARP-кэша (https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/address-resolution-protocol-arp-caching-behavior).

Статический тип означает, что запись была добавлена не через ARP протокол и должна быть в ARP-кэше до выключения ОС.

Каждый раз, когда ОС отправляет пакет в сеть, для правильного заполнения поля MAC адрес отправителя, она:

  1. Ищет нужный IP адрес в ARP-кэш

  2. Если нужного IP адреса нет в ARP-кэш, отправляет ARP-запрос

Для примера создайте в miminet сеть как на рисунке ниже:

  • 2 хоста соединим друг с другом

  • на хосте 1 установим IP адрес в 192.168.1.1 и маску в 24

  • на хосте 2 установим IP адрес в 192.168.1.2 и маску в 24

  • на хосте 1 выполните команду ping (1 пакет) и в качестве IP адреса назначения укажите 192.168.1.2

  • запустите эмуляцию

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

Сеть из двух хостов
Figure 5. Сеть из двух хостов, узнаем MAC адрес. (https://miminet.ru/web_network?guid=519a0153-a32a-4fb0-858e-b21d6ba3cca1).

А теперь:

  • добавьте на хосте 1 команду “Добавить запись в ARP-кэш”, как указано на рисунке 48а. В качестве IP адреса укажите 192.168.1.2, а MAC адрес поставьте 00:11:22:33:44:55 (или любой другой, где multicast бит равен 0, так как это будет широковещательный адрес,и не 00:00:00:00:00:02, так как адрес хоста 2).

  • запустите эмуляцию

  • запустите анимацию и посмотрите, больше нет никаких ARP-запросов. Вместо этого хост 1 сразу отправляет ICMP пакет, так как MAC адрес для IP адреса 192.168.1.2 уже есть в ARP-кэш. Но, так как MAC адрес неверный, то хост 2 получив такой пакет отбрасывает его и никакого ICMP-ответа не генерируется, как это было до этого.

Добавление неверной записи в ARP-кэш. (https://miminet.ru/web_network?guid=1260c13a-0c6e-4859-9800-919ce1be576f).
Figure 6. Добавление неверной записи в ARP-кэш.(https://miminet.ru/web_network?guid=1260c13a-0c6e-4859-9800-919ce1be576f).

Беспричинный ARP-запрос

Когда ОС назначает себе IP адрес, она хочет убедиться, что такого же IP адреса нет в ее сети. Ведь IP адреса должны быть уникальными. Для этого она отправляет ARP-запрос в сеть, в котором указывает в качестве IP адреса назначения свой IP адрес.

Если в сети уже есть хост с таким же IP адресом, то наш хост получит ARP-ответ. Таким образом он поймет, что в сети уже существует хост с таким IP и назначать его себе нельзя. Если у вас Windows, то вы увидите подобное сообщение, как на рисунке ниже.

Windows обнаружил конфликт IP адресов.(https://windows-school.ru/blog/obnaruzhila_konflikt_ip_adresov/2021-12-14-826).
Figure 7. Windows обнаружил конфликт IP адресов.(https://windows-school.ru/blog/obnaruzhila_konflikt_ip_adresov/2021-12-14-826).

Часто задаваемые вопросы по ARP

Вопрос 1: Что будет, если на ARP-запрос никто не ответит?

Ответ: Отправив ARP-запрос, хост ожидает некоторый таймаут (примерно 1-3 секунды). Если за время таймаута хост не получил ARP-ответ, то он снова отправляет ARP-запрос. И так он делает 3 раза. После 3-й попытки хост сообщает протоколам более верхнего уровня о невозможности отправить пакет в сеть.

Вопрос 2: Что будет, если хост получит 2 ARP-ответа сразу?

Ответ: Обычно такое поведение зависит от реализации ARP-протокола. Некоторые ОС принимают только первый ARP-ответ, другие ОС могут принять ARP-ответ второй и даже в случае, когда хост не отправлял ARP-запрос.

Вопрос 3: Если находясь в сети мой хост будет отправлять ARP-ответы в ответ на беспричинный ARP-запрос, тогда никто больше кроме меня не сможет назначить себе IP адрес?

Ответ: Да, такое поведение сложно отследить и администраторы очень не любят таких людей.

Вопрос 4: Если мой хост подделает ARP-ответ на ARP-запрос другого хоста и мой ARP-ответ придет первым на хост отправителя, это означает, что пакет, который предназначается для другого хоста придет ко мне?

Ответ: Да, это называется атака ARP-spoofing.