Маркировать пакеты с помощью iptables по MAC-адресу назначения

Маркировать пакеты с помощью iptables по MAC-адресу назначения

Мне нужно пометить пакеты, которые идут на указанный 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.

Связанный контент