nftables: современный firewall для Linux-сервера
Перед работой с nftables убедитесь, что есть физический или console-доступ к серверу. Ошибочная цепочка input может заблокировать SSH и отсечь от машины.
nftables пришёл на смену iptables в ядре Linux начиная с версии 3.13. Если вы всё ещё пишете правила в стиле iptables — пора пересмотреть подход. nftables быстрее, имеет встроенную поддержку IPv4/IPv6 в одном интерфейсе и позволяет работать с ruleset как с целым, а не набирать команды по одной.
Зачем переходить с iptables
iptables имеет несколько фундаментальных проблем. Каждая таблица (filter, nat, mangle) — отдельный набор правил с собственной семантикой. Нет встроенной поддержки одновременной работы с IPv4 и IPv6 — приходится писать два набора правил. Производительность падает при большом количестве правил из-за линейного поиска.
nftables решает это иначе. Все протоколы работают в единой структуре данных — ruleset. Ядро компилирует правила в эффективные структуры поиска. Атомарная замена ruleset исключает race condition при обновлении правил.
В дистрибутивах на базе RHEL 8 и новее iptables по умолчанию перенаправляется в nftables. В Ubuntu 22.04 и старше — аналогично. Проверьте update-alternatives --display iptables.
Базовые команды: просмотр и сброс правил
Первая команда, которую стоит запомнить:
Вывод показывает все таблицы, цепочки и правила. Без таблиц вывод пуст — это нормально.
Создаём таблицу с именем filter для работы с пакетами:
inet означает, что таблица обрабатывает оба протокола. Для IPv4-only — ip, для IPv6 — ip6.
Добавляем цепочку для входящего трафика:
Разберём флаги:
| Флаг | Назначение |
|---|---|
type filter | Тип цепочки — фильтрация пакетов |
hook input | Точка подключения — входящие пакеты |
priority 0 | Порядок обработки относительно других хуков |
policy accept | Дефолтное действие — пропускать всё |
Сброс правил в цепочке:
Удаление всей таблицы:
Добавление и удаление правил по handle
Создадим несколько правил и посмотрим их handle:
Вывод покажет что-то вроде:
Handle скрыт в выводе по умолчанию. Для работы с конкретным правилом:
Добавим -a и увидим handle для каждого правила. Теперь можем удалять по номеру:
Handle меняется при каждом добавлении или удалении правила. Если скрипт модифицирует ruleset, сохраняйте вывод nft -a list ruleset в файл для отслеживания.
Добавим правило с приоритетом перед существующими — в начало цепочки:
Команда add добавляет в конец, insert — в начало. Для вставки в конкретную позицию:
Атомарная замена ruleset
Ручное добавление правил по одному создаёт промежуток времени, когда часть правил уже активна, а часть — ещё нет. Для продакшена это неприемлемо.
Решение — записать полный ruleset в файл и загрузить атомарно:
Файл /etc/nftables.conf — стандартное место в большинстве дистрибутивов. Теперь редактируем его:
Загружаем:
flush ruleset перед загрузкой очищает всё. Если нужно добавить правила к существующим — уберите эту строку.
Проверяем без применения:
Флаг -c выполняет синтаксическую проверку без изменения состояния. Полезно в CI/CD перед деплоем.
Чтобы правила переживали перезагрузку в systemd-дистрибутивах:
nftables.service загружает /etc/nftables.conf при старте. После правки файла применяйте systemctl restart nftables.
Цепочка forward
Если машина не роутер, forward оставляют пустым с политикой drop. Когда включён IP-forwarding, минимум — ответы на установленные соединения и транзит между интерфейсами:
Для отладки можно логировать пакеты перед неявным drop:
Логи появятся в journalctl -k или /var/log/kern.log.
Типовые сценарии: блокировка порта и IP
Блокировка входящего подключения с конкретного IP:
Блокировка исходящего на конкретный IP:
Блокировка диапазона IP (CIDR):
Блокировка порта для всех:
Разрешить порт только для конкретной подсети:
Логирование отброшенных пакетов:
Счётчики видны в выводе nft list ruleset — показывают количество пакетов и байт.
NAT через маскарадинг
Для выхода локальной сети в интернет через один IP-адрес:
Маскарадинг автоматически подставляет внешний IP интерфейса. Для NAT с пробросом портов:
NAT в nftables работает только для IPv4. Для IPv6 используйте stateless NAT66 или адресацию на уровне маршрутизации.
Режим совместимости iptables-nft
В некоторых дистрибутивах iptables остаётся «работающей» за счёт трансляции в nftables:
Проблема в том, что это два разных мира правил. iptables-nft транслирует команды в nftables, но обратная совместимость не работает. Правила, созданные через iptables, не увидите в nft list ruleset напрямую.
Не используйте одновременно iptables и nftables. Результат непредсказуем. Либо полностью переходите на nftables, либо остаётесь на iptables. Проверьте текущий режим: iptables -V покажет, используется iptables-legacy или iptables-nft.
Для миграции с iptables есть утилита iptables-translate:
Вывод: nft add rule ip filter input tcp dport 22 accept. Ручная проверка вывода обязательна — автоматическая трансляция не идеальна.
nftables — это не будущее, а настоящее. Если вы администрируете Linux-серверы, потратьте вечер на миграцию. Файл /etc/nftables.conf с полным ruleset — это ваш бэкап и деплой в одном флаконе.