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 ?
- Или можно дополнительно изолировать мост от трафика, исходящего от других интерфейсов?