Статья подготовлена в рамках курса «Администратор Linux. Продвинутый уровень».

Привет, Хабр!

Меня зовут Андрей Бирюков. Я — независимый эксперт в области ИТ и ИБ, преподаю в учебных центрах и пишу статьи и книги.

Вряд ли среди читателей найдет администратор или инженер, который не отключал сам себе SSH сессию. Вы сидите на удаленном сервере или сетевом устройстве по SSH, активируете изменения в списках доступа… и лишаетесь доступа на управляемое устройство. Хорошо, если это устройство находится в серверной на соседнем этаже, гораздо веселее если оно «живет» на технологической площадке в тундре, где вообще нет людей…

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

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

Почему nftables и при чём тут iptables

Nftables — это современный фреймворк для пакетной фильтрации, пришедший на смену классическому iptables. Он доступен начиная с ядра Linux 3.13 и предлагает ряд преимуществ.

Это единый синтаксис для IPv4, IPv6, ARP и других семейств протоколов. Теперь нам больше не нужно писать отдельные правила для iptables и ip6tables. Также, мы можем использовать атомарную загрузку правил, то есть можно заменить весь набор правил одной транзакцией. Наконец, мы получили более читаемый синтаксис и удобную работу с наборами (sets).

Здесь также стоит обратить внимание на один важный момент: во многих дистрибутивах утилита iptables на самом деле является прослойкой, транслирующей команды в nftables. Убедиться в этом можно, выполнив nft list ruleset — если там есть таблицы с предупреждением managed by iptables-nft, значит, вы уже работаете поверх nftables.

Политика DROP и порядок правил

Самый частый способ потерять доступ — установить политику drop для цепочки input до того, как было добавлено правило, разрешающее SSH. Давайте рассмотрим такой опасный сценарий. Сначала создаём цепочку с политикой DROP:

nft add chain inet filter input { type filter hook input priority 0; policy drop; }

После применения этой цепочки все входящие соединения, включая ваш SSH, обрываются. В отличие от политики accept (которая разрешает всё, что явно, не запрещено), политика drop запрещает всё, что явно не разрешено (и рекомендуется к использованию по умолчанию).

Поэтому единственный безопасный способ — сначала добавить правило для SSH, и только потом устанавливать политику drop.

Метод 1: Атомарная загрузка правил (безопасный способ)

Главное преимущество nftables перед iptables — возможность атомарной замены всего набора правил одной командой.

Для начала давайте подготовим файл правил.

Создайте файл /etc/nftables.conf со следующим содержимым:

#!/usr/sbin/nft -f

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

        # Разрешаем loopback
        iif lo accept

        # Разрешаем установленные соединения (это критично для сохранения SSH!)
        ct state established,related accept

        # Отбрасываем некорректные пакеты
        ct state invalid drop

        # Разрешаем SSH
        tcp dport 22 accept

        # Разрешаем HTTP/HTTPS при необходимости

        tcp dport { 80, 443 } accept

        # Разрешаем ICMP (ping)
        ip protocol icmp accept
    }

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

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

Здесь ключевой момент заключается в следующем: flush ruleset в начале файла и policy drop в цепочке input сработают одновременно в рамках одной транзакции. Поскольку правило для SSH уже находится в том же файле, и разрыва соединения не произойдёт.

Загрузим созданные правила:

sudo nft -f /etc/nftables.conf

После успешной загрузки не забудьте проверить, что SSH‑соединение всё ещё живо. Если в конфигурации синтаксическая ошибка, nftables не применит её.

Метод 2: Автоматический откат при потере соединения

Предыдущий способ не гарантирует нам то, что мы не ошиблись например в номере порта, используемом для SSH или забыли про ct state established,related. И здесь нам на помощь может прийти возможность отката. Существует два подхода к автоматическому откату:

Вариант А: Таймер с подтверждением

Идея проста: после применения правил запускается таймер. Если вы не подтвердите, что соединение работает, правила автоматически откатываются.

