// Engineering Log
Защита Linux-сервера: Часть 2 — Fail2ban против подбора паролей
Опубликовано 22.09.2026
// Быстрый маршрут
Эта статья относится к теме Безопасность и защита.
Любой сервер с открытым SSH через несколько минут после запуска начинают перебирать боты: они пробуют типовые логины и пароли тысячами попыток в час. Межсетевой экран здесь не поможет — порт SSH должен быть открыт. Нужен инструмент, который заметит подбор и заблокирует адрес атакующего. Классическое решение — Fail2ban.
Как работает Fail2ban
Fail2ban — программа на Python со свободной лицензией. Она читает журналы служб, находит в них повторяющиеся неудачные попытки входа и временно блокирует адрес через межсетевой экран. Актуальная версия — 1.1.1 (15.08.2026).
Устроен Fail2ban из трёх частей:
- Фильтры — регулярные выражения, которые находят в журнале строки о неудачном входе, например
Failed password for ...у SSH. - Тюрьмы (jails) — связка «какой журнал читать, каким фильтром, сколько попыток за какое время допустимо и что делать».
- Действия (actions) — команды, которые выполняют блокировку: правила nftables, iptables или firewalld.
Главные параметры тюрьмы:
maxretry— сколько неудачных попыток допустимо (по умолчанию 5);findtime— за какой период их считать (по умолчанию 10 минут);bantime— на сколько блокировать адрес (по умолчанию 10 минут).
Установка и где хранить настройки
sudo apt install fail2banФайл /etc/fail2ban/jail.conf редактировать нельзя: в его заголовке прямо сказано, что он будет перезаписан при обновлении пакета. Свои настройки кладут в /etc/fail2ban/jail.local или в отдельные файлы /etc/fail2ban/jail.d/*.local — они переопределяют значения по умолчанию.
В Debian пакет уже содержит файл jail.d/defaults-debian.conf, в котором включена тюрьма sshd, блокировка настроена через nftables, а журнал SSH читается из systemd (backend = systemd). Поэтому на свежем Debian SSH защищён сразу после установки.
Минимальная рабочая настройка
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
banaction = nftables
banaction_allports = nftables[type=allports]
# свои адреса, которые нельзя блокировать
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
# растущий срок блокировки для повторных нарушителей
bantime.increment = true
bantime.factor = 1
bantime.maxtime = 1w
[sshd]
enabled = true
port = ssh
backend = systemdignoreip защищает от блокировки самого себя: если вы ошибётесь с паролем пять раз подряд из офиса, без этой строки офис потеряет доступ к серверу.
bantime.increment включает рост срока блокировки. Fail2ban запоминает адреса в своей базе и каждую следующую блокировку того же адреса делает длиннее: 1, 2, 4, 8, 16 базовых сроков — до предела bantime.maxtime. Боты, которые возвращаются через час, быстро получают блокировку на неделю.
Тюрьма recidive
Для самых настойчивых есть отдельная тюрьма recidive. Она читает журнал самого Fail2ban и блокирует на все порты адреса, которые уже неоднократно попадали в другие тюрьмы. По умолчанию — блокировка на неделю, если за сутки адрес набрал нужное число блокировок:
[recidive]
enabled = trueДокументация советует при этом увеличить dbpurgeage в fail2ban.local (например, до 648000 секунд, 7,5 суток), чтобы база помнила адреса достаточно долго.
Firewalld и nftables
Действие блокировки выбирают по тому, какой межсетевой экран стоит на сервере:
- nftables — действия
nftables-multiport,nftables-allportsили общееnftablesс параметромtype; вариант по умолчанию в Debian; - firewalld (RHEL, AlmaLinux, Rocky) — действия
firewallcmd-ipset,firewallcmd-rich-rulesи другие; - iptables — классические
iptables-multiportиiptables-allports, если сервер ещё работает на iptables-legacy.
Если выбрать действие не под тот межсетевой экран, Fail2ban будет исправно «блокировать» адреса в журнале, но реально ничего не заблокирует.
Проверка
sudo fail2ban-client status # список активных тюрем
sudo fail2ban-client status sshd # сколько адресов заблокировано
sudo fail2ban-client set sshd unbanip 203.0.113.10 # снять блокировку
sudo nft list ruleset | grep -A3 f2b # правила, которые создал Fail2banПроверить фильтр на журнале без блокировок помогает fail2ban-regex: он показывает, сколько строк фильтр нашёл.
Сильные стороны и ограничения
Fail2ban прост, почти не потребляет ресурсов и умеет защищать любую службу, которая пишет понятный журнал: SSH, почтовые серверы, веб-панели, Asterisk. Для большинства популярных служб фильтры уже есть в поставке.
Ограничения тоже нужно понимать:
- Fail2ban реагирует на запись в журнале, а не на сам трафик: блокировка наступает после того, как попытки уже были;
- распределённый подбор, когда каждый адрес делает одну-две попытки, он почти не замечает;
- каждый сервер защищается сам по себе и ничего не знает об атаках на соседние серверы.
Последние два ограничения закрывает CrowdSec. Но главная защита SSH от подбора — не Fail2ban, а вход только по ключам с отключённым входом по паролю: тогда подбирать нечего.
Типичные ошибки
- Настройки внесены в
jail.confи пропали после обновления пакета. - Не указан
ignoreip, и администратор блокирует сам себя. - Действие не соответствует межсетевому экрану: блокировки есть в журнале, но не в правилах.
- На Debian 12 и новее тюрьма настроена на чтение
/var/log/auth.log, которого нет: журнал SSH хранится в systemd, нуженbackend = systemd. - SSH перенесён на другой порт, а в тюрьме остался
port = ssh, и блокируется не тот порт.
Что ещё сделать для защиты нового сервера, собрано в чек-листе «Купил VPS — что дальше?».
// Похожая задача
Если у вас похожая ситуация
Эта статья относится к одной из рабочих тем. Можно продолжить чтение по теме, перейти на главную, чтобы понять, чем я занимаюсь, или сразу открыть услуги.
Тема статьи
Безопасность и защита
SSL, hardening, доступы, защита сервисов и безопасные конфигурации.
Часто с этим приходят
- Настроить SSL, сертификаты и безопасные подключения
- Ограничить доступы и закрыть лишние точки входа
- Усилить конфигурацию сервера и сервисов
// Следующий шаг
Если вам нужна не только статья, а помощь по этой теме, удобнее сразу перейти в услугу. Главная и подборка материалов остаются рядом.
Открыть услуги// Contact
Нужна помощь?
Свяжись со мной и я помогу решить проблему
Написать в TelegramОтвечаю в течение рабочего дня (03:00–13:00 GMT)
Или оставьте заявку здесь:
// Related