В современных дистрибутивах Linux актуален продвинутый подход к контролю сетевого трафика. Гибкость, производительность и поддержка современных стандартов позволяют реализовать сложные сценарии фильтрации и маршрутизации на системах Debian, Ubuntu, Arch Linux и других популярных сборках. Этот инструмент заменяет устаревшие технологии, предлагая более удобный синтаксис и расширенные возможности управления сетевыми пакетами.
Для начала работы необходимо установить пакет через менеджер пакетов. В Debian и Ubuntu выполните:
sudo apt-get install nftables
На CentOS и RHEL используйте:
sudo yum install nftables
После установки убедитесь, что служба активирована и запущена:
sudo systemctl enable nftables
sudo systemctl start nftables
Настройка осуществляется с помощью создания правил и таблиц. Вот пример простого правила блокировки доступа на порт 22:
nft add rule inet filter input tcp dport 22 drop
Для сохранения изменений на большинстве систем выполните:
sudo nft list ruleset > /etc/nftables.conf
Этот метод обеспечивает долговечное применение правил после перезагрузки системы. Особенности конфигурации зависят от конкретного дистрибутива и его системы инициализации.
Содержание статьи
Установка и настройка nftables на Linux
Во всех современных дистрибутивах Linux поддерживается мощный инструмент для управления сетевыми фильтрами. Установка и инициализация этой утилиты зависят от используемой системы и её менеджера пакетов.
Для установки на основе Debian и производных, таких как Ubuntu и Linux Mint, выполните:
sudo apt update
sudo apt install nftables
На дистрибутивах, основанных на Red Hat, таких как CentOS и RHEL, используется yum или dnf:
sudo yum install nftables
Для систем Arch Linux и его производных, включая Manjaro:
sudo pacman -S nftables
На OpenSUSE используйте:
sudo zypper install nftables
После установки нужно активировать службу. В системах с systemd выполните:
sudo systemctl enable nftables
sudo systemctl start nftables
Для проверки статуса выполните:
sudo systemctl status nftables
Конфигурация по умолчанию хранится в файле /etc/nftables.conf. Чтобы применить собственные правила, отредактируйте этот файл и загрузите конфигурацию:
sudo nft -f /etc/nftables.conf
На дистрибутивах с firewalld (например, CentOS и RHEL) необходимо отключить его перед применением других сетевых фильтров:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
В Arch Linux и Manjaro рекомендуется предварительно удалить iptables, чтобы избежать конфликтов:
sudo pacman -R iptables
После выполнения этих шагов система готова к созданию и применению правил фильтрации.
Создание правил для фильтрации трафика
Эффективная фильтрация сетевого трафика требует точного определения критериев обработки пакетов. Гибкость современных систем позволяет блокировать или разрешать пакеты на основе портов, протоколов, IP-адресов и других параметров. Управление правилами фильтрации осуществляется путем создания таблиц и цепочек.
Для начала создайте базовую таблицу в семействах inet, ip или ip6. Пример создания таблицы filter:
sudo nft add table inet filter
Добавьте цепочку для входящего трафика:
sudo nft add chain inet filter input { type filter hook input priority 0 \; }
Для блокировки всех пакетов на порт 22 используйте команду:
sudo nft add rule inet filter input tcp dport 22 drop
Чтобы разрешить входящие подключения на 80-й порт (HTTP), добавьте:
sudo nft add rule inet filter input tcp dport 80 accept
Для разрешения доступа с определенного IP-адреса:
sudo nft add rule inet filter input ip saddr 192.168.1.10 accept
Удаление конкретного правила осуществляется по его дескриптору. Получить список всех правил с номерами можно командой:
sudo nft list chain inet filter input
Удалите правило по номеру:
sudo nft delete rule inet filter input handle 5
Для очистки всей таблицы выполните:
sudo nft flush table inet filter
Изменения сохраняются в конфигурационном файле для применения при перезагрузке:
sudo nft list ruleset > /etc/nftables.conf
Такая структура правил обеспечивает гибкое и точное управление трафиком на уровне ядра.
Управление сетевыми таблицами и цепочками
Организация правил фильтрации начинается с создания сетевых таблиц и цепочек. Каждая таблица служит для группировки цепочек, а цепочки – для структурирования правил обработки пакетов. Разделение на семейства позволяет фильтровать трафик для разных протоколов, таких как IPv4, IPv6 и AR.
Для создания новой таблицы выполните:
sudo nft add table inet my_table
Таблицы могут быть удалены при необходимости:
sudo nft delete table inet my_table
Внутри таблицы определяются цепочки для обработки пакетов. Пример добавления цепочки для входящего трафика с типом filter:
sudo nft add chain inet my_table my_input { type filter hook input priority 0 \; }
Назначение параметров цепочки:
- type – тип цепочки (например, filter).
- hook – точка привязки цепочки (input, output, forward).
- priority – приоритет выполнения.
Для просмотра текущих таблиц и цепочек выполните:
sudo nft list tables
Просмотр содержимого определённой таблицы:
sudo nft list table inet my_table
Удаление цепочки из таблицы:
sudo nft delete chain inet my_table my_input
Полная очистка таблицы от всех цепочек и правил:
sudo nft flush table inet my_table
Такая структура позволяет точно управлять обработкой пакетов, оптимизируя сетевую безопасность и производительность.
Анализ логов и отладка конфигурации
Эффективная диагностика сетевых правил требует тщательного анализа логов и проверки текущих настроек. Правильное логирование позволяет выявить ошибки в конфигурации и отследить подозрительный трафик. Системы на базе Linux поддерживают отправку сообщений в стандартные журналы через syslog или journald.
Для добавления логирования в правило фильтрации используйте следующую команду:
sudo nft add rule inet filter input log prefix "INPUT DROP: " drop
В параметре prefix задаётся текст, который будет добавлен к записи в журнале. Просмотр логов можно осуществить через journalctl:
sudo journalctl -k | grep "INPUT DROP"
На системах с rsyslog сообщения записываются в файл /var/log/kern.log или /var/log/messages. Для анализа логов выполните:
sudo tail -f /var/log/kern.log
При отладке конфигурации полезно просмотреть текущие правила и их статистику:
sudo nft list ruleset -a
Флаг -a добавляет номера (handle) для каждого правила, что упрощает их удаление или редактирование.
Для тестирования отдельных правил можно использовать команду трассировки:
sudo nft trace start
Эта команда включает трассировку обработки пакетов. Для остановки трассировки выполните:
sudo nft trace stop
Анализ логов и трассировка позволяют оперативно выявлять ошибки и корректировать конфигурацию фильтрации для повышения безопасности системы.
Сравнение nftables с iptables и firewalld
Для фильтрации сетевого трафика в Linux используются различные инструменты. Среди них наибольшее распространение получили iptables, firewalld и современная альтернатива с улучшенной производительностью и гибкостью. Каждый из этих инструментов имеет свои особенности и области применения.
iptables представляет собой классический метод управления фильтрацией пакетов. Конфигурация выполняется через команды для добавления, изменения и удаления правил:
sudo iptables -A INPUT -p tcp --dport 22 -j DROP
Несмотря на широкую поддержку и простоту, он неэффективен при сложных конфигурациях из-за линейной структуры и отсутствия единого пространства для правил IPv4 и IPv6.
firewalld предоставляет интерфейс для динамического управления правилами через зоны и службы. Используется преимущественно в дистрибутивах на базе Red Hat и CentOS:
sudo firewall-cmd --add-service=ssh --permanent
Главное преимущество – возможность изменения конфигурации без перезапуска службы. Однако, он менее гибок для сложных сценариев и завязан на iptables.
Современный инструмент объединяет преимущества предшественников, предоставляя деревообразную структуру и поддержку нескольких протоколов в одном пространстве. Пример создания правила для блокировки SSH:
sudo nft add rule inet filter input tcp dport 22 drop
Этот подход отличается более высокой производительностью и упрощённым синтаксисом для сложных конфигураций. Он заменяет устаревшие системы и рекомендуется для новых установок на Debian, Ubuntu, Arch Linux и других дистрибутивах.