Реализовать эту функциональность можно с помощью следующего сценария на bash:

#!/bin/bash

RULES_FILE="/etc/nftables.conf"
BACKUP_FILE="/tmp/nftables-backup-$(date +%s).conf"

# 1. Сохраняем текущие правила
nft list ruleset > "$BACKUP_FILE"

# 2. Применяем новые правила
nft -f "$RULES_FILE"

# 3. Запускаем таймер отката (5 минут)
(
    sleep 300
    echo "Timeout! Rolling back..."
    nft flush ruleset
    nft -f "$BACKUP_FILE"
) &

ROLLBACK_PID=$!

# 4. Ждём подтверждения от администратора
echo "Does SSH still work? (yes/no)"
read answer

if [[ "$answer" == "yes" ]]; then
    kill "$ROLLBACK_PID" 2>/dev/null
    echo "Configuration confirmed."
else
    echo "Rolling back..."
    # Таймер уже сработает, но можно ускорить
    nft flush ruleset
    nft -f "$BACKUP_FILE"
fi

Этот метод используется в готовых инструментах вроде nftables-apply.

Вариант Б: Специализированные утилиты

Также существуют инструменты, автоматизирующие процесс безопасного применения:

  • nftables-apply — утилита для Fedora, RHEL, Ubuntu и других дистрибутивов:

Для начала установим все необходимое:

  • sudo add-apt-repository ppa:setenforce1/nftables-apply

  • sudo apt install nftables-apply

Далее настроим применение с таймаутом 15 секунд

  • nftables-apply -s /etc/nftables/candidate.nft -t 15

Утилита применяет правила, ожидает подтверждения и автоматически откатывает изменения при потере соединения.

Особый случай: проблемы с conntrack

Бывает, что при первой загрузке правил SSH‑соединение обрывается, хотя правила на первый взгляд корректны. Причина: conntrack не был активен до загрузки правил, и для текущего SSH‑соединения не было записи в таблице состояний, поэтому правило ct state established,related accept не сработало.

Для решения этой проблемы на этапе загрузки системы необходимо добавить правило, которое ссылается на conntrack, активируя этот механизм заранее:

table inet filter {
    chain input {
        type filter hook input priority filter;
        ct state { established, related } accept
    }
}

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

Прежде чем вносить изменения, всегда полезно посмотреть, что уже настроено. Например, посмотреть весь текущий набор правил можно с помощью следующей команды:

sudo nft list ruleset

А посмотреть конкретную таблицу можно с помощью:

sudo nft list table inet filter

Соответственно, посмотреть конкретную цепочку можно так:

sudo nft list chain inet filter input

Если вы переходите с iptables, можно преобразовать существующие правила в формат nftables с помощью iptables-translate:

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

В результате получим:

nft add rule ip filter INPUT tcp dport 22 accept

Чего делать НЕ стоит

Ну а теперь давайте поговорим о вредных советах.

  • Во‑первых, не выполняйте команды по одной через SSH без страховки — между nft add chain... policy drop и добавлением разрешающего правила.

  • Во‑вторых, не используйте nft flush ruleset в интерактивном режиме на удалённом сервере — если у вас не было явного разрешающего правила для SSH, вы останетесь без защиты (и без доступа). Вместо этого используйте nft -f с полным набором правил.

И не забывайте про правило для установленных соединений — без ct state established,related accept даже правильно настроенный SSH может оборваться, если таблица conntrack была очищена.

Краткий чек‑лист для безопасной настройки

1. Подготовьте файл правил с flush ruleset, правилом для SSH и политикой drop

2. Проверьте синтаксис: nft -c -f /etc/nftables.conf.

3. Примените атомарно: sudo nft -f /etc/nftables.conf.

4. Сохраните правила для загрузки при старте: sudo nft list ruleset | sudo tee /etc/nftables.conf.

5. Настройте автоматический запуск: sudo systemctl enable nftables.

