Как стать автором
Обновить
946.34
OTUS
Цифровые навыки от ведущих экспертов

Как работать с файрволлом через nftables

Время на прочтение5 мин
Количество просмотров18K

Статья расскажет об инструменте для управления сетевой подсистемы ОС Debian - nftables. Статья не предполагает доскональный разбор работы утилиты и расскажет только об основах использования.

Особенности инструмента

nftables является фреймворком, который предоставляет возможность фильтрации и трансляции сетевых данных внутри операционной системы. Cтоит подчеркнуть, что это именно фреймворк и он может быть использован в том числе чтобы создавать собственное программное обеспечение, которое будет работать с сетью.

Для работы c файрволом на данный момент, согласно официальной документации Debian, рекомендуется использовать именно nftables.

Если использовать фреймворк только для работы с сетью без написания дополнительного кода, то все команды могут быть переданы через специальную утилиту nft. Сама по себе утилита может заменять сразу несколько утилит, вот их список:

  • ip6tables

  • arptables

  • ebtables

  • iptables

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

nft <флаги> -I <директория> -f <имя файла> -i <команда>

Такая запись представлена в man, но на самом деле удобнее пользоваться режимомо interactive. Для более простого запоминания команд лучше пользоваться структурой, которая используется для хранения правил. В ntftables все данные о фильтрации хранятся вот так:

Правило->Цепочка->Таблица

Чтобы создавать, изменять или копировать правила для обработки сетевых данных необходимо обязательно указывать все данные, которые относятся к правилу. Так как это может быть неудобно, то можно пользоваться специальными идентификаторами, которые назначаются автоматически. Вообще, благодаря интерактивному режиму, в который можно перейти набрав команду:

nft --interactive

Можно просто вводить новые правила как будто работаете с базой данных. По сути вся структура хранения правил взята именно оттуда. Например, посчитаем размер и количество пакетов, которые попадают на наш активный сетевой интерфейс:

nft --interactive
create table inet test1 
add chain inet test1 packetin { type filter hook input priority 0; }
add rule inet test1 packetin counter

В итоге, если мы будем набирать команду:

nft list ruleset

Из картинки видно, что структура правил имеет иерархию, это может помочь выявлять зависимости между таблицами, цепочками и самими правилами.

В nft есть свои особенные фичи:

  1. Таблицы для цепочек можно называть как угодно, но тип нужно определять как обязательный параметр. Вообще типы это просто вариации структур, которые хранят данные о заданном протоколе. Вот список возможных типов:

    • ip

    • ip6

    • inet

    • arp

    • bridge

    • netdev

Если при создании таблицы не будет явно указан тип, то будет создана таблица с типом ip по-умолчанию.

  1. Хуки - используются для того чтобы запустить правило в определенным момент обработыки сетевых данных. Сами по себе хуки работают опираясь на тип таблиц.
    Например, для ip, ip6 и inet существуют вот такие:

    • prerouting - обработка всех входящих пакетов, это вообще ВСЕ пакеты, которые могут быть приняты системой.

    • input - пакеты, которые пришли для системы.

    • forward - пакеты, которые пересылаются для другой системы через нашу

    • output - пакеты, которые будут отправляться от операционной системы во внешнюю сеть

    • postrouting - все пакеты, которые покидают систему, это те которые генерируются ОС и те, которые просто были пересланы

    • ingress - доступен только для inet, начиная с версии ядра 5.10, тут обработка происходит для всех пакетов, которые приходят в систему, срабатывает раньше других хуков.

  2. Все правила разделяются на базовые и регулярные правила. Регулярные правила могут быть использованы для создания длинных последовательностей разбора данных или по просту говоря это принцип группировки правил. Для их задействования нужно явно их позвать из правила. Базовые же правила можно использовать сразу, единственное условие, базовые правила должны подчиняться следующему шаблону:

type <> hook <> priority <>;

Знаками <> показаны типы параметров. Тоесть type, hook, priority для базового правила обязательны. Иначе будет выдана ошибка о неверном синтаксисе. Какие существуют параметры:
type:
- nat
- route
- filter
hook:
- значения зависят от типа выбранной таблицы
priority:
- так же опираются на тип выбранной таблицы, поэтому для каждого случая нужно обращаться в man для выбора верного параметра. Вообще для этого параметра используются целые числа. Чем меньше число, тем выше приоритет у правила. (Могут быть и отрицательные значения). И так как приоритет показывает в какой момент надо запустить правило, приоритеты используются для косвенного дополнения с каким хуком работать. Например приоритет raw имеет значение -300, работает он для таблиц ip, ip6, inet и его можно использовать для любых видов хуков.

