
Preciso marcar os pacotes que vão para um endereço MAC especificado.
Eu preciso disso para usar no shaper com tc
.
--mac-destination
nã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 --Lc
me mostra 0 contadores)
Por favor ajude! Muito obrigado!
Responder1
O truque é combinar iptables --mac-source
com CONNMARK
:
- Primeiro use
--mac-source
para 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
CONNMARK
para 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 NEW
deveria 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
iptables
funciona 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.