Безопасность серверов

Настройка nftables: правила, sets, IPv6 и диагностика

Как безопасно применить нативный ruleset nftables, открыть нужные IPv4- и IPv6-порты, использовать sets, лимиты и сохранить правила.

15 минут
абстрактная иллюстрация правил сетевой фильтрации сервера
nftables управляет единым набором правил Netfilter: до замены конфигурации нужно выбрать единственный инструмент управления, сохранить активный ruleset и явно оставить административный доступ. Безопасная последовательность: инвентаризация текущего firewall, подготовка файла с разрешениями для loopback, установленных соединений и SSH, проверка через nft -c -f, применение, тест из второй сессии и настройка штатного восстановления после перезагрузки.

Как nftables обрабатывает пакеты

nftables — интерфейс управления правилами Netfilter, подсистемы ядра Linux для обработки сетевых пакетов. Активная конфигурация называется ruleset. Она состоит из таблиц, цепочек, правил, наборов и других объектов.

ОбъектНазначение
Таблица nftablesКонтейнер объектов одного семейства: ip для IPv4, ip6 для IPv6, inet для общих правил IPv4 и IPv6.
Базовая цепочка nftablesЦепочка с type, hook и priority. Hook — точка Netfilter, в которой начинается обработка: например, input для трафика к локальному серверу.
Цепочка nftables без hookОбычная цепочка. Она не получает пакеты сама по себе: её вызывают из правила через jump или goto, чтобы переиспользовать логику.
Правило межсетевого экранаПоследовательность условий и действий: сопоставить интерфейс, адрес, протокол или состояние соединения, увеличить счётчик, записать журнал и выдать вердикт.
Вердикт nftablesaccept, drop, reject, jump, goto, return и другие управляющие решения. accept в одной базовой цепочке не отменяет возможную обработку пакета другой базовой цепочкой на том же hook.

Результат определяют порядок обработки правил, приоритет базовых цепочек на одном hook и вердикт. Внутри одной цепочки правила проверяются сверху вниз, поэтому сначала обычно ставят исключения и явные блокировки, а затем разрешения. Если ни одно правило не выдало окончательный вердикт, применяется политика базовой цепочки, например policy drop; вместо неё конфигурация может использовать явное завершающее правило с drop.

Поддержка версий

Семейство inet поддерживается ядром Linux начиная с 3.14. Для цельного примера из статьи, включая именованные sets с interval и timeout-элементами, counter, log, limit, meta nftrace и nft monitor trace, ориентируйтесь как минимум на связку Linux 4.6 и nftables 0.6. Трассировка через nftrace появилась в ядре 4.6; более старые сочетания ядра и userspace могут поддерживать только часть использованных возможностей. Дистрибутивы также переносят функции в более старые ядра, поэтому перед применением сверяйте nft --version, man nft, man nftables и документацию своего выпуска.

Сначала определите, кто управляет firewall

Не смешивайте менеджеры правил

На одном хосте нужен один источник управления firewall. Не применяйте ручной nft -f одновременно с UFW или firewalld: менеджер может пересоздать правила при reload, старте службы или изменении зоны, а итоговый порядок цепочек станет трудно предсказуемым.

Инвентаризация текущего стека

Выполняйте команды с правами root либо с возможностью sudo. Для чтения и изменения Netfilter обычно нужна capability CAP_NET_ADMIN.

  1. 1
    Проверьте, доступны ли nftables и активные службы
    Команда command -v nft должна вывести путь к утилите. Затем проверьте состояние ufw, firewalld и nftables. Если активен UFW или firewalld, не продолжайте с ручным ruleset: используйте выбранный менеджер и статью «UFW и firewalld: настройка firewall в Ubuntu и RHEL».
  2. 2
    Посмотрите активные правила
    Выполните nft list ruleset. Непустой вывод показывает правила, известные ядру через nftables, включая правила, которые могли создать firewalld либо слой совместимости iptables-nft. Пустой вывод не доказывает отсутствия другого менеджера или сетевых ограничений вне сервера.
  3. 3
    Проверьте iptables
    Выполните iptables -V и при наличии IPv6 — ip6tables -V. Строка с nf_tables означает, что команды iptables работают через совместимый backend nftables; строка legacy указывает на старый backend. Правила iptables не становятся автоматически нативной конфигурацией nftables: их происхождение, цепочки и дальнейшее сопровождение нужно учитывать отдельно.
