A seguir está meu conjunto de regras simplificado ARP
, apenas regras de transmissão são mostradas, outras regras (não mostradas aqui) não são relevantes.
Por favor, veja os comentários do código que são perguntas (?)
#!/usr/sbin/nft -f
add chain arp arp_table input {
# filter = 0
# Packets delivered to the local system
type filter hook input priority filter; policy drop;
}
add chain arp arp_table output {
# filter = 0
# Packets send by the local system
type filter hook output priority filter; policy drop;
}
# ARP Broadcast address
define broadcast_ether = { ff:ff:ff:ff:ff:ff }
# IPv4 network address
define network_addr_4 = { 192.168.1.0/24 }
# NIC ether address
define physical_ether = { bb:c9:51:d4:4a:b6 }
# Why input to broadcast address never hits?
# This rule should handle broadcast input
add rule arp arp_table input arp daddr ether $broadcast_ether log prefix "ACCEPT input broadcast: " accept
# Why input to 00:00:00:00:00:00 hits instead?
# This rule handles input toward 00:00:00:00:00:00 from LAN
add rule arp arp_table input arp saddr ip $network_addr_4 arp daddr ether 00:00:00:00:00:00 accept
# Why output to broadcast never hits?
# This rule should handle output toward ff:ff:ff:ff:ff:ff to LAN
add rule arp arp_table output arp daddr ether $broadcast_ether log prefix "ACCEPT output broadcast: " accept
# Why output to 00:00:00:00:00:00 hits instead?
# This rule handles output toward 00:00:00:00:00:00 to LAN
add rule arp arp_table output arp saddr ether $physical_ether arp daddr ether 00:00:00:00:00:00 accept
Há várias questões aqui, a principal delas é que o ARP
tráfego de transmissão ff:ff:ff:ff:ff:ff
é inexistente, por isso adicionei uma instrução de log para capturar esse tráfego, mas ele nunca aparece, tanto para o tráfego quanto para input
o output
tráfego.
O que acontece é que vejo muita entrada/saída direcionada ao 00:00:00:00:00:00
endereço, o que sugere que, 00:00:00:00:00:00
de alguma forma, é um endereço de broadcast.
Então a questão principal é por que não vejo ARP
tráfego direcionado para o endereço de broadcast e por que 00:00:00:00:00:00
o endereço é usado em vez disso?
A segunda pergunta é: o que é 00:00:00:00:00:00
endereço? Por que ele é necessário e o que significa?
Se eu bloquear o tráfego de/para 00:00:00:00:00:00
(por exemplo, removendo essas regras), a rede deixará de funcionar devido à ARP
perda desses pacotes.
O wiki nftables lista
ether {saddr | daddr} «ether_addr»
para corresponder a origem e o destino no cabeçalho Ethernet; earp {saddr | daddr } ether «ether_addr»
para corresponder o Sender Hardware Address (SHA) e o Target Hardware Address (THA) no cabeçalho ARP. Os comandos poderiam talvez ser nomeados mais claramente, tanto para fazer uma distinção mais clara entre os cabeçalhos ARP e Ethernet, quanto porque o campo no cabeçalho ARP é chamado de endereço de destino , não de destino(*).O endereço de destino Ethernet de uma solicitação ARP seria o endereço de transmissão,
ff:ff:ff:ff:ff:ff
já que a solicitação precisa ser enviada necessariamente a todos os respondentes possíveis.Você provavelmente não deve confiar no endereço de hardware de destino ARP de uma solicitação ARP contendo algo em particular, pois esse é o valor que o remetente do pacote não sabe e está consultando. É provável que seja definido como zeros, como você viu, mas o RFC 826 parece deixar a porta aberta para que seja qualquer coisa:
(* Practicalnetworking.net aponta uma diferença de significado entre "alvo" e "destino" aqui: no caso do Proxy ARP, o host sobre o qual a consulta está sendo feita (o "alvo") não veria a consulta em si (e, portanto, não seria seu "destino"), já que algum outro host responderia em seu nome.)