Прошло уже десятилетие с момента появления nftables, но многие разработчики всё ещё цепляются за знакомый, но устаревающий инструмент iptables. Разработчики ядра Linux упорно работают над заменой старого стека, и nftables уже давно готова к бою. Пора сделать переход.
nftables предлагает не просто новые команды, а принципиально другую, более мощную парадигму управления сетевым трафиком. Она объединяет функциональность iptables, ip6tables, arptables и ebtables в единый фреймворк с очищенным синтаксисом и улучшенной производительностью.
Установка и базовые проверки
Для большинства современных дистрибутивов nftables уже предустановлена. В Arch Linux просто убедимся:
sudo pacman -S nftables
Активируем и запустим сервис:
sudo systemctl enable --now nftables
Проверим текущие правила:
sudo nft list ruleset
Если вывод пуст – всё верно, по умолчанию политики разрешающие. Для детальной проверки состояния:
sudo nft list tables
Архитектура nftables: Таблицы, цепочки и правила
Концептуальная модель сохранилась, но очищена от артефактов:
- Таблисы содержат наборы и верирстасы (цепочки)
- Верирстасы (цепочки) хранят правила обработки
- Правила содержат экспрессии для сопоставления и действий
Определимся с адресными семействами:
ip
– IPv4 (по умолчанию, можно не указывать)ip6
– IPv6inet
– совмещает IPv4 и IPv6arp
– ARP-протоколbridge
– обработка на уровне моста
Базовая конфигурация рабочей станции
Создадим таблицу filter
для семейства inet
(обрабатывает и IPv4, и IPv6):
sudo nft add table inet filter
Добавим базовые цепочки:
sudo nft add chain inet filter input \{ type filter hook input priority 0 \; policy drop \; \}
sudo nft add chain inet filter output \{ type filter hook output priority 0 \; policy accept \; \}
sudo nft add chain inet filter forward \{ type filter hook forward priority 0 \; policy drop \; \}
Политики по умолчанию:
input
: дроп всех входящихoutput
: разрешить исходящиеforward
: дроп пересылок (типично для рабочей станции)
Добавим необходимые исключения. Для работы с IPv4 и IPv6 используем ключевое слово meta protocol
:
# Разрешить установленные/связанные подключения
sudo nft add rule inet filter input ct state established,related counter accept
# Разрешить loopback
sudo nft add rule inet filter input iifname "lo" counter accept
# Открыть SSH (только IPv4)
sudo nft add rule inet filter input tcp dport 22 ip saddr 192.168.0.0/24 counter accept
# Разрешить ICMP для диагностики
sudo nft add rule inet filter input meta protocol ipv4 icmp type { echo-request, echo-reply } counter accept
sudo nft add rule inet filter input meta protocol ipv6 icmpv6 type { nd-neighbor-solicit, echo-request, echo-reply } counter accept
Управление состоянием правил
Вывести текущие правила:
sudo nft list ruleset
Сохранить конфигурацию в файл:
sudo nft list ruleset > /etc/nftables.conf
Для автоматической загрузки правил создадим /etc/nftables.conf
и запишем в него текущую конфигурацию. Затем активируем сервис:
sudo systemctl enable nftables
Расширенные возможности
Наборы (sets) для групп IP
Динамическое управление IP-адресами:
sudo nft add set inet filter allowed_ips \{ type ipv4_addr \; size 65535 \; flags timeout \; \}
# Разрешить доступ для IP из набора
sudo nft add rule inet filter input ip saddr @allowed_ips tcp dport 22 counter accept
# Добавить IP с временным доступом (1 час)
sudo nft add element inet filter allowed_ips \{ 192.168.1.50 timeout 1h \}
Лимиты скорости обработки
Защита от брутфорса SSH:
sudo nft add chain inet filter ssh_flood
sudo nft add rule inet filter input tcp dport 22 \
jump ssh_flood
sudo nft add rule inet filter ssh_flood \
meter flood size 128000 \; \
add @flood \{ ip saddr over 5/second \; } \
counter reject with tcp reset
Интеграция с Docker: Основная проблема
Docker при старте разрушает правила nftables. Радикальное решение – полное отключение управления Docker сетями через файрвол с помощью /etc/docker/daemon.json
:
{
"iptables": false
}
После этого настраиваем маршрутизацию для докера вручную с помощью nftables.
Переход с iptables
Существуют инструменты миграции, однако ручная настройка предпочтительна. Для автоматического преобразования:
sudo iptables-save > iptables-backup
sudo iptables-restore-translate -f iptables-backup > nftables.conf
sudo cp nftables.conf /etc/nftables.conf
Всегда проверяйте результаты автоматической конвертации в тестовой среде.
Почему nftables, а не iptables?
- Производительность: Архитектура netfilter в ядре оптимизирована под nftables
- Упрощённый синтаксис: Один фреймворк вместо четырёх
- Маппинги и верирстасы: Обработка множеств адресов в одной операции
- Объединение стеков: Обработка IPv4/IPv6 в единой конфигурации
- Консистентность: Единая политика без дублирования правил
Интересный факт: по данным тестирования на многопоточных системах, nftables демонстрирует до 4х лучшую производительность при обработке большого количества правил благодаря новой виртуальной машине и более эффективным структурам данных.
Практические советы
- Все изменения тестируйте с
nft --debug all
, прежде чем вводить в эксплуатацию - Используйте
sudo nft monitor trace
для отладки цепочек обработки в реальном времени - Для быстрого сброса:
sudo nft flush ruleset
, но осторожно – не потеряйте доступ! - Весь сложный сетевой конфиг группируйте в отдельные именованные файлы через
include
- Работайте через конфигурационный файл вместо CLI для сложных схем
- Для экспресс-защиты:
sudo nft add rule inet filter input tcp dport 28 counter drop
- Всегда проверяйте порядок правил – nftables обрабатывает по очереди до первого совпадения
Современный Linux требует современных инструментов безопасности. Освоив nftables сегодня, вы получаете базовый навык работы с сетевым стеком будущих версий дистрибутивов. Исходные файлы конфигураций из статьи можно найти на GitHub gist [ссылка_не_приведена_для_краткости]. Последние обновления, экспериментальные фичи и виртуалмашинные расширения стоит изучать в официальном мане: man 8 nft
.