Быстрая проверка утилиты, служб и backend iptables.
command -v nft && nft --version
systemctl is-active ufw 2>/dev/null; systemctl is-active firewalld 2>/dev/null; systemctl is-active nftables 2>/dev/null
iptables -V 2>/dev/null; ip6tables -V 2>/dev/null

firewalld в современных конфигурациях может использовать backend nftables и создавать управляемые таблицы и цепочки, часто в таблице семейства inet. UFW исторически управляет правилами через интерфейс iptables; на системах с iptables-nft эти правила могут отображаться в nft list ruleset. Точные имена таблиц, backend и состав правил зависят от версии дистрибутива и firewall-стека. Не редактируйте созданные ими объекты вручную: меняйте правила командами UFW или firewalld.

Сохраните состояние и не потеряйте SSH

Не начинайте удалённую настройку с nft flush ruleset

nft flush ruleset удаляет весь активный ruleset. На удалённом сервере команда может убрать разрешение SSH, правила маршрутизации контейнеров или правила другого менеджера. Не используйте её как обычный способ «начать с чистого листа» без отдельного аварийного канала: консоли провайдера, BMC, физического доступа или заранее проверенного пути восстановления.

Подготовка безопасного изменения

  1. 1
    Оставьте текущую SSH-сессию открытой
    Откройте вторую SSH-сессию и не закрывайте первую до проверки нового ruleset. Зафиксируйте используемый административный порт, IP-адрес или подсеть администратора, имя интерфейса и опубликованные сервисы. Настройка ключей и восстановление SSH рассматриваются в статье «Безопасная настройка SSH: ключи, root и ограничение доступа».
  2. 2
    Экспортируйте текущий ruleset
    Сохраните точный вывод nft list ruleset в файл вне временных каталогов. Это снимок активной конфигурации, пригодный для сравнения и ручного восстановления при наличии доступа к консоли.
  3. 3
    Выведите handles и счётчики
    Команда nft -a list ruleset добавляет к правилам handles — идентификаторы для удаления или замены конкретного правила. Счётчики выводятся в правилах с выражением counter; их значения растут при совпадении пакетов.
  4. 4
    Подготовьте правило для SSH до запрета по умолчанию
    В новом файле должны быть разрешены loopback, ct state established,related и новые подключения к административному порту от доверенных источников. Текущая сессия обычно продолжится благодаря established,related, но новая сессия нужна для проверки, что разрешение new работает.
Сохраняет ruleset и выводит правила с handles. Ожидаемый результат — файл резервной копии и строки `handle N` в выводе.
sudo install -d -m 700 /root/nft-backup
sudo sh -c 'nft list ruleset > /root/nft-backup/ruleset-before.nft'
sudo nft -a list ruleset

Минимальный ruleset: IPv4, IPv6, SSH и HTTPS

Ниже — цельный пример для сервера, который принимает SSH только из двух доверенных сетей и публикует HTTPS для всех источников по IPv4 и IPv6. Замените ens3, 22, 192.0.2.0/24, 2001:db8:100::/48 и 443 на реальные значения. Указанные адресные диапазоны зарезервированы для документации и не предназначены для использования в публичной маршрутизации.

Пример не является политикой для любого сервера

