nftables: Блокировка ARP-пакетов для диапазона MAC-адресов

Вопрос или проблема

Я хочу заблокировать 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

Объяснение:

  1. Создание таблицы ARP: Мы создаём таблицу arp_table, куда будем добавлять наши правила.

  2. Создание цепочки: В цепочке входящих ARP-пакетов устанавливаем политику по умолчанию accept, которая позволяет пропускать пакеты, если они не соответствуют блокируемым адресам.

  3. Блокировка диапазона MAC-адресов: Используя битовые операции и маску, мы проверяем последний октет. Каждому значению от 01 до 0A создаётся отдельное правило. Мы используем маску ff:ff:ff:ff:ff:0f, чтобы изолировать последние 4 бита, а затем сравниваем с соответствующими адресами.

Таким образом, вы сможете эффективно блокировать ARP-пакеты из указанного диапазона MAC-адресов в вашем сетевом окружении, используя nftables.

Оцените материал
Добавить комментарий

Капча загружается...