ЯдроКодаподготовка к экзаменам
Учебная платформа

Загружаем материалы

Подготавливаем материалы и навигацию по разделу.

Firewall Linux: UFW, firewalld и правила nftables

Автор: · Обновлено

Firewall фильтрует пакеты согласно правилам. Он не запускает приложение и не заставляет его слушать внешний интерфейс. Поэтому сначала проверяют сокет через ss, затем правила хоста, а после — сетевой путь с другой машины. У облачного сервера дополнительно может действовать firewall провайдера. Эксперименты выполняйте в учебной VM с консолью, чтобы ошибочное правило не отрезало доступ.

Выбрать владельца правил и сохранить SSH

UFW и firewalld — интерфейсы управления, iptables и nftables — семейства инструментов и механизмов фильтрации. На современной системе команда iptables может использовать совместимость поверх nftables. Одновременное ручное редактирование разных слоёв затрудняет понимание итоговой политики: выберите тот, которым управляет дистрибутив и ваша конфигурация.

Перед включением запретов определите настоящий SSH-порт через конфигурацию sshd и ss -ltnp, текущий исходный адрес администратора и способ восстановления из консоли. Разрешающее правило создают до включения firewall. Старое открытое SSH-соединение может продолжить работать благодаря tracking, хотя новые подключения уже запрещены. Поэтому проверка — именно новый вход во втором терминале, при сохранённом первом сеансе.

UFW: разрешить порт или один адрес

Команды ниже — последовательность для VM с SSH на порту 22 и администратором 192.0.2.10. Этот документационный адрес нужно заменить реальным разрешённым адресом своей лаборатории.

sudo ufw status verbose
sudo ufw --dry-run allow from 192.0.2.10 to any port 22 proto tcp
sudo ufw allow from 192.0.2.10 to any port 22 proto tcp
sudo ufw allow 8080/tcp
sudo ufw enable
sudo ufw status numbered

Первое правило разрешает TCP/22 указанному IP, второе разрешает TCP-порт 8080 всем источникам. Общее ограничение SSH оценивают по всей политике: существующее allow 22/tcp или разрешающая входящая политика могут пропускать другие адреса. Перед выводом о доступе только с одного IP проверьте ufw status verbose, ufw status numbered и относящиеся к SSH правила. Для сети можно указать CIDR, например 192.0.2.0/24. Предварительный --dry-run показывает план, но не проверяет корректность адреса администратора. ufw allow from адрес без ограничения порта даёт гораздо более широкий доступ, чем правило to any port.

Вывод ufw status показывает разрешения, а не список слушающих приложений. Если правило для 8080 есть, а ss -ltn не показывает listener, соединение всё равно не заработает. Для IPv6 проверьте соответствующие правила и настройку UFW отдельно: разрешение или запрет IPv4 не описывает автоматически весь доступ к хосту.

Удаление и восстановление доступа

sudo ufw status numbered
sudo ufw delete allow 8080/tcp
sudo ufw status numbered

Можно удалить по номеру: ufw delete N, но после каждого удаления номера сдвигаются. Сначала перечитайте список; не удаляйте подряд старые номера из заметки. Для адресного правила удобна точная обратная форма ufw delete allow from ... to any port ... proto tcp.

Если UFW заблокировал SSH, используйте локальную или облачную консоль, проверьте status и добавьте правильное разрешение. Временное отключение через ufw disable из консоли может восстановить связь, но открывает то, что блокировалось; после восстановления исправьте политику и проверьте повторное включение. Закрытый сеанс сам по себе не является способом отката.

firewalld: зона, runtime и permanent

sudo firewall-cmd --get-active-zones
sudo firewall-cmd --zone=public --add-service=ssh
sudo firewall-cmd --zone=public --add-port=8080/tcp
sudo firewall-cmd --zone=public --list-all

