// Engineering Log

Защита Linux-сервера: Часть 2 — Fail2ban против подбора паролей

Опубликовано 22.09.2026

// Быстрый маршрут

Эта статья относится к теме Безопасность и защита.

Любой сервер с открытым SSH через несколько минут после запуска начинают перебирать боты: они пробуют типовые логины и пароли тысячами попыток в час. Межсетевой экран здесь не поможет — порт SSH должен быть открыт. Нужен инструмент, который заметит подбор и заблокирует адрес атакующего. Классическое решение — Fail2ban.

Как работает Fail2ban

Fail2ban — программа на Python со свободной лицензией. Она читает журналы служб, находит в них повторяющиеся неудачные попытки входа и временно блокирует адрес через межсетевой экран. Актуальная версия — 1.1.1 (15.08.2026).

Устроен Fail2ban из трёх частей:

  1. Фильтры — регулярные выражения, которые находят в журнале строки о неудачном входе, например Failed password for ... у SSH.
  2. Тюрьмы (jails) — связка «какой журнал читать, каким фильтром, сколько попыток за какое время допустимо и что делать».
  3. Действия (actions) — команды, которые выполняют блокировку: правила nftables, iptables или firewalld.

Главные параметры тюрьмы:

  • maxretry — сколько неудачных попыток допустимо (по умолчанию 5);
  • findtime — за какой период их считать (по умолчанию 10 минут);
  • bantime — на сколько блокировать адрес (по умолчанию 10 минут).

Установка и где хранить настройки

bash
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 защищён сразу после установки.

Минимальная рабочая настройка

ini
# /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 = systemd

ignoreip защищает от блокировки самого себя: если вы ошибётесь с паролем пять раз подряд из офиса, без этой строки офис потеряет доступ к серверу.

bantime.increment включает рост срока блокировки. Fail2ban запоминает адреса в своей базе и каждую следующую блокировку того же адреса делает длиннее: 1, 2, 4, 8, 16 базовых сроков — до предела bantime.maxtime. Боты, которые возвращаются через час, быстро получают блокировку на неделю.

Тюрьма recidive

Для самых настойчивых есть отдельная тюрьма recidive. Она читает журнал самого Fail2ban и блокирует на все порты адреса, которые уже неоднократно попадали в другие тюрьмы. По умолчанию — блокировка на неделю, если за сутки адрес набрал нужное число блокировок:

ini
[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 будет исправно «блокировать» адреса в журнале, но реально ничего не заблокирует.

Проверка

bash
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)

Или оставьте заявку здесь:

Подтвердите, что вы не бот.

Написать и получить быстрый ответ