Статья подготовлена в рамках курса «Администратор 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-applysudo 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)

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

MrBotikkk
26.08.2026 21:07https://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 mandbhttps://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

EvilMan
26.08.2026 21:07Что-то я глянул все представленные скрипты "а-ля nftables-apply" и все они имеют один недостаток - полагаются на то, что тайм-аут истечёт и всё сбросится обратно.
Но если коннект резко обрывается, то и сеанс пользователя завершается и все его процессы (если только не запускать эти скрипты в screen/tmux) - в результате правила не откатываются ни при аварийном дисконнекте, ни при нажатии CTRL+C. Это из-за того, что всякие trap-ы для перехвата и обработки сигналов в скрипте отсутствуют.
Так что, если будете этим пользоваться, то запускайте эти скрипты только внутри screen/tmux, либо дорабатывайте самостоятельно.
Kartyge
Если доступ к серваку совсем затруднен - сделать скрипт сбрасывающий файрволл в дефолтное состояние с открытым ssh и воткнуть его в крон, с периодичностью в ~полчаса. До окончания работ по настройке.