Ruleset разрешает весь исходящий трафик и запрещает транзитный. Для DNS-сервера, VPN, почтового узла, Kubernetes-хоста, маршрутизатора, контейнерной платформы или сервера с иной ролью потребуются другие правила. Полная модель запрета по умолчанию, источники доступа и исходящую фильтрацию проектируют отдельно: «Firewall сервера: default deny, порядок правил и политика доступа».
/root/server-filter.nft
# Замените значения интерфейса, портов и адресов до применения.
# Этот файл заменяет ruleset только при осознанном переходе на ручное nft-управление.
flush ruleset

table inet server_filter {
    set admin4 {
        type ipv4_addr
        flags interval
        elements = { 192.0.2.0/24 }
    }

    set admin6 {
        type ipv6_addr
        flags interval
        elements = { 2001:db8:100::/48 }
    }

    set block4 {
        type ipv4_addr
        flags timeout
    }

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

        # Явная временная блокировка до разрешающих правил.
        ip saddr @block4 counter drop

        # Локальные процессы.
        iifname "lo" counter accept

        # Ответы на исходящие соединения и связанные потоки.
        ct state established,related counter accept

        # Некорректные состояния не передаём дальше.
        ct state invalid counter drop

        # ICMPv4 для диагностики и сетевых сообщений.
        ip protocol icmp icmp type { echo-request, destination-unreachable, time-exceeded, parameter-problem } counter accept

        # ICMPv6: Neighbor Discovery, Path MTU Discovery и сообщения об ошибках.
        icmpv6 type { echo-request, destination-unreachable, packet-too-big, time-exceeded, parameter-problem, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } counter accept

        # SSH: только доверенные IPv4- и IPv6-источники.
        ip saddr @admin4 tcp dport 22 ct state new limit rate 10/minute burst 20 packets counter accept
        ip6 saddr @admin6 tcp dport 22 ct state new limit rate 10/minute burst 20 packets counter accept

        # Публичный HTTPS по IPv4 и IPv6: правило inet применимо к обоим семействам.
        tcp dport 443 ct state new counter accept

        # Логируем лишь часть отброшенных пакетов, чтобы не переполнить журнал.
        limit rate 5/second burst 10 packets log prefix "nft-in-drop: " level warning counter drop
    }

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

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

ct state использует отслеживание соединений. established,related разрешает ответный и связанный трафик, а ct state new сопоставляет пакеты потока, который conntrack ещё не считает установленным. Для TCP это не обязательно ровно один пакет: состояние new могут иметь, например, повторно переданные SYN-пакеты. Правило для новых SSH- или HTTPS-подключений не должно заменять разрешение ответного трафика.

Таблица inet объединяет правила для IPv4 и IPv6, но семейство адресного выражения остаётся явным: ip saddr сопоставляет IPv4, ip6 saddr — IPv6. Поэтому admin4 и admin6 — разные наборы nftables. Открытый IPv4-порт не означает автоматически такую же IPv6-политику: сервис может слушать только один стек, а набор доверенных источников и маршрутизация IPv6 могут отличаться.

Не блокируйте ICMPv6 без проверки роли и сети

ICMPv6 нужен не только для ping: Neighbor Discovery использует его вместо ARP, а сообщения packet-too-big участвуют в Path MTU Discovery. Блокировка нужных ICMPv6-типов способна нарушить адресацию, работу шлюза или передачу крупных пакетов. Список типов в примере — минимальная отправная точка, а не универсальный allowlist; учитывайте RA, SLAAC, туннели, VPN и роль интерфейса.

Проверьте и примените файл nftables

