
Мне нужно пометить пакеты, которые идут на указанный MAC-адрес.
Мне это нужно для использования в шейпере с tc
.
--mac-destination
не существует в iptables
.
Также я пробовал использовать ebtables
:
ebtables -t nat -A POSTROUTING -d 9c:4e:36:aa:bb:cc -j mark --set-mark 0x2003 --mark-target ACCEPT
но он ничего не отмечает (по крайней мере ebtables -t nat -L --Lc
мне показывает 0 счетчиков)
Помогите, пожалуйста! Большое спасибо!
решение1
Хитрость заключается в том, чтобы объединить 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-адреса отправителячто послужило вдохновением для этого ответа.
решение2
iptables
работает на уровне OSI 3, поэтому он вообще ничего не знает о MAC-адресах.
На самом деле, у него естьмодуль mac, который, однако, содержит только дополнительный фильтр --mac-source
: это происходит потому, что входящие пакеты Ethernet несут MAC-адрес своего источника. Однако такой MAC-адрес не существует для пакетов, входящих через Wi-Fi, и он не имеет отношения к исходящим пакетам. В ссылке выше указано:
Обратите внимание, что это имеет смысл только для пакетов, поступающих с устройства Ethernet и входящих в цепочки PREROUTING, FORWARD или INPUT.
Что касается ebtables
, то, во-первых, его можно использовать только с кадрами Ethernet, поскольку кадры Wi-Fi пропускают один MAC-адрес. Во-вторых, MAC-адреса источника, как я уже сказал выше, не существуют в IP-пакетах.
Если бы вы хотели контролировать пакеты ARP, вы бы быстро обнаружили, что существует инструкция
arp-mac-dst [!] адрес[/маска]
Спецификация MAC-адреса назначения (R)ARP
но, опять же, это потому, что протокол ARPделаетиспользуют MAC-адреса, в отличие от протокола IP.