Полное руководство, ошибки и практические советы
Настройка сетевой фильтрации — основа безопасной эксплуатации Linux. Iptables долгое время был стандартом, о котором написано множество статей, руководств и инструкций по настройке. Однако, переход на nftables позволяет повысить безопасность и упростить управление файрволом. В этой статье, предназначенной для системных администраторов Linux, мы разберём, как можно безболезненно осуществить миграцию правил из iptables в современную систему nftables, а также рассмотрим ключевые различия между этими системами и преимущества nftables в плане автоматизации и производительности.
Различия iptables и nftables
Во-первых, давайте разграничим понятия утилиты iptables и подсистемы iptables, состоящей из модулей ядра. Более точно говорить о Xtables, включающей iptables (IPv4), ip6tables (IPv6), arptables (ARP) и etables (Ethernet). В отличие от этого, в nftables всё проще: единая подсистема сетевой фильтрации работает со всеми протоколами, а утилита называется nft. Для понимания архитектуры рекомендуется ознакомиться со схемой устройства подсистемы Netfilter в Linux.
На схеме наглядно показаны соотношения между утилитами управления правилами и модулями ядра. Как мы уже выяснили, одно из ключевых различий – универсальность nft, работающей со всеми протоколами. Перейдём к другим отличиям между iptables и nftables.
Можно сказать, что при разработке nftables ставилась цель рефакторинга системы сетевой фильтрации в Linux. Результатом стала более гибкая в настройке, часто более производительная система с упрощенным синтаксисом команд.
Одно из значительных различий между iptables и nftables заключается в подходе к конфигурации по умолчанию. Iptables сразу после установки предоставляет стандартную схему прохождения трафика с таблицами и цепочками:
При настройке iptables стоит задача – создать правила на пересечении таблиц и цепочек, установить политики по умолчанию и, при необходимости, создать собственные цепочки правил.
В отличие от этого, nftables изначально не имеет таблиц и цепочек. Можно воссоздать структуру iptables, но это не обязательно. Обе системы используют хуки Netfilter, к которым привязаны базовые цепочки iptables. Общая схема прохождения трафика с учетом хуков выглядит следующим образом:
То есть, в nftables необходимо самостоятельно создавать таблицы и цепочки, привязанные к хукам.
Важно отметить, что для успешной миграции разработчики nftables предусмотрели совместимость со старой системой. Начнём с анализа текущей системы и определим дальнейшие шаги.
Намечаем план
Первым шагом при миграции является определение используемой подсистемы сетевой фильтрации. В примерах будем использовать команды для Ubuntu 24.04. Хотя у вас, вероятно, уже настроены правила iptables, прописанные в конфигурации и отображаемые командой iptables -nvL, важно убедиться, что вы действительно используете iptables, а не nftables в режиме совместимости.
Для этого надо выполнить команду iptables -V:
iptables v1.8.10 (nf_tables)
Упоминание «nf_tables» указывает на использование nftables в режиме совместимости. Далее рассмотрим саму утилиту iptables:
root@server:/home/db# ls -al /usr/sbin/iptables
lrwxrwxrwx 1 root root 26 Apr 23 2024 /usr/sbin/iptables -> /etc/alternatives/iptables
root@server:/home/db# ls -al /etc/alternatives/iptables
lrwxrwxrwx 1 root root 22 Apr 23 2024 /etc/alternatives/iptables -> /usr/sbin/iptables-nft
Как видно, утилита iptables может оказаться iptables-nft, принимающей параметры iptables и создающей правила в nftables. Это означает, что уже используется nftables, но, чтобы раскрыть весь потенциал, стоит изучить новый синтаксис nft.
Как ещё проверить использование nftables? Надо просмотреть правила сетевой фильтрации с помощью утилиты nft:
nft list ruleset
table ip filter {
chain input {
type filter hook input priority filter; policy drop;
tcp dport 22 counter packets 1690 bytes 150658 accept
tcp dport 3306 counter packets 0 bytes 0 accept
ct state vmap { invalid : drop, established : accept, related : accept }
tcp dport { 80, 443 } ct state new counter packets 0 bytes 0 accept
iifname "lo" accept
}
}
Если вывод пустой, значит правила nftables отсутствуют. В противном случае, будут выведены таблицы, цепочки и правила в формате, несовместимом с iptables. В этом случае команда iptables -nvL выдаст сообщение:
# Table `filter' contains incompatible base-chains, use 'nft' tool to list them.
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Эта конфигурация использует новый синтаксис nftables, и управление правилами необходимо осуществлять с помощью nft. В теории, можно использовать одновременно iptables и nftables (хотя это не рекомендуется). А чтобы проверить наличие загруженных модулей ядра, надо использовать команду modprobe с префиксами nf_, ipt и ip_:
lsmod | grep -E "^nf_|^ip_|^ipt"
Пример вывода в современной системе (nftables):
nf_conntrack 200704 1 nft_ct
nf_defrag_ipv6 24576 1 nf_conntrack
nf_defrag_ipv4 12288 1 nf_conntrack
nf_tables 385024 25 nft_ct
ip_tables 36864 0
Пример вывода в старой системе (iptables):
iptable_filter 16384 1
iptable_mangle 16384 0
iptable_nat 16384 0
nf_conntrack_ipv4 16384 2
nf_defrag_ipv4 16384 1 nf_conntrack_ipv4
nf_nat_ipv4 16384 1 iptable_nat
nf_nat 24576 1 nf_nat_ipv4
nf_conntrack 106496 4 nf_nat,nf_nat_ipv4,xt_conntrack,nf_conntrack_ipv4
ip_tables 24576 3 iptable_filter,iptable_mangle,iptable_nat
Если принято решение использовать iptables и nftables одновременно (например, с iptables-legacy), надо учитывать приоритеты базовых цепочек, чтобы контролировать порядок обработки пакетов.
На этом этапе можно выбрать: продолжить использовать iptables-nft со старым синтаксисом или полностью перейти на nft. Важно помнить, что некоторые приложения (например, Docker, libvrt, ufw) по-прежнему зависят от iptables. При переходе на nft рекомендуется сохранить названия таблиц и базовых цепочек.
Теперь, когда мы определили текущую систему, пришло время перевести старые правила iptables в новый синтаксис nft.
Миграция конфигурации из iptables в nftables
Предположим, у нас есть минимальная конфигурация iptables для веб-сервера (результат команды iptables-save):
# Generated by iptables-save v1.8.10 (nf_tables) on Wed Feb 26 17:56:54 2025
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 443 -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
COMMIT
Для автоматического перевода всех правил воспользуемся командой iptables-restore-translate:
iptables-restore-translate -f save.txt > ruleset.nft
В файле ruleset.nft будет сохранён этот же набор правил, но уже в формате nft:
# Translated by iptables-restore-translate v1.8.10 on Fri Mar 21 14:07:53 2025
add table ip filter
add chain ip filter INPUT { type filter hook input priority 0; policy drop;10.26.95.20 counter reject
add rule ip filter INPUT icmp type echo-request counter drop
add rule ip filter INPUT ip protocol icmp counter accept
add rule ip filter INPUT ct state related,established counter accept
add rule ip filter INPUT ct state invalid counter drop
add rule ip filter INPUT ip protocol tcp tcp dport { 21, 22, 6881-6882 } ct state new counter accept
add rule ip filter INPUT ct state new udp dport 443 counter accept
add rule ip filter INPUT ct state new tcp dport 443 counter accept
add rule ip filter INPUT ct state new tcp dport 80 counter accept
Надо помнить, что первые команды создают таблицу и цепочки, так как в nftables они не существуют по умолчанию.
Затем, полученный файл можно использовать для восстановления конфигурации с помощью утилиты nft. Перед этим рекомендуется сбросить текущую конфигурацию nft:
nft flush ruleset
nft -f ruleset.nft
Для сохранения текущей конфигурации в файл лучше использовать следующие команды:
echo "flush ruleset" > /etc/nftables.conf
nft -s list ruleset >> /etc/nftables.conf
Для надёжности, команда flush ruleset добавлена в начало файла, чтобы очистить текущий набор правил перед загрузкой новых.
Файл /etc/nftables.conf используется сервисом nftables.service. Чтобы перейти на использование этого файла, нужно отключить загрузку правил iptables и включить автозагрузку сервиса nftables.service:
systemctl disable netfilter-persistent.service
systemctl enable nftables.service
На этом процесс миграции можно считать завершённым.
Перенос конфигурации можно также выполнять для отдельных правил с помощью команды iptables-translate (ip6tables-translate):
root@server:/home/db# 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'
В этом примере используются совместимые названия таблиц и цепочек.
Часто вместе с iptables используется ipset для хранения списков адресов или сетей, что позволяет масштабировать правила iptables. Ipset также можно перенести в nftables, так как поддержка списков встроена «из коробки». Для перевода списков ipset в nftables есть штатная утилита ipset-translate:
ipset save > sets.ipset
ipset-translate restore < sets.ipset
При использовании больших списков надо быть осторожным: вывод всех правил целиком может занять много времени. Чтобы решить эту проблему, можно просмотреть правила без списков:
nft -t list ruleset
Для просмотра списка myset в таблице filter есть команда:
nft list set ip filter myset
Практические примеры правил nftables
В этом разделе мы рассмотрим несколько практических примеров правил nftables, которые будут полезны для повышения безопасности вашего сервера или сети Linux. Эти примеры продемонстрируют основные возможности nftables и помогут вам понять, как создавать собственные правила сетевой фильтрации, используя новый синтаксис.
- Разрешить SSH только с определённого IP-адреса:
add rule ip filter INPUT ip saddr 192.168.1.10 tcp dport 22 accept
Это правило nftables позволяет подключаться к серверу по SSH (порт 22) только с IP-адреса 192.168.1.10, повышая безопасность за счёт ограничения доступа к SSH. Все остальные подключения будут отклонены.
- Блокировать входящий ICMP трафик (ping):
add rule ip filter INPUT icmp type echo-request drop
Это правило nftables блокирует входящие эхо-запросы ICMP (ping), что помогает защитить сервер от DoS-атак и снизить нагрузку на сеть.
- Разрешить весь исходящий трафик:
add rule ip filter OUTPUT accept
Это правило nftables разрешает весь исходящий трафик с сервера, что необходимо для нормальной работы приложений и сервисов. Важно помнить, что для усиления безопасности следует более детально настроить исходящие правила.
- Блокировать соединения к определённому порту.
add rule ip filter OUTPUT tcp dport 8080 drop
Это правило nftables блокирует все исходящие соединения, например, к порту 8080. Это может быть полезно для предотвращения нежелательного трафика и защиты от вредоносных программ.
Разъяснения к примерам:
- add rule ip filter INPUT ...
Добавляет правило в таблицу ip (IPv4) в цепочку INPUT (входящий трафик). Цепочка INPUT используется для фильтрации трафика, входящего на сервер Linux.
- add rule ip filter OUTPUT ...
Добавляет правило в таблицу ip в цепочку OUTPUT (исходящий трафик). Цепочка OUTPUT используется для фильтрации трафика, исходящего с сервера Linux.
- ip saddr 192.168.1.10
Соответствует IP-адресу источника трафика.
- tcp dport 22
Соответствует TCP-порту назначения (в данном случае, порт 22 для SSH).
- icmp type echo-request
Соответствует типу ICMP-сообщения (в данном случае, эхо-запрос для ping).
- accept
Действие, которое выполняется, если правило соответствует (разрешить трафик).
- drop
Действие, которое выполняется, если правило соответствует (блокировать трафик без уведомления).
Эти примеры – лишь отправная точка. Nftables обладает гораздо большей гибкостью и функциональностью, позволяя создавать сложные и детализированные правила сетевой фильтрации, обеспечивающие высокий уровень безопасности.
Частые ошибки при миграции
Миграция с iptables на nftables может оказаться сложной задачей, особенно для администраторов Linux, не знакомых с новым синтаксисом и концепциями nftables. В этом разделе мы рассмотрим наиболее распространённые ошибки, возникающие при переходе на nftables, и предложим эффективные способы их решения, чтобы обеспечить плавный и безопасный переход.
- Некорректные названия таблиц и цепочек
При использовании iptables-nft для совместимости важно, чтобы названия таблиц и цепочек были согласованы между iptables и nftables. Попытка использовать имена цепочек iptables (например, INPUT, OUTPUT, FORWARD) в nftables без их предварительного создания приведёт к ошибке.
Решение:
Перед добавлением правил надо убедиться, что таблицы и цепочки созданы в nftables, используя команды:
nft add table ip filter
(или ip6, arp, bridge) для создания таблицы.
nft add chain ip filter INPUT { type filter hook input priority 0; policy accept; }
для создания цепочки.
- Проблемы с приоритетами цепочек
При одновременном использовании iptables и nftables важно правильно настроить приоритеты цепочек, чтобы трафик обрабатывался в нужном порядке. Неправильная настройка приоритетов может привести к непредсказуемой обработке трафика и снизить безопасность системы.
Решение:
При создании цепочки нужно использовать параметр priority, чтобы указать её приоритет. Чем меньше число, тем выше приоритет. Например:
nft add chain ip filter INPUT { type filter hook input priority -100; policy accept; }
Рекомендуется придерживаться стандартных приоритетов, указанных в документации nftables.
- Несовместимость синтаксиса
Некоторые опции iptables могут не иметь прямого эквивалента в nftables. Использование iptables-translate для перевода правил может быть полезным, но не всегда обеспечивает идеальный результат. Важно внимательно проверять переведённые правила и вносить необходимые корректировки.
Решение:
Изучение документации nftables, чтобы найти эквивалентные опции. Надо убедиться, что есть понимание, как работает каждое правило, и как его можно правильно реализовать в nftables. В некоторых случаях может потребоваться переосмыслить логику правил.
- Проблемы с Docker и другими сервисами
Важно убедиться, что Docker и другие сервисы, использующие iptables, правильно настроены для работы с nftables. Docker часто требует специальных настроек, таких как настройка bridge-nf-call-iptables, чтобы корректно взаимодействовать с nftables. Игнорирование этого аспекта может привести к неожиданным изменениям в правилах nftables и нарушить работу контейнеров.
Решение:
Включить bridge-nf-call-iptables в sysctl:
sysctl -w net.bridge.bridge-nf-call-iptables=1.
Рассмотреть возможность использования firewall-драйвера Docker, который позволяет управлять правилами nftables более предсказуемым способом. Нужно изолировать правила Docker в отдельной таблице nftables.
- Забывают про сохранение правил
После перезагрузки сервера правила nftables исчезают, если их не сохранить. Это может привести к появлению временной дыры в безопасности и нарушению работы сетевой фильтрации.
Решение:
Использовать системный сервис nftables.service для загрузки правил при старте системы. Нужно убедиться, что файл конфигурации /etc/nftables.conf существует и содержит установленные правила.
- Использование устаревших модулей ядра
Устаревшие версии модулей ядра, связанные с Netfilter и nftables, могут привести к нестабильной работе и проблемам совместимости из-за отсутствия в них актуальных изменений.
Решение:
Регулярно обновлять ядро и необходимые пакеты с помощью пакетного менеджера системы.
Чеклист перехода на nftables
- Определение текущей системы фильтрации: проверьте версию iptables и список загруженных модулей ядра, чтобы точно определить, какая система сетевой фильтрации используется в системе Linux.
- Сохранение текущей конфигурации iptables: сделайте резервную копию текущих правил iptables, чтобы иметь возможность восстановить их в случае возникновения проблем при миграции.
- Перевод правил iptables в nftables: используйте утилиты iptables-restore-translate или iptables-translate для автоматического преобразования правил из формата iptables в формат nftables.
- Проверка сгенерированных правил nftables: внимательно просмотреть правила nftables, сгенерированные на предыдущем шаге, чтобы убедиться, что они корректно отражают исходную конфигурацию iptables и соответствуют требованиям к безопасности.
- Правила nftables: примените новые правила nftables с помощью команды nft -f <файл_с_правилами>, чтобы активировать новую конфигурацию.
- Проверка работы системы сетевой фильтрации: протестируйте правила сетевой фильтрации, чтобы убедиться, что трафик проходит правильно и безопасность системы не нарушена.
- Отключение iptables и включение nftables.service: отключите сервисы iptables, чтобы предотвратить конфликты, и включите службу nftables.service, чтобы nftables автоматически запускался при загрузке системы.
- Сохранение конфигурации nftables: настройте автоматическое сохранение правил nftables после перезагрузки, чтобы избежать потери конфигурации и обеспечить постоянную безопасность.
- Проверка Docker и других сервисов: надо убедиться, что Docker и другие сервисы, использующие iptables, правильно работают с nftables, они могут быть настроены для использования nftables через bridge-nf-call-iptables или другие механизмы.
Итоги
В этой статье мы рассмотрели ключевые аспекты миграции с классического iptables на современный и более производительный файрвол nftables. Теперь вы можете точно определить, какая система сетевой фильтрации используется в вашей системе Linux, автоматизировать перенос существующей конфигурации iptables в nftables, включая списки из ipset, и обеспечить высокий уровень безопасности. Надеемся, что это руководство поможет успешно перейти на nftables и воспользоваться всеми преимуществами новой технологии.
А для тех, кто хочет подробнее ознакомиться с настройками сетевой фильтрации, у нас есть практикум Linux Basics.
- Вы научитесь не только взаимодействовать с утилитами, но и эффективно работать с ядром Linux, конфигурировать систему, управлять процессами и многому другому.
- Удобный асинхронный и текстовый формат не будет вас подгонять, вы можете обучаться в своем темпе.
- Авторы программы — практикующие DevOps-инженеры с многолетним опытом работы.
- Материалы практикума остаются с вами навсегда. Возвращайтесь в любой удобный момент!
Ознакомиться подробнее можно по ссылке. До встречи на практикуме по Linux!