O truque é combinar iptables --mac-source
com CONNMARK
:
- Primeiro use
--mac-source
para corresponder aos pacotes vindos do endereço MAC em que 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 a conexão inteira, ou seja, ambas as direções (!) e - define 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 eu pensei que isso só funcionaria para conexões tcp originárias da lan, mas dada a definição de --state NEW
, deveria funcionar em ambas as direções para ambos tcp e udp (!)
Veja também Roteamento de políticas no Linux com base no endereço MAC do remetente que foi a inspiração para esta resposta.