Примеры использования инструмента и стенд для тестов

Для работы с nft утилитой воспользуемся крайним билдом Debian на момент написания статьи - Debian 11.2.0. При установке с DVD ISO файла, может быть проблема с запуском nft. Для корректной работы можно добавить в переменную окружения HOME директорию sbin. После установки, можно просто набирать команды как показано в статье. В качестве второго хоста для тестов будем использовать Kali Linux. Вообще можно пользоваться любым дистрибутивом, но Kali Linux сразу включает в себя большое количество инструментов для работы с низкоуровневым представлением данных, которые передаются по сети.

Для практики попробуем решить следующие задачи:

  1. Повторить хотя бы одно правило по синтаксису iptables

  2. Реализовать правило логирования обращения по порту в (/var/log/syslog)

Пример №1

Повторение правила реализовать правило достаточно просто. Запишем пример для iptables:

iptables -A INPUT -i enp0s3 -p tcp --dport 9090 -j DROP
Простое правило, которое должно запрещать обращение по tcp протоколу для порта 9090.

Вот так это будет для nft:

nft --interactive
add table inet MyTable
add chain inet MyTable MyChain { type filter hook input priority 0; policy drop}
add rule inet MyTable MyChain tcp dport 9090 counter drop

Проверим работоспособность. На Kali Linux будем использовать iptables, а на Debian nft.
И так, проведем подготовку на Kali Linux:

  • запустим netcat на порту 9090

  • настроим правило для запрета доступа по tcp

Отправим тестовые данные с Debian, или попробуем просто настроить взаимодействие с открытым портом:

На картинке видно, что никакого коннекта нет и данные не поступают. Попробуем в обратную сторону произвести точно такую же операцию, но будем пользоваться nft.

Настройка Debian и открытие порта:

После коннекта можно запустить команду:

nft list ruleset

И получить дооплнительную информацию о том как другие системы пытались подключиться к порту.

Пример №2

Настройка может быть следующей:

nft --interactive
add table inet MyTable
add chain inet MyTable MyChain {type filter hook input priority 0;}
add rule inet MyTable MyChain tcp dport 9090 ct state new log flags all prefix "Connection was established for TEST PORT 9090:" accept

Попробуем открыть соединение и заглянуть в лог:

Таким образом можно использовать инструмент nft для работы с файрволлом. Инструмент довольно своеобразный, чтобы его использовать на постоянной основе нужно привыкнуть к тому, что те данные, которые раньше заносились через iptables автоматически, теперь нужно прописывать самостоятельно. Для тех, кто больше привык к использованию iptables и не хочет переходить на новый синтаксис, можно воспользоваться iptables-nft, это тот же самый инструмент, который самостоятельно будет заполнять правила беря синтаксис iptables, и транслируя его в правила для nftables.


В преддверии старта курса Administrator Linux. Professional приглашаем всех желающих на бесплатный двухдневный интенсив по теме: "Роутер на Linux". Интенсив пройдет уде в нвом году, а именно 19 и 20 января.

В первый день интенсива мы настроим простой роутер на Linux для дома, а именно рассмотрим настройку автоматической выдачи сетевых адресов (DHCP); хранение имен сайтов для быстрой загрузки (DNS); подготовку периметра защиты от внешних атак (firewall); настройку трансляции адресов для выхода в сеть (NAT masquerade); активацию обмена пакетами с внешним миром (ip_forwarding).

В рамках второго дня поговорим про протоколы динамической маршрутизации Добавим пару сервисов. Настроим тоннеля до вашей сети (VPN WireGuard). Рассмотрим активацию протоколов динамической маршрутизации, повышение отказоустойчивости роутера к смене сети, передадим внутреннюю сеть через тоннель (OSP)

Теги:
Хабы:
Всего голосов 18: ↑14 и ↓4+10
Комментарии3

Публикации

Информация

Сайт
otus.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
OTUS