Безопасное применение ruleset

  1. 1
    Проверьте синтаксис и объекты
    Запустите sudo nft -c -f /root/server-filter.nft. При успехе команда обычно не выводит текст и возвращает код 0. При ошибке исправьте строку и повторите проверку; не применяйте файл с неразобранной ошибкой.
  2. 2
    Примените файл
    Выполните sudo nft -f /root/server-filter.nft. Команды файла передаются ядру как пакет изменений; при успешной загрузке ruleset заменит старые правила из-за flush ruleset в самом файле.
  3. 3
    Проверьте правила и счётчики
    Выполните sudo nft -a list ruleset. Убедитесь, что есть таблица inet server_filter, политика drop у input, ожидаемые sets и правила SSH/HTTPS. Затем откройте новую SSH-сессию с разрешённого адреса и проверьте доступ к опубликованному сервису с IPv4 и IPv6, если оба стека используются.
  4. 4
    Проверьте поведение с внешней точки
    Успешная загрузка файла не доказывает сетевую доступность. Проверьте соединение с доверенного и недоверенного источника, нужный TCP- или UDP-порт, а также адреса IPv4 и IPv6 отдельно. Если новая SSH-сессия не устанавливается, не закрывайте старую: исправьте файл либо используйте аварийный доступ.
Сначала проверяет файл, затем загружает его и выводит активные правила с handles.
sudo nft -c -f /root/server-filter.nft && sudo nft -f /root/server-filter.nft
sudo nft -a list ruleset

Что проверяет nft -c -f

nft -c -f FILE разбирает файл и проверяет команды без изменения активного ruleset. Он может выявить синтаксическую ошибку, неподдерживаемое выражение или некорректную ссылку на объект, но не моделирует маршрутизацию, доступность SSH, порядок правил другого менеджера и корректность ваших адресов. nft -f FILE не создаёт автоматической аварийной отмены: логически ошибочная, но синтаксически допустимая политика может заблокировать доступ.

Sets: ограничение доступа по IP и временная блокировка

Set заменяет множество однотипных правил. В примере admin4 и admin6 работают как allowlist для SSH: изменение списка не требует копировать правило порта для каждого адреса. Флаг interval позволяет хранить подсети и диапазоны, а timeout разрешает добавлять элементы с ограниченным сроком жизни.

Добавляет один доверенный IPv4-адрес и временно блокирует другой на час. Замените адреса на реальные.
sudo nft add element inet server_filter admin4 { 198.51.100.25 }
sudo nft add element inet server_filter block4 { 203.0.113.44 timeout 1h }
sudo nft list set inet server_filter admin4
sudo nft list set inet server_filter block4

Изменения set не записываются в исходный файл

Команды nft add element изменяют активный ruleset, но не редактируют /root/server-filter.nft. При следующем применении этого файла или после перезагрузки добавленный адрес исчезнет. Если адрес должен постоянно входить в admin4, внесите его в elements исходного файла, снова выполните nft -c -f и примените файл по безопасной процедуре. Элемент block4 с timeout обычно оставляют оперативным и не переносят в постоянную конфигурацию, если блокировка должна автоматически закончиться.

Адрес из block4 проверяется до разрешения ct state established,related, поэтому правило отбрасывает и пакеты уже существующих соединений с этого адреса. Однако оно не удаляет запись conntrack и не завершает состояние сессии внутри приложения: после удаления адреса из set или истечения timeout обмен может возобновиться, если соединение ещё сохраняется обеими сторонами. Принудительное удаление состояния conntrack и завершение прикладной сессии рассматривайте как отдельное изменение.

Для IPv6 создайте аналогичный set с type ipv6_addr и правилом ip6 saddr @block6. Не добавляйте IPv6-адрес в IPv4-set и наоборот: nftables проверяет тип элементов.

Логирование, counters и nftables rate limit

counter показывает, сколько пакетов и байтов совпало с правилом; это удобная проверка, дошёл ли пакет до нужной строки. log отправляет запись в журнал ядра, а limit rate ограничивает частоту совпадений. В примере лимит SSH применяется суммарно для каждого правила к пакетам с ct state new; это не точный счётчик логических TCP-соединений, поскольку лимит могут расходовать и повторно переданные SYN-пакеты. Ограничение перед log сокращает поток записей о блокировках.

Rate limit не является защитой от объёмной DDoS-атаки

