Хитрость заключается в том, чтобы объединить iptables --mac-source
с CONNMARK
:
- Сначала используйте
--mac-source
для сопоставления пакетов, поступающих с интересующего вас MAC-адреса. Это неправильное направление, поскольку вас интересуют пакеты, идущие по этому MAC-адресу, но теперь вы можете - используйте
CONNMARK
для маркировки всего соединения, то есть в обоих направлениях (!) и - установить метку от метки соединения с помощью
--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
Первоначально я думал, что это будет работать только для TCP-соединений, происходящих из локальной сети, но, учитывая его определение, --state NEW
должно работать в обоих направлениях для TCP и UDP (!)
См. Также Маршрутизация политик в Linux на основе MAC-адреса отправителя, которая послужила вдохновением для этого ответа.