Хостинг SpaceWeb
Серверы Дизайн Сайты Безопасность Домены PHP Кейсы клиентов

Переход с iptables на nftables: зачем и как

Если вы устали от громоздких правил iptables и путаницы с IPv4/IPv6-конфигурациями, пора рассмотреть переход на nftables. Новая система делает правила firewall короче, понятнее и удобнее в поддержке.

Мы разберем, какие преимущества дает nftables по сравнению с iptables, и проведем вас через весь процесс миграции.

Что такое nftables и почему он заменяет iptables

nftables – это современный инструмент Linux для настройки сетевого фильтра. С его помощью можно управлять правилами файрвола: разрешать и запрещать соединения, настраивать NAT, перенаправлять порты, ограничивать доступ к серверу или отдельным сервисам.

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

Главное отличие в том, что nftables объединяет несколько старых инструментов в одну систему. Раньше для разных типов трафика приходилось использовать разные утилиты: iptables для IPv4, ip6tables для IPv6, arptables для ARP и ebtables для bridge-фильтрации. В nftables все это настраивается через одну команду – nft.

iptables nftables
Отдельные команды для IPv4, IPv6, ARP и bridge-фильтрации Одна утилита nft для разных типов трафика
Часто приходится дублировать правила Можно писать более универсальные правила
Большие списки адресов и портов сложнее поддерживать Есть sets и maps для удобной работы с наборами данных
Правила применяются по одному Набор изменений можно применить атомарно
Синтаксис менее гибкий Правила обычно короче и понятнее

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

Основные ограничения iptables

iptables долго оставался стандартом для настройки файрвола в Linux, но со временем его слабые места стали заметнее:

Преимущества nftables

nftables делает настройку файрвола более понятной и удобной:

Архитектура nftables

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

Администратор сам выстраивает понятную структуру правил. Например, можно создать отдельные цепочки для входящего трафика, NAT, блокировок, разрешенных адресов и служебных правил.

Когда стоит переходить на nftables

Стоит задуматься о переходе, если:

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

Подготовка системы к переходу

Сначала определите, кто сейчас управляет сетевыми правилами. На сервере могут работать ufw, firewalld, Docker, Kubernetes, VPN-сервисы или панель управления хостингом. Если они автоматически добавляют правила, это нужно учитывать при миграции.

Настройка firewall требует полного контроля над системой и сетевыми правилами, поэтому для такой работы нужен root-доступ к серверу. Виртуальный сервер VPS/VDS позволяет самостоятельно управлять сетевой безопасностью: открывать только нужные порты, ограничивать SSH по IP, настраивать NAT и гибко менять правила firewall под проект. В Spaceweb можно подобрать конфигурацию под разные задачи – от небольшого сервера до более производительной инфраструктуры.

Проверить популярные сервисы можно, прописав:

systemctl status ufw
systemctl status firewalld
systemctl status docker
systemctl status kubelet

Если используется ufw, дополнительно посмотрите его состояние:

ufw status verbose

Для firewalld:

firewall-cmd --state
firewall-cmd --list-all

Отдельно проверьте, какой порт используется для SSH. Не всегда это стандартный 22:

ss -tlnp | grep ssh

Этот порт обязательно нужно разрешить в новой конфигурации nftables. Во время тестирования не закрывайте текущую SSH-сессию, пока не убедитесь, что новое подключение к серверу работает.

Еще один полезный шаг – заранее подготовить план отката. Например, оставить под рукой резервные копии старых правил и команды для их восстановления:

iptables-restore < iptables-backup.rules
ip6tables-restore < iptables-backup-v6.rules

Так вы сможете быстро вернуть рабочую конфигурацию, если новые правила окажутся неверными.

Проверка текущих правил iptables

Проверьте правила для IPv4:

iptables -L -n -v

Для IPv6:

ip6tables -L -n -v

Если на сервере используется NAT, отдельно проверьте таблицу nat:

iptables -t nat -L -n -v
ip6tables -t nat -L -n -v

Для полной копии правил лучше использовать iptables-save и ip6tables-save:

iptables-save
ip6tables-save

Эти команды покажут правила в формате, который удобно сохранить в файл или использовать для восстановления.

Как установить nftables в Linux

Во многих современных дистрибутивах nftables уже установлен. Сначала проверьте, доступна ли команда nft:

nft --version

Если команда не найдена, установите пакет через менеджер пакетов вашего дистрибутива.

Дистрибутив Команда установки
Debian / Ubuntu sudo apt install nftables
Fedora sudo dnf install nftables
RHEL / AlmaLinux / Rocky Linux sudo dnf install nftables
Arch Linux sudo pacman -S nftables
openSUSE sudo zypper install nftables

Когда установка завершится, проверьте версию еще раз:

nft --version

Затем можно включить сервис, чтобы правила nftables загружались автоматически при старте системы:

sudo systemctl enable nftables

Если нужно сразу запустить сервис, выполните:

sudo systemctl start nftables

Проверить состояние можно командой:

sudo systemctl status nftables

Базовая конфигурация nftables

Базовую конфигурацию nftables обычно хранят в файле:

/etc/nftables.conf

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

Пример минимальной конфигурации:

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0;
        policy drop;

        ct state established,related accept
        iif lo accept

        tcp dport 22 accept

        icmp type echo-request accept
        ip6 nexthdr icmpv6 accept
    }

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

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

Где:

Перед применением правил проверьте синтаксис:

