Почему используется адрес 00:00:00:00:00:00 вместо широковещательного адреса ff:ff:ff:ff:ff:ff в ARP?

Вопрос или проблема

Почему используется адрес 00:00:00:00:00:00 вместо широковещательного адреса ff:ff:ff:ff:ff:ff в ARP?

Ниже представлен мой упрощенный набор правил ARP, показаны только правила вещания, другие правила (не показаны здесь) не имеют значения.

Пожалуйста, посмотрите комментарии в коде, где есть вопросы (?)

#!/usr/sbin/nft -f

add chain arp arp_table input {
    # filter = 0
    # Пакеты, доставляемые локальной системе
    type filter hook input priority filter; policy drop;
}

add chain arp arp_table output {
    # filter = 0
    # Пакеты, отправляемые локальной системой
    type filter hook output priority filter; policy drop;
}

# MAC-адрес вещания ARP
define broadcast_ether = { ff:ff:ff:ff:ff:ff }

# IPv4 адрес сети
define network_addr_4 = { 192.168.1.0/24 }

# MAC-адрес сетевой карты
define physical_ether = { bb:c9:51:d4:4a:b6 }

# Почему входящий трафик на адрес вещания никогда не срабатывает?
# Это правило должно обрабатывать входящий трафик на адрес вещания
add rule arp arp_table input arp daddr ether $broadcast_ether log prefix "ACCEPT input broadcast: " accept

# Почему вместо этого срабатывает входящий трафик на адрес 00:00:00:00:00:00?
# Это правило обрабатывает входящий трафик на 00:00:00:00:00:00 из локальной сети
add rule arp arp_table input arp saddr ip $network_addr_4 arp daddr ether 00:00:00:00:00:00 accept

# Почему исходящий трафик на адрес вещания никогда не срабатывает?
# Это правило должно обрабатывать исходящий трафик на ff:ff:ff:ff:ff:ff в локальную сеть
add rule arp arp_table output arp daddr ether $broadcast_ether log prefix "ACCEPT output broadcast: " accept

# Почему вместо этого срабатывает исходящий трафик на адрес 00:00:00:00:00:00?
# Это правило обрабатывает исходящий трафик на 00:00:00:00:00:00 в локальную сеть
add rule arp arp_table output arp saddr ether $physical_ether arp daddr ether 00:00:00:00:00:00 accept

Здесь несколько вопросов, основной из которых в том, что трафик ARP вещания ff:ff:ff:ff:ff:ff отсутствует, поэтому я добавил оператор логирования, чтобы поймать такой трафик, но он никогда не появляется, как для входящего, так и для исходящего трафика.

Что на самом деле происходит, так это то, что я вижу много входящего/исходящего трафика, направленного на адрес 00:00:00:00:00:00, что предполагает, что адрес 00:00:00:00:00:00 является адресом вещания каким-то образом.

Таким образом, основной вопрос заключается в том, почему я не вижу трафика ARP, направленного на адрес вещания, и почему вместо этого используется адрес 00:00:00:00:00:00?

Второй вопрос: что такое адрес 00:00:00:00:00:00? Зачем он нужен и что он означает?

Если я заблокирую трафик к/от 00:00:00:00:00:00 (например, удалив эти правила), тогда сеть перестанет функционировать из-за того, что такие пакеты ARP будут отброшены.

В вики nftables перечислены ether {saddr | daddr} «ether_addr» для сопоставления источника и назначения в заголовке Ethernet; и arp {saddr | daddr } ether «ether_addr» для сопоставления адреса оборудования отправителя (SHA) и адреса оборудования получателя (THA) в заголовке ARP. Команды могли бы, возможно, быть названы более четко, чтобы отметить различие между заголовками ARP и Ethernet, а также потому, что поле в заголовке ARP называется целевым адресом, а не адресом назначения (*).

Адрес назначения Ethernet ARP-запроса будет адресом вещания ff:ff:ff:ff:ff:ff, поскольку запрос по необходимости должен быть отправлен каждому потенциальному ответчику.

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

Модуль разрешения адресов затем устанавливает […]
ar$op в ares_op$REQUEST, ar$sha с 48-битным Ethernet-адресом
себя, ar$spa с протокольным адресом себя, а ar$tpa
с протокольным адресом машины, к которой пытаются получить доступ. Он не устанавливает ar$tha на что-либо конкретное,
потому что именно это значение он пытается определить.
Он
может установить ar$tha на адрес вещания для оборудования (все единицы в случае 10Mbit Ethernet), если это удобно для какого-то аспекта реализации.

(* practicalnetworking.net указывает на разницу в значении между “целевым” и “назначенным” адресом здесь: в случае Proxy ARP, запрашиваемый хост (цель) не увидит сам запрос (и поэтому не станет его “назначением”), поскольку на его имя отвечает какой-то другой хост.)

Ответ или решение

Причина, по которой адрес 00:00:00:00:00:00 используется вместо широковещательного адреса ff:ff:ff:ff:ff:ff в протоколе ARP, лежит в особенностях функционирования ARP и его спецификации.

Почему адрес ff:ff:ff:ff:ff:ff не используется?

ARP-запросы отправляются по широковещательному адресу ff:ff:ff:ff:ff:ff на Ethernet-канале для того, чтобы все устройства в локальной сети получили этот запрос и могли ответить на него. Однако в самом ARP-запросе поле "целевой аппаратный адрес" (Target Hardware Address, THA) должно содержать адрес, который запрашивается, а не какой-либо фиксированный адрес.

Согласно спецификации RFC 826, при создании ARP-запроса поле THA не устанавливается в конкретное значение, так как оно указывает адрес, который отправитель пытается определить. На практике это поле часто заполняется нулями (00:00:00:00:00:00), что не является обязательным, но является распространенной практикой. Таким образом, адрес 00:00:00:00:00:00 используется как заполнение для THA, когда запрос отправляется, потому что отправитель не знает, какой аппаратный адрес ему нужен.

Почему видим трафик к адресу 00:00:00:00:00:00?

Когда вы видите ARP-трафик, направленный к 00:00:00:00:00:00, это указывает на ARP-запросы. Устройства в сети отправляют ARP-запросы, чтобы выяснить MAC-адрес устройства, соответствующего определенному IP-адресу. Поскольку отправитель не знает, какой MAC-адрес нужен, он устанавливает поле THA в нули. В результате вы и наблюдаете такую активность.

Второй вопрос: Что такое адрес 00:00:00:00:00:00?

Адрес 00:00:00:00:00:00 является специальным адресом, используемым в контексте ARP-запросов для обозначения "неизвестного" адреса. Он не используется как обычный адрес, он фактически указывает на то, что устройство запрашивает информацию о MAC-адресе, не зная, какой именно адрес необходимо получить.

Что произойдет, если блокировать трафик через 00:00:00:00:00:00?

Если вы заблокируете трафик к и от 00:00:00:00:00:00, то устройства в вашей сети не смогут корректно выполнять ARP-запросы и не смогут определять MAC-адреса для IP-адресов, которые они пытаются использовать. Это приведет к сбоям в сетевой функциональности, поскольку ARP является основополагающим для работы сетей TCP/IP в локальных сетях.

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

Оцените материал
Добавить комментарий

Капча загружается...