От iptables к nftables: Современный файрвол для Linux-разработчика

Прошло уже десятилетие с момента появления nftables, но многие разработчики всё ещё цепляются за знакомый, но устаревающий инструмент iptables. Разработчики ядра Linux упорно работают над заменой старого стека, и nftables уже давно готова к бою. Пора сделать переход.

nftables предлагает не просто новые команды, а принципиально другую, более мощную парадигму управления сетевым трафиком. Она объединяет функциональность iptables, ip6tables, arptables и ebtables в единый фреймворк с очищенным синтаксисом и улучшенной производительностью.

Установка и базовые проверки

Для большинства современных дистрибутивов nftables уже предустановлена. В Arch Linux просто убедимся:

bash
sudo pacman -S nftables

Активируем и запустим сервис:

bash
sudo systemctl enable --now nftables

Проверим текущие правила:

bash
sudo nft list ruleset

Если вывод пуст – всё верно, по умолчанию политики разрешающие. Для детальной проверки состояния:

bash
sudo nft list tables

Архитектура nftables: Таблицы, цепочки и правила

Концептуальная модель сохранилась, но очищена от артефактов:

  • Таблисы содержат наборы и верирстасы (цепочки)
  • Верирстасы (цепочки) хранят правила обработки
  • Правила содержат экспрессии для сопоставления и действий

Определимся с адресными семействами:

  • ip – IPv4 (по умолчанию, можно не указывать)
  • ip6 – IPv6
  • inet – совмещает IPv4 и IPv6
  • arp – ARP-протокол
  • bridge – обработка на уровне моста

Базовая конфигурация рабочей станции

Создадим таблицу filter для семейства inet (обрабатывает и IPv4, и IPv6):

bash
sudo nft add table inet filter

Добавим базовые цепочки:

bash
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:

bash
# Разрешить установленные/связанные подключения
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

Управление состоянием правил

Вывести текущие правила:

bash
sudo nft list ruleset

Сохранить конфигурацию в файл:

bash
sudo nft list ruleset > /etc/nftables.conf

Для автоматической загрузки правил создадим /etc/nftables.conf и запишем в него текущую конфигурацию. Затем активируем сервис:

bash
sudo systemctl enable nftables

Расширенные возможности

Наборы (sets) для групп IP

Динамическое управление IP-адресами:

bash
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:

bash
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:

json
{
  "iptables": false
}

После этого настраиваем маршрутизацию для докера вручную с помощью nftables.

Переход с iptables

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

bash
sudo iptables-save > iptables-backup
sudo iptables-restore-translate -f iptables-backup > nftables.conf
sudo cp nftables.conf /etc/nftables.conf

Всегда проверяйте результаты автоматической конвертации в тестовой среде.

Почему nftables, а не iptables?

  1. Производительность: Архитектура netfilter в ядре оптимизирована под nftables
  2. Упрощённый синтаксис: Один фреймворк вместо четырёх
  3. Маппинги и верирстасы: Обработка множеств адресов в одной операции
  4. Объединение стеков: Обработка IPv4/IPv6 в единой конфигурации
  5. Консистентность: Единая политика без дублирования правил

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

Практические советы

  1. Все изменения тестируйте с nft --debug all, прежде чем вводить в эксплуатацию
  2. Используйте sudo nft monitor trace для отладки цепочек обработки в реальном времени
  3. Для быстрого сброса: sudo nft flush ruleset, но осторожно – не потеряйте доступ!
  4. Весь сложный сетевой конфиг группируйте в отдельные именованные файлы через include
  5. Работайте через конфигурационный файл вместо CLI для сложных схем
  6. Для экспресс-защиты: sudo nft add rule inet filter input tcp dport 28 counter drop
  7. Всегда проверяйте порядок правил – nftables обрабатывает по очереди до первого совпадения

Современный Linux требует современных инструментов безопасности. Освоив nftables сегодня, вы получаете базовый навык работы с сетевым стеком будущих версий дистрибутивов. Исходные файлы конфигураций из статьи можно найти на GitHub gist [ссылка_не_приведена_для_краткости]. Последние обновления, экспериментальные фичи и виртуалмашинные расширения стоит изучать в официальном мане: man 8 nft.