Ограничение частоты запросов может снизить нагрузку от части новых подключений или журналирования, но не очищает канал до сервера и не заменяет фильтрацию у провайдера. Слишком низкий порог способен заблокировать легитимных клиентов. Для сценариев перегрузки см. «Защита сервера от DDoS: возможности firewall, фильтрация у провайдера и действия при атаке».
Показывает счётчики в цепочке и записи ограниченного журналирования. В системах без systemd смотрите журнал ядра средствами своего дистрибутива.
sudo nft list chain inet server_filter input
sudo journalctl -k -g 'nft-in-drop:'

Как найти правило, которое не срабатывает

Начните с факта подключения: сервер должен слушать нужный адрес и порт, а пакет — приходить на нужный интерфейс. Затем проверьте активный ruleset, счётчики и порядок базовых цепочек. Правило в файле конфигурации не имеет значения, если этот файл не был применён, позже перезаписан менеджером или не загружен после перезагрузки.

Диагностика nftables rule not working

  1. 1
    Сверьте активный ruleset с файлом
    Сравните sudo nft list ruleset с ожидаемым файлом. Если таблицы или правила нет, проверьте результат nft -f, ошибки systemd-unit и наличие другого менеджера firewall.
  2. 2
    Посмотрите handles и счётчики
    Используйте sudo nft -a list chain inet server_filter input. Если счётчик нужного правила растёт, пакет дошёл до него. Если не растёт, проверьте более ранний drop, другой hook, неверный интерфейс, адресное семейство и поступление трафика на сервер.
  3. 3
    Включите кратковременную трассировку
    В отдельном терминале запустите sudo nft monitor trace. Затем командой nft insert rule вставьте в начало цепочки узкое временное правило с meta nftrace set 1 для тестируемого порта или адреса. Выполните одно подключение и прочитайте трассировку. После диагностики найдите handle временного правила через nft -a list chain и удалите правило.
Временно вставляет правило трассировки для TCP/443 в начало цепочки. Во втором окне создайте одно тестовое подключение, затем удалите добавленное правило командой `nft delete rule ... handle N`.
sudo nft insert rule inet server_filter input tcp dport 443 meta nftrace set 1
sudo nft -a list chain inet server_filter input
sudo nft monitor trace
Удаляет временное правило трассировки. Замените `N` на handle из `nft -a list chain inet server_filter input`.
sudo nft delete rule inet server_filter input handle N

Трассировку включайте узко и ненадолго

nft monitor trace требует административных прав и может вывести много данных на загруженном сервере. Ограничивайте правило конкретным протоколом, портом или адресом. Не оставляйте meta nftrace set 1 в постоянной конфигурации без причины.

Ошибки nft command not found и nftables syntax error

Проблема

nft: command not found

Возможные причины

  • Не установлена userspace-утилита nftables.
  • Каталог с утилитой отсутствует в `PATH` для данной учётной записи или sudo-окружения.
  • Используется минимальный образ ОС без пакета nftables.

Решение

Проверьте command -v nft и документацию своего дистрибутива о пакете nftables. После установки повторите nft --version и sudo nft list ruleset. Не подменяйте отсутствующую утилиту командами iptables без решения, какой стек будет владельцем правил.

Как избежать

Зафиксируйте выбранный firewall-стек и проверяйте наличие его утилит в образе сервера до удалённых изменений.

Проблема

nftables syntax error при nft -c -f

Возможные причины

  • Опечатка, незакрытая скобка или неверный порядок выражений.
  • Выражение не поддерживается версией ядра либо userspace nft.
  • В файл вставлен синтаксис iptables или команда для другого семейства.

Решение

Откройте строку, указанную в ошибке, и сверяйте её с man nft и man nftables на самом сервере. Сначала проверяйте минимальный фрагмент: таблицу, затем цепочку, затем одно правило. После каждого исправления снова запускайте nft -c -f; не применяйте непроверенный файл.

