
Перейти с 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-сессию.

Что понадобится
- Сервер на 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) — блокировки попадают в набор, а не плодят сотни правил.
Ключевые цифры
Источники: вики проекта nftables, вики Debian.
| Задача | 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.
Первоисточники
- Moving from iptables to nftableswiki.nftables.org
- Debian Wiki: nftableswiki.debian.org
- Справочник nft (man nft)netfilter.org
Материал подготовлен на основе документации nftables и Debian и актуален на дату обновления. Команды и пути к файлам могут отличаться в зависимости от дистрибутива и его версии.
Источник: документация проекта netfilter/nftables