Вопрос или проблема
Почему используется адрес 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-запросах является ожидаемым поведением, которое отражает природу работы протокола, и он необходим для правильной работы сетевой коммуникации.