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