Вопрос или проблема
Я хочу заблокировать ARP-пакеты для диапазона MAC-адресов, включая любой адрес, последний октет которого находится в диапазоне от 1 до 10. Например, адреса 04:01:01:01:01:01
или 04:01:01:01:01:05
или 06:10:10:10:ff:0a
должны быть отброшены (и любые адреса между ними).
Для одного адреса я могу сделать это таким образом, но я не знаю, как это сделать для диапазона:
meta protocol arp arp saddr ether 04:11:22:33:44:80 drop
Можно ли сделать это с помощью nftables?
Вы имеете в виду диапазон MAC-адресов или список? Я предполагаю, что вы имеете в виду последнее (список), исходя из вашего описания.
Вы можете создать наборы в вашем правил nftables, которые содержат несколько значений, а затем использовать эти наборы вместо отдельных значений в ваших правилах сопоставления.
Например, чтобы заблокировать трафик от набора MAC-адресов:
table inet blocklist {
# определяем набор MAC-адресов, которые хотим заблокировать
set block_these_macs {
typeof ether saddr
elements = { 04:01:01:01:01:01,
04:01:01:01:01:05,
06:10:10:10:ff:0a }
}
# создаем цепочку фильтрации, которая будет блокировать входящий трафик
# на eth0, если адреса MAC источника содержатся в
# наборе block_these_macs.
chain block_input {
type filter hook input priority filter; policy accept;
iif eth0 ether saddr == @block_these_macs counter drop;
}
}
Чтобы отбросить ARP на основе диапазона последнего знака, вы можете сделать что-то вроде:
meta protocol arp arp saddr ether & ff:ff:ff:ff:ff:fa == 00:00:00:00:00:0a drop
Полный пример с использованием таблицы arp:
add table arp arp_table
add chain arp arp_table input {
type filter hook input priority filter; policy drop;
}
# TODO: Отбросить, если последний знак - 1-10 (1-A) в шестнадцатеричном формате
add rule arp arp_table input arp saddr ether & ff:ff:ff:ff:ff:fa == 00:00:00:00:00:0a drop
Единственная проблема в том, что я не уверен, как замаскировать последний знак так, чтобы 1-10 (1-A) совпадали как диапазон.
Ответ или решение
Для блокировки ARP-пакетов с определённым диапазоном MAC-адресов в nftables
, можно воспользоваться правилами фильтрации на основе маскирования. В вашем случае необходимо отфильтровать ARP-пакеты, у которых последний октет MAC-адреса помещается в диапазон от 01
до 0A
(в шестнадцатеричном представлении).
К сожалению, стандартная маска nftables
не позволяет напрямую задать диапазоны с использованием сравнений, но можно использовать битовые операции для достижения поставленной цели.
Ниже приведён полный пример конфигурации, который позволяет блокировать ARP-пакеты с MAC-адресами, у которых последний октет находится в диапазоне от 01
до 0A
:
# Создаем таблицу для ARP
nft add table arp arp_table
# Создаем цепочку для фильтрации входящих ARP-пакетов
nft add chain arp arp_table input {
type filter hook input priority filter; policy accept;
}
# Блокируем ARP-пакеты с диапазоном последних октетов 01-0A
nft add rule arp arp_table input meta protocol arp ether saddr & ff:ff:ff:ff:ff:0f == 00:00:00:00:00:01 drop
nft add rule arp arp_table input meta protocol arp ether saddr & ff:ff:ff:ff:ff:0f == 00:00:00:00:00:02 drop
nft add rule arp arp_table input meta protocol arp ether saddr & ff:ff:ff:ff:ff:0f == 00:00:00:00:00:03 drop
nft add rule arp arp_table input meta protocol arp ether saddr & ff:ff:ff:ff:ff:0f == 00:00:00:00:00:04 drop
nft add rule arp arp_table input meta protocol arp ether saddr & ff:ff:ff:ff:ff:0f == 00:00:00:00:00:05 drop
nft add rule arp arp_table input meta protocol arp ether saddr & ff:ff:ff:ff:ff:0f == 00:00:00:00:00:06 drop
nft add rule arp arp_table input meta protocol arp ether saddr & ff:ff:ff:ff:ff:0f == 00:00:00:00:00:07 drop
nft add rule arp arp_table input meta protocol arp ether saddr & ff:ff:ff:ff:ff:0f == 00:00:00:00:00:08 drop
nft add rule arp arp_table input meta protocol arp ether saddr & ff:ff:ff:ff:ff:0f == 00:00:00:00:00:09 drop
nft add rule arp arp_table input meta protocol arp ether saddr & ff:ff:ff:ff:ff:0f == 00:00:00:00:00:0a drop
Объяснение:
-
Создание таблицы ARP: Мы создаём таблицу
arp_table
, куда будем добавлять наши правила. -
Создание цепочки: В цепочке входящих ARP-пакетов устанавливаем политику по умолчанию
accept
, которая позволяет пропускать пакеты, если они не соответствуют блокируемым адресам. -
Блокировка диапазона MAC-адресов: Используя битовые операции и маску, мы проверяем последний октет. Каждому значению от
01
до0A
создаётся отдельное правило. Мы используем маскуff:ff:ff:ff:ff:0f
, чтобы изолировать последние 4 бита, а затем сравниваем с соответствующими адресами.
Таким образом, вы сможете эффективно блокировать ARP-пакеты из указанного диапазона MAC-адресов в вашем сетевом окружении, используя nftables
.