Marcar pacotes com iptables por endereço MAC de destino

Marcar pacotes com iptables por endereço MAC de destino

Preciso marcar os pacotes que vão para um endereço MAC especificado.

Eu preciso disso para usar no shaper com tc.

--mac-destinationnão existe em iptables.

Também tentei usar ebtables:

ebtables -t nat -A POSTROUTING -d 9c:4e:36:aa:bb:cc -j mark --set-mark 0x2003 --mark-target ACCEPT

mas não marca nada (pelo menos ebtables -t nat -L --Lcme mostra 0 contadores)

Por favor ajude! Muito obrigado!

Responder1

O truque é combinar iptables --mac-sourcecom CONNMARK:

  • Primeiro use --mac-sourcepara combinar pacotes vindos do endereço MAC no qual você está interessado. É a direção errada, já que você está interessado em pacotes que vão para esse endereço MAC, mas agora você pode
  • use CONNMARKpara marcar toda a conexão, ou seja, ambas as direções (!) e
  • defina a marca da marca de conexão com--restore-mark


# lan interface
if_lan=eth0

# create 'mark_mac' table for marking connections:
iptables -t mangle -N mark_mac
iptables -t mangle -A mark_mac -j MARK --set-mark 1234
iptables -t mangle -A mark_mac -j CONNMARK --save-mark

# mark connections involving mac address:
iptables -t mangle -A PREROUTING -i $if_lan -m state --state NEW -m mac --mac-source 9c:4e:36:aa:bb:cc -j mark_mac

# mark packets going to mac:
iptables -t mangle -A POSTROUTING -o $if_lan -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark


Inicialmente pensei que isso funcionaria apenas para conexões tcp originadas da lan, mas dada a definição, --state NEWdeveria funcionar em ambas as direções, tanto para tcp quanto para udp (!)

Veja tambémRoteamento de política no Linux com base no endereço MAC do remetentequal foi a inspiração para esta resposta.

Responder2

iptablesfunciona na camada 3 do OSI, portanto não sabe absolutamente nada sobre endereços MAC.

Na verdade, ele tem ummódulo mac, que, no entanto, contém apenas o filtro adicional --mac-source: isso ocorre porque os pacotes Ethernet que chegam carregam o endereço MAC de sua origem. No entanto, esse endereço MAC não existe para pacotes que chegam através de wi-fi e não é relevante para pacotes de saída. A referência acima afirma:

Observe que isso só faz sentido para pacotes vindos de um dispositivo Ethernet e entrando nas cadeias PREROUTING, FORWARD ou INPUT.

Quanto a ebtables, em primeiro lugar, ele pode ser usado apenas com frames Ethernet, porque os frames wifi perdem um endereço MAC. Em segundo lugar, os endereços de origem MAC, como disse acima, não existem em pacotes IP.

Se você quisesse controlar pacotes ARP, descobriria rapidamente que existe uma instrução

endereço arp-mac-dst [!][/mask]

A especificação do endereço de destino MAC (R)ARP

mas, mais uma vez, isso ocorre porque o protocolo ARPfazusam endereços MAC, ao contrário do protocolo IP.

informação relacionada