sudo nft -c -f /etc/nftables.conf

Если ошибок нет, загрузите конфигурацию:

sudo nft -f /etc/nftables.conf

В реальной конфигурации порт SSH нужно заменить на тот, который используется на сервере.

Примеры правил firewall

Правила nftables можно добавлять в конфигурационный файл /etc/nftables.conf или выполнять вручную через команду nft. Для постоянной настройки удобнее хранить их в файле: так конфигурацию проще проверить, перенести и восстановить.

Пример фрагмента правил для цепочки input:

chain input {
    type filter hook input priority 0;
    policy drop;

    ct state established,related accept
    iif lo accept

    tcp dport 22 accept
    tcp dport { 80, 443 } accept

    ip saddr 203.0.113.15 drop

    icmp type echo-request accept
    ip6 nexthdr icmpv6 accept
}

Эта конфигурация:

Для ограничения доступа к сервису по IP можно указать адрес источника и нужный порт:

ip saddr 192.168.1.10 tcp dport 22 accept

Если нужно заблокировать сразу несколько адресов, удобнее использовать набор:

set blocked_ips {
    type ipv4_addr;
    elements = { 203.0.113.15, 198.51.100.20 }
}

ip saddr @blocked_ips drop

Sets полезны, когда адресов много. Вместо длинного списка почти одинаковых правил можно хранить IP-адреса в одном наборе и ссылаться на него в правилах.

Миграция правил iptables в nftables

Перенос правил можно сделать вручную или с помощью утилит перевода. Автоматический перевод помогает ускорить работу, но его все равно нужно проверять: не каждое правило iptables превращается в идеальную конфигурацию nftables.

Для начала сохраните текущие правила iptables в файл:

sudo iptables-save > iptables.rules
sudo ip6tables-save > ip6tables.rules

Затем попробуйте перевести их в синтаксис nftables:

sudo iptables-restore-translate -f iptables.rules > nftables-ipv4.rules
sudo ip6tables-restore-translate -f ip6tables.rules > nftables-ipv6.rules

Если нужно перевести одно правило, можно использовать iptables-translate:

sudo iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT

Пример результата:

nft add rule ip filter INPUT tcp dport 22 counter accept

Вывод показывает, как похожее правило будет выглядеть в nftables.

Примеры соответствий:

iptables nftables
-p tcp --dport 22 -j ACCEPT tcp dport 22 accept
-s 203.0.113.10 -j DROP ip saddr 203.0.113.10 drop
-m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT ct state established,related accept
-p icmp --icmp-type echo-request -j ACCEPT icmp type echo-request accept

Автоматически переведенные правила лучше не загружать сразу. Сначала откройте файл и проверьте, что получилось:

less nftables-ipv4.rules

Готовую конфигурацию лучше привести к нормальной структуре nftables: создать таблицу inet, отдельные цепочки input, forward, output, добавить нужные правила и удалить лишнее. Это сделает файл короче и понятнее.

Перед применением обязательно проверьте синтаксис:

sudo nft -c -f /etc/nftables.conf

Если ошибок нет, загрузите правила:

sudo nft -f /etc/nftables.conf

Проверить активную конфигурацию можно командой:

sudo nft list ruleset

Проверка и отладка правил

Перед рабочим запуском конфигурацию nftables нужно проверить. Так вы сможете найти ошибки в синтаксисе и убедиться, что правила не блокируют нужные подключения.

Сначала проверьте файл без применения правил:

sudo nft -c -f /etc/nftables.conf

Ключ -c запускает только проверку. Если в конфигурации есть ошибка, nftables покажет строку и причину.

Активные правила можно посмотреть так:

sudo nft list ruleset

Если нужно проверить конкретную таблицу:

sudo nft list table inet filter

Для просмотра правил с номерами используйте:

sudo nft -a list ruleset

Номера нужны, если правило нужно удалить или изменить точечно.

Полезно смотреть и счетчики. Они показывают, проходят ли пакеты через конкретное правило:

sudo nft list ruleset

Если у правила есть counter, в выводе будут видны пакеты и байты. Например:

tcp dport 22 counter packets 15 bytes 1200 accept

Если счетчик не растет, значит трафик не попадает под это правило. Причина может быть в порядке правил, неверном порте, адресе или цепочке.

Для более подробной отладки можно включить трассировку пакетов:

sudo nft monitor trace

В другой SSH-сессии отправьте тестовый запрос, например подключение к нужному порту. Команда покажет, через какие таблицы и цепочки проходит пакет и какое правило на него срабатывает.

Также полезно проверять открытые порты:

ss -tulnp

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

Рекомендации по настройке firewall на сервере

Хорошая конфигурация firewall должна быть простой, понятной и предсказуемой. Не стоит добавлять правила «на всякий случай»: чем больше лишних разрешений, тем сложнее контролировать безопасность сервера.

Основные рекомендации:

Итоги

Переход с iptables на nftables упрощает работу с firewall: правила становятся короче и понятнее, а вместо нескольких утилит появляется единая система – она поддерживает IPv4, IPv6, NAT и сложные сетевые настройки.

Чтобы перейти без проблем, сначала проверьте и сохраните старые правила, подготовьте и протестируйте новую конфигурацию, не отключая старую систему. Так вы обезопасите себя от потери доступа к серверу и сможете легко вернуться к прежнему варианту, если что-то пойдет не так.

Перейти на оригинал