Рейтинг:1

Фильтрация трафика по MAC-адресу с помощью nftables

флаг in

TL;DR: при подделке MAC-адресов, как я могу убедиться, что настоящие адреса не утекут в остальную часть сети с помощью nftables?

Контекст

В целях обучения сетевой безопасности я в настоящее время создаю сетевой кран состоящий из прозрачный мост с двумя интерфейсами (кран).

Кран - компьютер работает Debian Яблочко, который имеет 4 следующих интерфейса Ethernet:

Интерфейс МАК
enp3s0 00:90:27:б4:40:58
enp4s0 00:90:27:б4:40:59
enp6s0 00:90:27:б4:40:5а
enp7s0 00:90:27:б4:40:5б
  • enp3s0 подключается к коммутатору и получает IP-адрес через DHCP.
  • Кроме того, я создал мост br0 с помощью nmcli с двумя подчиненными интерфейсами: enp6s0 и enp7s0.
  • enp7s0 подключен к коммутатору

Мост создается следующим образом:

Соединение nmcli добавить соединение.тип моста ifname br0 con-name br0 ipv4.method disabled ipv6.method ignore bridge.stp нет bridge.vlan-filtering yes connection.autoconnect-slaves 1 autoconnect нет
Соединение nmcli add type ethernet ifname enp6s0 con-name br0-slave-enp6s0 slave-type bridge master br0 autoconnect no
Соединение nmcli add type ethernet ifname enp7s0 con-name br0-slave-enp7s0 slave-type bridge master br0 autoconnect no

Цель

Я хочу, чтобы машина оставалась скрытность всегда в сети, так как это пассивный кран, поэтому я хочу отбросить исходящий трафик что может случайно утечка MAC-адреса моей машины. Поэтому я сделал попытку с nftables следующим образом, с именованный набор для MAC-адресов:

таблица netdev мост {
    установить макинтош {
        введите ether_addr
        элементы = {00:90:27:b4:40:59,
                 00:90:27:б4:40:5а, 00:90:27:б4:40:5б }
    }

    цепь br0 {
        type filter hook ingress devices = { enp4s0, enp6s0, enp7s0 } фильтр приоритета; политика принять;
        эфир saddr @macs капля
        log помечает все счетчики префикса "myfilter"
    }
}

Я также хочу иметь счетчики и данные журнала отброшенных пакетов.

Проблема

Трафик сбрасывается, и ведение журнала выполняется в /var/log/syslog, как и ожидалось. Счетчики обновляются. Но правило netfilter, похоже, не работает должным образом. Вместо этого он, кажется, сбрасывает весь трафик, отправленный на enp7s0.

Образец:

20 декабря, 01:23:47, ядро ​​testbox: [32441.125971] myfilter IN=enp7s0 OUT= MACSRC=10:c2:5a:58:72:8f MACDST=01:00:5e:7f:ff:fa MACPROTO=0800 SRC= 192.168.0.1 DST=239.255.255.250 LEN=367 TOS=0x00 PREC=0x00 TTL=4 ID=37026 PROTO=UDP SPT=1900 DPT=1900 LEN=347 
20 декабря, 01:23:47, ядро ​​testbox: [32441.126842] myfilter IN=enp7s0 OUT= MACSRC=10:c2:5a:58:72:8f MACDST=01:00:5e:7f:ff:fa MACPROTO=0800 SRC= 192.168.0.1 DST=239.255.255.250 LEN=312 TOS=0x00 PREC=0x00 TTL=4 ID=37027 PROTO=UDP SPT=1900 DPT=1900 LEN=292 
20 декабря, 01:23:47, ядро ​​testbox: [32441.127554] myfilter IN=enp7s0 OUT= MACSRC=10:c2:5a:58:72:8f MACDST=01:00:5e:7f:ff:fa MACPROTO=0800 SRC= 192.168.0.1 DST=239.255.255.250 LEN=303 TOS=0x00 PREC=0x00 TTL=4 ID=37028 PROTO=UDP SPT=1900 DPT=1900 LEN=283 
20 декабря, 01:23:47, ядро ​​testbox: [32441.128342] myfilter IN=enp7s0 OUT= MACSRC=10:c2:5a:58:72:8f MACDST=01:00:5e:7f:ff:fa MACPROTO=0800 SRC= 192.168.0.1 DST=239.255.255.250 LEN=377 TOS=0x00 PREC=0x00 TTL=4 ID=37029 PROTO=UDP SPT=1900 DPT=1900 LEN=357 
20 декабря, 01:23:53, ядро ​​testbox: [32447.003559] myfilter IN=enp7s0 OUT= MACSRC=10:c2:5a:58:72:8f MACDST=33:33:00:00:00:01 MACPROTO=86dd SRC= fe80:0000:0000:0000:12c2:5aff:fe75:899d DST=ff02:0000:0000:0000:0000:0000:0000:0001 LEN=176 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=134 КОД=0 
20 декабря, 01:23:53, ядро ​​testbox: [32447.015382] myfilter IN=enp7s0 OUT= MACSRC=00:90:27:e6:10:58 MACDST=33:33:00:00:00:16 MACPROTO=86dd SRC= fe80:0000:0000:0000:6d06:284e:2844:db03 DST=ff02:0000:0000:0000:0000:0000:0000:0016 LEN=136 TC=0 HOPLIMIT=1 FLOWLBL=0 OPT ( ) PROTO=ICMPv6 ТИП=143 КОД=0 
20 декабря, 01:23:53, ядро ​​testbox: [32447.619279] myfilter IN=enp7s0 OUT= MACSRC=00:90:27:e6:10:58 MACDST=33:33:00:00:00:16 MACPROTO=86dd SRC= fe80:0000:0000:0000:6d06:284e:2844:db03 DST=ff02:0000:0000:0000:0000:0000:0000:0016 LEN=136 TC=0 HOPLIMIT=1 FLOWLBL=0 OPT ( ) PROTO=ICMPv6 ТИП=143 КОД=0 

Я считаю, что мне может понадобиться использовать выход хук вместо входа. Я так понимаю, выходной хук доступен в nft с версии 1.01. Текущая стабильная версия nft в Debian — 0.98, поэтому я вручную обновился до версии 1.01, загрузив пакеты вручную. Но замена ingress на egress не работает: nft не распознает мое правило.

Вопросы

  • Имеет ли смысл мой подход? Могу ли я использовать входной хук для своих целей? Или нужен выезд?
  • В качестве альтернативы, это можно сделать с помощью tc ?
  • Или можно дополнительно изолировать мост от трафика, исходящего от других интерфейсов?
A.B avatar
флаг cl
A.B
В качестве примечания: поддержка nftables netdev egress на стороне ядра Linux начинается с Linux 5.16 (включая «текущий» 5.16-rc6).
Kate avatar
флаг in
@A.B Хорошая мысль: мое работающее ядро ​​явно недостаточно свежее: Linux testbox 5.10.0-9-amd64 #1 SMP Debian 5.10.70-1 (2021-09-30) x86_64 GNU/Linux

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.