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

5743
Serhii Matrunchyk

Мне нужно пометить пакеты, которые идут на указанный Mac-адрес.

Мне нужно это использовать в Shaper с 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 счетчиков)

Пожалуйста помоги! Спасибо вам большое!

3

2 ответа на вопрос

2
lemonsqueeze

Хитрость заключается в том, чтобы объединить 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-адреса отправителя, которая послужила вдохновением для этого ответа.

-1
MariusMatutiae

iptablesработает на уровне 3 OSI, поэтому он ничего не знает о MAC-адресах.

На самом деле, он имеет модуль mac, который, однако, содержит только дополнительный фильтр --mac-source: это потому, что входящие пакеты Ethernet несут MAC-адрес своего источника. Однако такой MAC-адрес не существует для пакетов, поступающих через Wi-Fi, и он не имеет отношения к исходящим пакетам. Ссылка выше гласит:

Обратите внимание, что это имеет смысл только для пакетов, поступающих с устройства Ethernet и входящих в цепочки PREROUTING, FORWARD или INPUT.

Что касается ebtables, в первую очередь, его можно использовать только с кадрами Ethernet, потому что кадры Wi-Fi пропускают один MAC-адрес. Во-вторых, MAC-адреса источника, как я уже говорил выше, не существуют в IP-пакетах.

Если бы вы хотели контролировать пакеты ARP, вы бы быстро узнали, что есть инструкция

arp-mac-dst [!] адрес [/ маска]

Спецификация (R) ARP MAC-адреса назначения

но, опять же, это becausethe протокола ARP это использовать MAC - адреса, в отличие от протокола IP.

Спасибо. Я использовал `ebtables -t nat -A PREROUTING -p arp --arp-mac-dst bc: 5f: f4: aa: bb: cc -j mark - mark-set 0x2003` и` ebtables -t nat -L - -Lv` показывает нет матчей .. Serhii Matrunchyk 9 лет назад 0
Этот ответ вводит в заблуждение: в сетях wifi есть mac-адреса, и с ними отлично работает `iptables --mac-source`. Вероятно, на странице руководства должно быть написано: «... с устройства Ethernet / Wi-Fi» lemonsqueeze 7 лет назад 1