Бортовой журнал
Бортовой журнал

Если вы устали от громоздких правил 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, но со временем его слабые места стали заметнее:

  • Разные утилиты для разных задач. Для IPv4, IPv6, ARP и bridge-фильтрации используются отдельные инструменты: iptables, ip6tables, arptables, ebtables.
  • Дублирование правил. Для IPv4 и IPv6 часто приходится писать похожие правила отдельно.
  • Длинные списки правил. Много IP-адресов, портов и исключений сильно усложняют конфигурацию.
  • Неатомарное применение изменений. Правила могут добавляться и удаляться по одному, поэтому при ошибке файрвол рискует остаться в промежуточном состоянии.
  • Сложность поддержки. В больших конфигурациях сложно разобраться в порядке правил и безопасно что-то изменить.
  • Устаревшая архитектура. iptables создавался для более простых сетевых сценариев. Для IPv6, контейнеров, NAT и сложных правил удобнее использовать nftables.

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

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

  • Одна система вместо нескольких утилит. Через nft можно управлять IPv4, IPv6, ARP и bridge-фильтрацией. Не нужно переключаться между разными командами.
  • Меньше дублирования. В nftables можно писать общие правила для разных протоколов. Конфигурация получается короче и проще.
  • Удобная работа со списками. Sets и maps помогают аккуратно хранить группы IP-адресов, портов и других значений. Вместо десятков похожих правил можно использовать один набор.
  • Атомарное применение правил. Набор правил можно загрузить целиком. Если в конфигурации есть ошибка, изменения не применятся частично.
  • Более читаемый синтаксис. Сложные условия часто можно описать компактнее, чем в iptables.
  • Гибкость для современных задач. nftables лучше подходит для серверов с IPv6, NAT, контейнерами, виртуальными сетями и большим количеством правил.
  • Активное развитие. Современные дистрибутивы Linux все чаще используют nftables по умолчанию, поэтому новые инструкции и конфигурации постепенно переходят на него.

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

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

  • Tables (таблицы) объединяют правила для определенного типа трафика.
  • Chains (цепочки) находятся внутри таблиц. Они определяют, в какой момент обработки пакета будут применяться правила.
  • Rules (правила) описывают условия и действие.
  • Hooks (точки подключения) связывают цепочку с сетевым стеком Linux. Благодаря им nftables понимает, когда проверять пакет.
  • Sets и maps (наборы и сопоставления) нужны для удобной работы со списками. Например, можно хранить разрешенные IP-адреса в одном наборе и использовать его в правилах, вместо того чтобы писать десятки отдельных строк.

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

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

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

  • вы настраиваете новый сервер;
  • в системе уже используется nftables по умолчанию;
  • нужно поддерживать IPv4 и IPv6;
  • правил стало слишком много;
  • вы часто меняете правила;
  • вы хотите упростить поддержку.

Необязательно срочно переписывать рабочий файрвол только ради перехода. Если текущая конфигурация на 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;
    }
}

Где:

  • flush ruleset очищает старые правила перед загрузкой новых;
  • table inet filter создает таблицу для IPv4 и IPv6;
  • chain input обрабатывает входящий трафик;
  • policy drop блокирует все, что не разрешено явно;
  • ct state established,related accept разрешает уже установленные соединения;
  • iif lo accept разрешает трафик через локальный интерфейс;
  • tcp dport 22 accept открывает SSH;
  • chain forward блокирует транзитный трафик;
  • chain output разрешает исходящие соединения.

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

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
}

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

  • разрешает уже установленные соединения;
  • разрешает локальный трафик через lo;
  • открывает SSH, HTTP и HTTPS;
  • блокирует подключения с IP-адреса 203.0.113.15;
  • разрешает ping и базовый ICMPv6-трафик.

Для ограничения доступа к сервису по 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 должна быть простой, понятной и предсказуемой. Не стоит добавлять правила «на всякий случай»: чем больше лишних разрешений, тем сложнее контролировать безопасность сервера.

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

  • Используйте политику запрета по умолчанию. Для входящего трафика обычно лучше ставить policy drop, а затем явно разрешать только нужные сервисы.
  • Сначала разрешите уже установленные соединения. Это базовое правило помогает не разрывать нормальный сетевой обмен.
  • Открывайте только нужные порты. Если серверу нужны только SSH, HTTP и HTTPS, не оставляйте открытыми другие сервисы.
  • Ограничьте SSH по IP, если это возможно. Если вы подключаетесь с постоянного адреса или из VPN, лучше разрешить SSH только оттуда.
  • Учитывайте IPv6. Если на сервере включен IPv6, его тоже нужно фильтровать. Иначе часть трафика может обходить правила, рассчитанные только на IPv4.
  • Не блокируйте ICMP полностью. ICMP нужен не только для ping, но и для нормальной работы сети.
  • Добавляйте комментарии к сложным правилам. Если правило непонятно с первого взгляда, лучше пояснить его назначение:
  • Проверяйте конфигурацию перед применением. Перед загрузкой правил используйте проверку синтаксиса.
  • Храните правила в файле и делайте резервные копии. Не стоит держать важную конфигурацию только в текущем состоянии системы. Файл проще проверить, перенести на другой сервер и восстановить при ошибке.

Итоги

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

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