Как избежать

Храните ruleset в отдельном файле, проверяйте его до применения и не копируйте правила между iptables и nftables без адаптации синтаксиса.

Как сделать nftables ruleset постоянным

Активный ruleset находится в памяти ядра и сам по себе не обязан пережить перезагрузку. Постоянный файл и systemd-unit зависят от дистрибутива, его версии и выбранного firewall-стека. Не включайте штатную службу nftables поверх активного UFW или firewalld.

Это типичные расположения, а не универсальные пути для всех релизов и образов ОС.

Семейство дистрибутиваТипичная штатная схема нативного nftablesЧто проверить
Debian и UbuntuПакет nftables, unit nftables.service, основной файл часто /etc/nftables.conf.systemctl cat nftables.service, документацию выпуска и содержимое файла, который читает unit.
RHEL-совместимые системы и FedoraПакет nftables, unit nftables.service, конфигурация часто размещается в /etc/sysconfig/nftables.conf.systemctl cat nftables.service и документацию конкретного выпуска: путь и способ загрузки различаются.

Закрепление правил после проверки

  1. 1
    Найдите файл, который загружает unit
    Выполните sudo systemctl cat nftables.service. Найдите ExecStart и путь после -f; он является источником конфигурации для этой службы. Если unit отсутствует, не создавайте произвольный unit до проверки документации выпуска.
  2. 2
    Скопируйте проверенный ruleset в штатный файл
    Сначала сохраните резервную копию существующего файла, затем скопируйте проверенный /root/server-filter.nft в путь, используемый unit. Убедитесь, что права на файл не позволяют неадминистративным пользователям менять firewall-политику.
  3. 3
    Проверьте файл по постоянному пути
    Запустите sudo nft -c -f /путь/к/постоянному-файлу. Это подтверждает синтаксис именно того файла, который должен загрузиться при старте.
  4. 4
    Включите unit и проверьте результат
    После проверки выполните sudo systemctl enable --now nftables.service, затем посмотрите systemctl status nftables.service и sudo nft list ruleset. Плановую перезагрузку проверяйте только при наличии аварийного доступа и окна обслуживания.
Пример для систем, где unit читает `/etc/nftables.conf`. Не используйте этот путь без проверки `systemctl cat`: на вашем дистрибутиве он может быть другим.
sudo systemctl cat nftables.service
sudo nft -c -f /etc/nftables.conf
sudo systemctl enable --now nftables.service
sudo systemctl status nftables.service --no-pager
sudo nft list ruleset

После перезагрузки повторите nft list ruleset, откройте новую SSH-сессию и проверьте опубликованные IPv4- и IPv6-сервисы извне. Если правила исчезли, сначала сопоставьте путь файла с ExecStart, затем изучите журнал nftables.service. Если ruleset вернулся, но отличается от файла, ищите UFW, firewalld, cloud-init, контейнерную платформу или другой процесс, который применяет правила позже.

Термины в статье

