iptables vs nftables: What's the Difference?

Как перейти с iptables на nftables: пошаговая инструкция

Опубликовано: Обновлено: Полезное8 мин чтения
Как перейти с iptables на nftables: пошаговая инструкция

Перейти с iptables на nftables можно за полчаса и без простоя: сохраните текущие правила командой iptables-save, переведите их в синтаксис nftables утилитой iptables-restore-translate, проверьте результат командой nft -c -f и включите службу nftables. Ниже — пошаговая инструкция для Debian, Ubuntu и RHEL-подобных систем с проверкой и планом отката.

Главное

  • nftables встроен в ядро Linux с версии 3.13 и с Debian 10 является фреймворком файрвола по умолчанию; iptables в современных дистрибутивах обычно уже работает поверх него (iptables-nft).
  • Готовый набор правил переводится одной командой: iptables-restore-translate -f rules.v4 > ruleset.nft.
  • Правила, для которых нет перевода, утилита помечает комментарием # — их нужно переписать вручную.
  • Не смешивайте iptables-legacy и nftables на одной машине: правила начнут конфликтовать непредсказуемо.
  • Перед применением проверяйте файл командой nft -c -f и держите открытой вторую SSH-сессию.
Сравнение iptables и nftables: в чём разница
iptables и nftables: старый и новый интерфейс файрвола в ядре Linux.

Что понадобится

  • Сервер на Linux с ядром 3.13 или новее: Debian 10+, Ubuntu 20.04+, RHEL/AlmaLinux/Rocky 8+.
  • Права root или sudo.
  • Пакеты nftables и iptables (в нём есть утилиты перевода).
  • Доступ к консоли хостинга или физический доступ — на случай, если вы случайно закроете себе SSH.

Шаг 1. Узнайте, на каком движке работает iptables сейчас

sudo iptables -V
# iptables v1.8.9 (nf_tables)  — iptables уже работает поверх nftables
# iptables v1.8.9 (legacy)     — используется старый движок

Если в скобках nf_tables, правила уже лежат в nftables — их видно командой sudo nft list ruleset. Переход в этом случае означает отказ от старого синтаксиса, а не замену движка. Если legacy, правила живут отдельно, и после перехода их нужно будет перенести полностью.

Заодно проверьте, кто ещё управляет файрволом: systemctl status ufw firewalld. Если включён ufw или firewalld, правила лучше менять через них, а не напрямую.

Шаг 2. Сохраните текущие правила

sudo iptables-save  > ~/rules.v4
sudo ip6tables-save > ~/rules.v6
cp ~/rules.v4 ~/rules.v4.bak && cp ~/rules.v6 ~/rules.v6.bak

Файлы .bak — ваш план отката: из них правила можно вернуть командой iptables-restore < ~/rules.v4.bak.

Шаг 3. Переведите правила в синтаксис nftables

iptables-restore-translate  -f ~/rules.v4 > ~/ruleset.nft
ip6tables-restore-translate -f ~/rules.v6 >> ~/ruleset.nft

Отдельное правило удобно переводить для проверки:

iptables-translate -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# nft add rule ip filter INPUT tcp dport 22 ct state new counter accept

Откройте ~/ruleset.nft и найдите строки, начинающиеся с #: так утилита помечает правила, для которых не нашлось перевода. Их нужно переписать вручную по документации nftables или убрать, если они больше не нужны.

grep -n '^#' ~/ruleset.nft

Шаг 4. Сведите правила в один понятный файл

Автоматический перевод сохраняет структуру iptables (таблицы ip filter и ip6 filter отдельно). Удобнее объединить их в таблицу inet, которая обрабатывает IPv4 и IPv6 одновременно. Минимальный файл для веб-сервера:

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
    set admin_ips {
        type ipv4_addr
        elements = { 198.51.100.7 }    # ваш IP для SSH
    }

    chain input {
        type filter hook input priority filter; policy drop;
        ct state established,related accept
        ct state invalid drop
        iif "lo" accept
        meta l4proto { icmp, ipv6-icmp } accept
        tcp dport 22 ip saddr @admin_ips accept
        tcp dport { 80, 443 } accept
    }

    chain forward {
        type filter hook forward priority filter; policy drop;
    }

    chain output {
        type filter hook output priority filter; policy accept;
    }
}

Здесь видно главное преимущество nftables: набор admin_ips и список портов { 80, 443 } заменяют несколько отдельных правил iptables и пакет ipset.

Политика drop в цепочке input закроет всё, что не разрешено явно. Перед применением убедитесь, что разрешён ваш порт SSH и ваш IP, иначе вы потеряете доступ к серверу.

Шаг 5. Проверьте и примените правила

sudo nft -c -f ~/ruleset.nft     # только проверка синтаксиса, ничего не применяет
sudo cp ~/ruleset.nft /etc/nftables.conf
sudo nft -f /etc/nftables.conf
sudo systemctl enable --now nftables

В RHEL-подобных системах файл конфигурации службы — /etc/sysconfig/nftables.conf; там же можно подключить свой файл директивой include.

Не закрывайте текущую SSH-сессию: откройте вторую и убедитесь, что вход работает.

Шаг 6. Отключите старый механизм загрузки iptables

Если раньше правила загружал iptables-persistent (Debian, Ubuntu) или служба iptables (RHEL), отключите их, чтобы при загрузке не получилось двух наборов правил:

sudo systemctl disable --now netfilter-persistent   # Debian/Ubuntu
sudo systemctl disable --now iptables ip6tables     # RHEL-подобные, если установлены