6. Оставьте себе запасное окно — не закрывайте текущую SSH‑сессию, пока не проверите, что новое подключение работает

Подведем итог

Nftables — мощный инструмент, который при правильном подходе можно настраивать на удалённых серверах без страха потерять доступ. Всегда используйте атомарную загрузку (nft -f) вместо отдельных команд, включайте правило для SSH до установки политики drop в цепочке input, не забывайте про ct state established,related accept — оно сохраняет ваше соединение.

Также используйте автоматический откат для сложных изменений и всегда оставляйте активную SSH‑сессию до проверки нового подключения.

Эти простые принципы превращают настройку файервола из рискованной операции в рутинную задачу, которую можно выполнять с уверенностью даже на самом удалённом сервере.

Работа с синхронизацией времени — одна из задач Linux‑администратора при эксплуатации серверов. Проверьте свои знания и узнайте, какие темы продвинутого администрирования стоит подтянуть.

Если вы отвечаете за Linux‑серверы и хотите безопасно вносить изменения в инфраструктуру без риска остановить сервисы, на открытых уроках разберём практические задачи системного администратора: настройку firewall, работу с хранилищем и восстановление серверов после сбоев.

  • 26 августа в 19:00. «Nftables без потери SSH: безопасно настраиваем firewall на удаленном сервере» — записаться

  • 8 сентября в 20:00. «LVM без простоя: расширение тома, перенос данных и аварийный откат через snapshot» — записаться

  • 21 сентября в 20:00. «Типовые задачи с RAID-массивами: создание, эксплуатация, перенос данных и восстановление» — записаться

  • 24 сентября в 19:00. «Сможет ли ИИ починить Linux-сервер: где заканчиваются подсказки и начинается инженерная диагностика» — записаться

Полный список открытых уроков августа собрали в дайджесте.

Комментарии (4)


  1. Kartyge
    26.08.2026 21:07

    Если доступ к серваку совсем затруднен - сделать скрипт сбрасывающий файрволл в дефолтное состояние с открытым ssh и воткнуть его в крон, с периодичностью в ~полчаса. До окончания работ по настройке.


  1. akelsey
    26.08.2026 21:07

    Для страховки можно ещё и autossh добавить с обратным пробросгм порта ssh на каком-нибудь vps.


  1. MrBotikkk
    26.08.2026 21:07

    https://codeberg.org/fbouynot/nftables-apply#manually

    sudo curl --create-dirs -o /usr/local/bin/nftables-apply https://codeberg.org/fbouynot/nftables-apply/raw/branch/main/nftables-apply
    sudo chmod +x /usr/local/bin/nftables-apply
    sudo curl --create-dirs -o /usr/local/share/man/man8/nftables-apply.8 https://codeberg.org/fbouynot/nftables-apply/raw/branch/main/nftables-apply.8
    sudo mandb

    https://codeberg.org/fbouynot/nftables-apply#activation

    # Fedora
    sudo sed -i 's|^#include "/etc/nftables/main.nft"|include "/etc/nftables/main.nft"|' /etc/sysconfig/nftables.conf
    # Debian/Ubuntu
    sudo sed -i 's|^#include "/etc/nftables/main.nft"|include "/etc/nftables/main.nft"|' /etc/nftables.conf
    #
    sudo systemctl restart nftables


  1. EvilMan
    26.08.2026 21:07

    Что-то я глянул все представленные скрипты "а-ля nftables-apply" и все они имеют один недостаток - полагаются на то, что тайм-аут истечёт и всё сбросится обратно.

    Но если коннект резко обрывается, то и сеанс пользователя завершается и все его процессы (если только не запускать эти скрипты в screen/tmux) - в результате правила не откатываются ни при аварийном дисконнекте, ни при нажатии CTRL+C. Это из-за того, что всякие trap-ы для перехвата и обработки сигналов в скрипте отсутствуют.

    Так что, если будете этим пользоваться, то запускайте эти скрипты только внутри screen/tmux, либо дорабатывайте самостоятельно.