Netfilter — подсистема ядра Linux для перехвата и обработки сетевых пакетов в контрольных точках стека; правила iptables и nftables используют её механизмы.
UFW — утилита упрощённого управления правилами межсетевого экрана в Linux, создающая правила Netfilter по командам высокого уровня.
firewalld — служба управления межсетевым экраном в Linux, применяющая правила через зоны, сервисы и политики без прямого редактирования полного набора правил.
iptables — утилита Linux для управления правилами пакетной фильтрации Netfilter через таблицы, цепочки и цели; это не самостоятельный межсетевой экран.
nftables — подсистема Linux и интерфейс управления правилами Netfilter, использующие единый набор правил, выражения, множества и атомарное обновление конфигурации.
Базовая цепочка nftables — цепочка, привязанная к hook Netfilter и запускающая обработку пакетов на заданном этапе сетевого стека с указанным приоритетом.
Вердикт nftables — управляющее значение, задающее решение по пакету или дальнейший ход выполнения правил в цепочках netfilter.
Запрет по умолчанию — политика контроля доступа, при которой разрешаются только явно разрешённые правилами обращения или действия, а всё остальное блокируется.
Межсетевой экран — средство контроля сетевого трафика, разрешающее или блокирующее его по правилам на границе или между сегментами сети.
Набор nftables — типизированная коллекция значений, позволяющая сопоставлять адреса, порты или иные ключи без дублирования множества однотипных правил.
Ограничение частоты запросов — механизм контроля нагрузки, ограничивающий число запросов от клиента или другого субъекта за заданный интервал.
Отслеживание соединений в Linux — механизм Netfilter, ведущий записи о потоках и их состояниях для фильтрации с учётом состояния, NAT и правил, зависящих от направления трафика.
Порядок обработки правил — механизм определения последовательности проверки правил политики, от которой зависит, какое совпавшее правило применит система безопасности.
Правило межсетевого экрана — элемент политики фильтрации, задающий условия сопоставления трафика и действие над пакетами или соединениями.
Состояние соединения — классификация пакета подсистемой отслеживания соединений: NEW, ESTABLISHED, RELATED, INVALID или UNTRACKED.
Таблица nftables — контейнер правил Netfilter для одного семейства протоколов, объединяющий цепочки, наборы и объекты обработки пакетов.
Цепочка nftables — упорядоченный контейнер правил обработки пакетов, запускаемый из точки перехвата сетевого стека (hook) или вызываемый из другой цепочки.

Вопросы по теме

Все вопросы и ответы

Как ограничить доступ к SSH по IP в nftables?

Используйте отдельные sets с доверенными адресами: IPv4-set для правила ip saddr, IPv6-set для ip6 saddr. В примере admin4 и admin6 работают как allowlist для новых SSH-подключений, поэтому не нужно создавать отдельное правило порта для каждого адреса. Флаг interval позволяет добавлять в set подсети и диапазоны.

Нужно ли отдельно открывать порт для IPv6 в nftables?

Да, IPv4 и IPv6 нужно проверять отдельно. Таблица inet объединяет правила для обоих стеков, но адресные выражения различаются: ip saddr применяется к IPv4, а ip6 saddr — к IPv6. Открытый IPv4-порт сам по себе не создаёт IPv6-политику; сервис также может слушать только один стек.

Что показывает nft list ruleset и означает ли пустой вывод, что firewall выключен?

nft list ruleset показывает правила, известные ядру через nftables, включая объекты, созданные firewalld или слоем совместимости iptables-nft. Пустой вывод не доказывает, что firewall и сетевые ограничения отсутствуют: правила может обслуживать другой менеджер, а фильтрация может находиться вне сервера.

Сохранятся ли добавленные в set IP-адреса после перезагрузки?

Нет, если адрес добавлен только командой nft add element. Такая команда меняет активный ruleset, но не редактирует исходный файл конфигурации; при повторном применении файла или после перезагрузки изменение исчезнет. Постоянные адреса нужно добавить в elements файла и затем проверить и применить его.

Можно ли выполнять nft flush ruleset на удалённом сервере?

Без аварийного доступа — не стоит. nft flush ruleset удаляет весь активный ruleset и может снять разрешение SSH, правила контейнеров или конфигурацию другого менеджера firewall. Перед изменением сохраните текущие правила, оставьте активную SSH-сессию, откройте вторую для проверки и обеспечьте доступ через консоль провайдера, BMC или физическую консоль.

Гарантирует ли nft -c, что после применения останется доступ по SSH?

Нет. nft -c -f проверяет синтаксис файла, поддерживаемые выражения и ссылки на объекты, но не моделирует маршрутизацию, адреса источников, порядок правил другого менеджера и доступность SSH. Синтаксически корректная политика всё равно может заблокировать сервер, поэтому после загрузки её проверяют из второй SSH-сессии.