В Debian и Ubuntu убедитесь, что команда iptables указывает на версию для nftables — её по-прежнему используют Docker, fail2ban и другие программы:

sudo update-alternatives --set iptables  /usr/sbin/iptables-nft
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-nft

Проверка результата

  • sudo nft list ruleset показывает ваши таблицы и цепочки, в них нет строк с # на месте правил.
  • sudo iptables -V выводит (nf_tables), а sudo iptables-legacy -S (если установлен) — пустой набор правил.
  • Сервер перезагружен, и после загрузки systemctl is-active nftables отвечает active, правила на месте.
  • С другого компьютера доступны только разрешённые порты: nmap -Pn -p 1-1000 203.0.113.10 (на своём сервере) показывает открытыми 22 (с вашего IP), 80 и 443.

Чтобы увидеть, какое правило отбрасывает пакет, включите трассировку для конкретного адреса и смотрите путь пакета в реальном времени:

sudo nft insert rule inet filter input ip saddr 192.0.2.1 meta nftrace set 1
sudo nft monitor trace
# после отладки удалите правило по его номеру (handle):
sudo nft -a list chain inet filter input
sudo nft delete rule inet filter input handle 25

Как защититься от типичных ошибок

  • Не смешивайте движки. Правила iptables-legacy и nftables работают одновременно и независимо — пакет может быть разрешён в одном и отброшен в другом.
  • Меняйте правила с таймером отката. Перед рискованной правкой запланируйте возврат: echo "nft -f /root/ruleset.ok" | at now + 5 minutes, а если всё работает — удалите задание командой atrm.
  • Помните про Docker. Docker сам создаёт свои правила; команда flush ruleset в начале файла удалит их до перезапуска Docker. Если на сервере есть контейнеры, после применения правил перезапустите службу docker или очищайте только свои таблицы (flush table inet filter).
  • Держите конфигурацию в одном месте и в системе контроля версий: /etc/nftables.conf легко читается и проверяется nft -c.
  • Используйте наборы для блокировок. fail2ban умеет работать с nftables (действие nftables-multiport или nftables-allports) — блокировки попадают в набор, а не плодят сотни правил.

Ключевые цифры

3.13версия ядра Linux, в которой появился nftables
Debian 10первый выпуск Debian, где nftables — фреймворк файрвола по умолчанию
2018с июня 2018 года разработчики netfilter считают старые утилиты xtables устаревшими

Источники: вики проекта nftables, вики Debian.

iptables и nftables: соответствие команд
Задача iptables nftables
Показать правила iptables -S nft list ruleset
Сохранить правила iptables-save > file nft list ruleset > file
Загрузить правила iptables-restore < file nft -f file
Проверить файл без применения iptables-restore --test nft -c -f file
Удалить правило iptables -D … (полностью повторить правило) nft delete rule … handle N
Список адресов отдельный пакет ipset встроенные set и map
IPv4 и IPv6 вместе две утилиты и два набора правил одна таблица inet

Источник: документация nftables (wiki.nftables.org), man nft.

Что это значит: наши выводы

  • 1 хорошая новость
  • 1 риск
  • 1 за чем следить
  • 1 что сделать
  • Хорошая новостьПоловина работы уже сделана

    Во многих дистрибутивах iptables давно работает поверх nftables — переход сводится к переводу синтаксиса и смене службы загрузки.

  • РискМожно закрыть себе SSH

    Политика drop и неточный перевод правил могут оборвать доступ. Вторая сессия, таймер отката и консоль хостинга решают проблему.

  • За чем следитьЧужие правила

    Docker, fail2ban и libvirt добавляют свои таблицы. Проверяйте nft list ruleset после их обновлений и перезапусков.

  • Что сделатьОдин файл конфигурации

    Соберите правила в /etc/nftables.conf с таблицей inet и наборами — так их проще читать, проверять и переносить на другие серверы.

Частые вопросы

Нужно ли переходить, если iptables работает?

Срочности нет: в большинстве современных дистрибутивов iptables уже использует движок nftables. Переход оправдан, когда правил много, нужны наборы адресов, общая таблица для IPv4 и IPv6 или удобная отладка.

Можно ли использовать iptables и nftables одновременно?

Команду iptables в режиме nf_tables — можно: её правила попадают в nftables. Смешивать iptables-legacy и nftables не стоит: это два независимых набора правил, и результат трудно предсказать.

Что делать с правилами, которые не перевелись?

Утилита оставляет их в файле как комментарии с #. Найдите аналог в документации nftables или проверьте, нужно ли правило вообще: часто это остатки старых настроек.

Сломается ли Docker после перехода?

Docker создаёт правила через iptables, поэтому оставьте вариант iptables-nft. Если ваш файл начинается с flush ruleset, после применения перезапустите Docker, чтобы он заново создал свои правила.

Как вернуть всё обратно?

Остановите службу (systemctl disable --now nftables), очистите правила (nft flush ruleset) и загрузите сохранённую копию: iptables-restore < ~/rules.v4.bak и ip6tables-restore < ~/rules.v6.bak.

Материал подготовлен на основе документации nftables и Debian и актуален на дату обновления. Команды и пути к файлам могут отличаться в зависимости от дистрибутива и его версии.

Источник: документация проекта netfilter/nftables

Была ли статья полезной?
Оценок: 1, средняя: 5

Оставьте комментарий:

Email не публикуется. Комментарии проходят модерацию.