nftables — подсистема фильтрации сетевых пакетов в ядре Linux, включённая в ядро начиная с версии 3.13 (2014 год). Заменяет устаревший iptables и объединяет в одном инструменте: IPv4, IPv6, ARP и мостовые (bridge) таблицы. Синтаксис nftables читаем, поддерживает атомарные обновления правил и наборы данных (sets/maps) без перекомпиляции.
Как работает nftables
nftables использует виртуальную машину (VM) в ядре Linux для выполнения правил — аналогично тому, как работает BPF. Правила компилируются в байткод и исполняются в пространстве ядра без переключения контекста для каждого пакета. Это даёт выигрыш в производительности при большом числе правил по сравнению с iptables, где каждое правило — отдельная линейная проверка.
Структура nftables иерархична:
- Table (таблица) — контейнер для chains, привязанный к семейству протоколов (ip, ip6, inet, arp, bridge)
- Chain (цепочка) — последовательность правил с типом (filter, nat, route) и хуком (input, output, forward, prerouting, postrouting)
- Rule (правило) — условие + действие (accept, drop, reject, log, masquerade, dnat)
- Set (набор) — коллекция IP-адресов, портов, подсетей для эффективной фильтрации
Пример базового правила блокировки входящего SSH только с разрешённых IP:
table inet filter {
set allowed_ssh {
type ipv4_addr
elements = { 192.168.1.0/24, 10.0.0.1 }
}
chain input {
type filter hook input priority 0; policy drop;
ip saddr @allowed_ssh tcp dport 22 accept
ct state established,related accept
}
}
История
nftables разработал Патрик Маккандл (Patrick McHardy) из команды netfilter. Первый коммит в upstream-ядро Linux — декабрь 2013 года, включён в Linux 3.13 в январе 2014. Debian 10 (2019) и Ubuntu 20.04 (2020) перешли на nftables по умолчанию. В RHEL/CentOS 8 (2019) nftables стал фреймворком по умолчанию, iptables реализован через слой совместимости iptables-nft. В 2024 году большинство дистрибутивов Linux используют nftables как основу для межсетевого экрана.
nftables vs iptables
| Параметр | iptables | nftables |
|---|---|---|
| Поддержка IPv6 | Отдельный ip6tables | Единый inet family |
| Синтаксис | Флаги (-p tcp --dport) | Читаемый (tcp dport) |
| Атомарные обновления | Нет | Да (через транзакции) |
| Sets/Maps | ipset (отдельно) | Встроено |
| Производительность | Линейный перебор | Байткод VM, хеш-таблицы |
На что обращать внимание
При переходе с iptables на nftables важно: не смешивать правила iptables и nftables в одной системе (возможны конфликты). Используйте iptables-translate и iptables-restore-translate для автоматической конвертации существующих правил. На VPS-серверах с OpenVZ-виртуализацией nftables может быть недоступен из-за ограничений хост-ядра — проверяйте поддержку у провайдера.
Синтаксис nftables
Конфигурация nftables организована в таблицы (tables), цепочки (chains) и правила (rules). Таблица — пространство имён для набора цепочек. Цепочка привязывается к хуку ядра: input (входящий трафик), output (исходящий), forward (транзитный), prerouting, postrouting. Пример создания базового фаервола:
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
iif lo accept
tcp dport { 22, 80, 443 } accept
}
}
Преимущества перед iptables
В iptables для работы с IPv4 и IPv6 нужны разные утилиты: iptables и ip6tables. nftables объединяет их: семейство inet применяет правила ко всему IP-трафику. Это вдвое сокращает количество правил при дублировании политик для обоих протоколов.
Производительность: nftables использует JIT-компиляцию правил в байткод ядра, что ускоряет обработку пакетов при большом числе правил. Тест Netfilter Project показал ускорение на 20-40% при 10 000+ правилах по сравнению с iptables. Для хостинг-серверов с комплексными политиками фильтрации это ощутимо.
Инструменты управления и интеграция
Команда nft — основной интерфейс управления. nft list ruleset показывает все активные правила. nft -f /etc/nftables.conf загружает конфигурацию из файла. В Debian/Ubuntu nftables включён в базовую установку с версии Bullseye/Focal; systemd-юнит nftables.service загружает правила при старте.
Утилиты firewalld и ufw в новых версиях дистрибутивов используют nftables как бэкенд. Команды ufw allow 443/tcp или firewall-cmd --add-service=https транслируются в nftables-правила автоматически. Прямое редактирование через nft и через frontend-утилиты совместимо.