Используйте зону, которой действительно назначен интерфейс или источник вашей VM. Эти изменения runtime исчезнут после reload или перезапуска. После проверки повторите нужные добавления с --permanent, затем проверьте --permanent --zone=public --list-all. Reload заменяет runtime сохранённой конфигурацией, поэтому сначала убедитесь, что SSH разрешён и там. Для удаления применяют --remove-port=8080/tcp в нужном runtime/permanent-наборе; эти наборы независимы.

Читать iptables и nftables

sudo iptables -S
sudo iptables -L -n -v
sudo ip6tables -S
sudo nft -a list ruleset

iptables -S выводит правила в форме команд, -L -n -v — цепочки со счётчиками без разрешения имён. В nftables таблица содержит цепочки, а базовая цепочка связана с hook, например input для пакетов хосту. Семейство inet позволяет описывать IPv4 и IPv6 в одной таблице. Policy drop на input требует заранее разрешённых loopback, необходимых служебных протоколов и доступа администратора; готовый случайный набор правил не подходит каждой сети.

Для безопасной тренировки на VM создайте только обычную цепочку без hook: она не обрабатывает реальные пакеты, пока другая цепочка на неё не ссылается.

sudo nft add table inet course_demo
sudo nft add chain inet course_demo inspect
sudo nft add rule inet course_demo inspect tcp dport 8080 counter accept
sudo nft -a list chain inet course_demo inspect

В выводе появится handle N. Удаление одного правила: sudo nft delete rule inet course_demo inspect handle N, подставив актуальный handle. Итоговую учебную таблицу удаляют sudo nft delete table inet course_demo. Не выполняйте flush ruleset: это затронет чужие правила, включая правила контейнеров и менеджера firewall. Учебная обычная цепочка демонстрирует синтаксис и удаление; для фильтрации потребовались бы осознанные hook, priority и полная политика.

Fail2ban рядом с UFW

Fail2ban читает события, распознаёт повторные неудачи и вызывает действие блокировки. Для SSH создают локальный файл в jail.d/, включают jail sshd, задают фактический порт и поддерживаемый источник журнала. При systemd backend используют журнал, а не выдуманный путь auth.log. Если пакет поставляет действие ufw, banaction = ufw направляет блокировки через него; наличие action проверяют в /etc/fail2ban/action.d/.

Перед запуском проверьте конфигурацию fail2ban-client -t, после — fail2ban-client status sshd. Исключения ignoreip назначают узко для управляемых адресов, а не для всего интернета. Неверный фильтр или широкое исключение делает защиту неэффективной. Ограничение попыток дополняет SSH-ключи и осмысленную аутентификацию, но не заменяет их.

Ошибка и диагностика

Правило accept может не дать ожидаемого доступа, если пакет не доходит до нужной цепочки или позднее блокируется другим компонентом. Сопоставьте интерфейс, зону, семейство IP, счётчики и внешний тест. Не считайте временно живой SSH доказательством исправности политики для новых соединений.

Практика

В VM зафиксируйте текущий firewall, SSH-порт и консоль восстановления. Добавьте правило для временного тестового сервиса, проверьте listener локально и соединение с другой собственной машины. Удалите разрешение и повторите оба наблюдения: сокет останется, внешний доступ изменится. Отдельно создайте обычную учебную nft-цепочку, найдите handle и удалите только её объекты. Убедитесь, что правила других таблиц сохранились.

Что важно запомнить

Открытый порт в правилах, слушающий сокет и успешный внешний запрос — три разных факта. Изменение политики считают завершённым после проверки нового подключения и сохранённой конфигурации.

Частые вопросы

Почему после reload исчезло разрешение firewalld?

Оно было добавлено только в runtime. Сохраните нужное правило в permanent после проверки, затем повторно сравните оба набора и доступ администратора.

UFW показывает ALLOW, но сайт недоступен. Где искать?

Проверьте bind-адрес приложения, порт и протокол, правила провайдера, DNS и обратный маршрут. ALLOW описывает только один этап прохождения пакета.

Можно ли удалить nft-правило по его тексту?

Обычная процедура использует handle из свежего вывода nft -a. Номер относится к конкретной таблице и цепочке, поэтому старую запись нельзя переносить на другую конфигурацию.

Источники