Fail2ban: настройка защиты SSH от подбора паролей

Настройка сервера
Fail2ban: настройка защиты SSH от подбора паролей

Любой VPS с публичным IP-адресом начинают брутфорсить в первые же часы после запуска: боты перебирают пароли SSH круглосуточно, и несколько тысяч попыток входа в сутки — обычная картина в журнале свежего сервера. Настройка Fail2ban решает эту проблему автоматически: сервис читает логи, находит адреса с многократными неудачными попытками авторизации и блокирует их через файрвол. В этой статье разберём установку Fail2ban на Ubuntu 24.04 LTS: создадим корректный jail.local, учтём важный нюанс с systemd journal, без которого защита SSH просто не заработает, и научимся управлять банами через fail2ban-client. Инструкция проверена на VPS Cheap-Host с Ubuntu 24.04, но подойдёт для любого сервера с root-доступом.

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

Fail2ban — это демон, который в реальном времени анализирует логи служб (SSH, Nginx, Postfix и других) с помощью фильтров на регулярных выражениях. Логика работы укладывается в четыре шага:

  1. Фильтр находит в логе строку о неудачной авторизации и извлекает из неё IP-адрес.
  2. Если с одного адреса за окно времени findtime набирается maxretry неудачных попыток, срабатывает jail («тюрьма») для этой службы.
  3. Jail вызывает действие banaction — обычно это блокирующее правило в nftables или UFW, которое отбрасывает пакеты с адреса нарушителя на время bantime.
  4. По истечении bantime блокировка снимается автоматически, вручную чистить правила не нужно.

Важно понимать границы инструмента: Fail2ban не предотвращает первые попытки подбора — он отсекает массовый перебор. Поэтому его применяют вместе с другими мерами: SSH-ключами вместо пароля и файрволом UFW. Один Fail2ban — хорошо, эшелонированная защита — заметно лучше.

Установка Fail2ban на Ubuntu 24.04

Пакет есть в стандартных репозиториях, никаких сторонних PPA не требуется:

sudo apt update
sudo apt install fail2ban

Включите автозапуск и запустите службу одной командой:

sudo systemctl enable --now fail2ban

Убедитесь, что демон работает:

sudo systemctl status fail2ban

Статус должен быть active (running). Но не спешите считать защиту SSH настроенной: на Ubuntu 24.04 конфигурация по умолчанию требует одной обязательной правки — о ней ниже.

Важный нюанс Ubuntu 24.04: backend = systemd

В Ubuntu 24.04 LTS из коробки нет rsyslog, поэтому привычного файла /var/log/auth.log на чистой системе не существует — события SSH пишутся напрямую в systemd journal. Классические конфигурации Fail2ban, рассчитанные на чтение /var/log/auth.log, здесь не работают: sshd-джейл не увидит ни одной попытки входа и не забанит ни одного бота, хотя сама служба будет выглядеть запущенной и здоровой.

Решение — явно указать джейлу backend = systemd, чтобы Fail2ban читал события напрямую из журнала. Именно это мы сделаем в jail.local в следующем разделе. Проверить, что попытки подбора действительно фиксируются в журнале, можно так:

journalctl -u ssh --since "1 hour ago"

Если сервер уже успел «засветиться» в интернете, вы увидите строки Failed password и Invalid user — это и есть то, что Fail2ban будет ловить.

Настройка jail.local: включаем защиту SSH

Файл /etc/fail2ban/jail.conf редактировать нельзя — он перезаписывается при обновлении пакета, и ваши правки пропадут. Все свои параметры выносим в /etc/fail2ban/jail.local, который читается поверх основного конфига и имеет приоритет:

sudo nano /etc/fail2ban/jail.local

Минимальная рабочая конфигурация для защиты SSH на Ubuntu 24.04:

[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 203.0.113.10

[sshd]
enabled = true
backend = systemd

Замените 203.0.113.10 на ваш реальный статический IP — адреса из ignoreip не блокируются никогда, это страховка от самобана. Если ваш IP динамический, лучше не вписывать в список ничего лишнего, а держать под рукой команду разблокировки (о ней ниже). Если вы меняли стандартный порт по инструкции о смене SSH-порта, добавьте в секцию [sshd] строку port = ваш_порт, чтобы блокировка применялась к нужному порту.

Примените конфигурацию:

sudo fail2ban-client reload

И проверьте, что джейл активен:

sudo fail2ban-client status

В выводе в строке Jail list должен появиться sshd. С этого момента перебор паролей блокируется автоматически.

Ключевые параметры jail: bantime, findtime, maxretry, ignoreip

Четыре параметра определяют всю логику блокировок. Их можно задавать в [DEFAULT] для всех джейлов сразу или переопределять в конкретной секции.

ПараметрЧто делаетПо умолчаниюРекомендация для SSH
bantimeНа сколько блокируется IP-адрес10m1h–24h; -1 — навсегда
findtimeОкно, в котором считаются неудачные попытки10m10m–30m
maxretryСколько неудачных попыток допускается за окно53–5
ignoreipАдреса и подсети, которые не банятся никогда127.0.0.1/8localhost + ваш статический IP

Дефолтные 10 минут бана слишком мягкие: бот вернётся и продолжит перебор. Для SSH разумно начать с bantime = 1h и ужесточать по результатам наблюдений. Есть и умный вариант — добавить в [DEFAULT] строку bantime.increment = true: тогда каждый повторный бан одного и того же адреса будет автоматически длиннее предыдущего, и настойчивые боты быстро уйдут в многочасовые блокировки.

Ресурсов Fail2ban при этом почти не потребляет: на тарифе Start у Cheap-Host (6 vCPU, 8 ГБ RAM, 96 ГБ NVMe за 450 ₽/мес) его работа незаметна даже во время активной волны перебора — чтение журнала и пара правил файрвола не создают ощутимой нагрузки.

Управление банами: fail2ban-client

Всё повседневное администрирование делается утилитой fail2ban-client. Статус конкретного джейла — самая частая команда:

sudo fail2ban-client status sshd

Вывод показывает счётчики Total failed и Total banned, а также список заблокированных адресов прямо сейчас. Если под блокировку попал легитимный пользователь, разбаньте его вручную:

sudo fail2ban-client set sshd unbanip 203.0.113.55

После правок в jail.local перечитайте конфигурацию — статистика и текущие баны при этом сохраняются:

sudo fail2ban-client reload

Проверить действующее значение параметра без чтения конфигов:

sudo fail2ban-client get sshd bantime

А при разборе инцидентов пригодится журнал самого демона: journalctl -u fail2ban покажет, кого, когда и по какому джейлу заблокировали.

Связка с UFW и другие меры защиты SSH

Если вы уже настроили файрвол по нашей статье про UFW на Ubuntu, логично, чтобы Fail2ban банил через него — тогда все блокировки будут видны в одном месте. Добавьте в секцию [DEFAULT] файла jail.local:

banaction = ufw

И примените изменения через sudo fail2ban-client reload. Теперь забаненные адреса появляются в выводе sudo ufw status как правила REJECT.

Fail2ban — только один слой обороны. Что ещё стоит сделать:

  • Перейти на SSH-ключи и отключить парольную аутентификацию — тогда подбор паролей теряет смысл в принципе.
  • Сменить стандартный порт 22 — это не защита сама по себе, но шум от ботов и объём журналов падают в разы.
  • Отказаться от входа под root и работать через пользователя с sudo — этот и другие базовые шаги собраны в чек-листе первичной настройки VPS.
  • Не отключать файрвол «на минутку»: правило по умолчанию — закрыто всё, кроме нужного.

От сетевых атак уровня L3/L4 (флуд, амплификация) Fail2ban не спасает — это задача инфраструктуры провайдера: на VPS Cheap-Host базовая DDoS-защита L3/L4 включена во все тарифы.

FAQ

Fail2ban запущен, но никого не банит, хотя в журнале видны попытки входа. Почему?

На Ubuntu 24.04 причина почти всегда одна: в секции [sshd] не указан backend = systemd, и джейл пытается читать несуществующий /var/log/auth.log. Проверьте sudo fail2ban-client status sshd: если счётчик Total failed нулевой при явных атаках в journalctl -u ssh, джейл не видит журнал. Добавьте backend = systemd и выполните sudo fail2ban-client reload.

Я заблокировал сам себя. Как вернуть доступ?

Подключитесь с другого IP-адреса или через консоль в панели хостинга (она работает в обход SSH) и выполните sudo fail2ban-client set sshd unbanip ВАШ_IP. Чтобы ситуация не повторялась, добавьте свой статический адрес в ignoreip.

Какие значения bantime и maxretry оптимальны для SSH?

Разумный старт: maxretry = 5, findtime = 10m, bantime = 1h. Если сервер под постоянным перебором, ужесточайте: maxretry = 3 и bantime.increment = true, чтобы повторные баны росли автоматически. Значение bantime = -1 блокирует навсегда — используйте его осознанно.

Заменяет ли Fail2ban SSH-ключи и файрвол?

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

Насколько Fail2ban нагружает сервер?

Минимально: демон инкрементально читает журнал и управляет несколькими правилами файрвола. Даже при тысячах попыток перебора в сутки нагрузка на CPU и память остаётся незаметной на любой современной конфигурации VPS.

Вывод

Десять минут на установку Fail2ban закрывают самую массовую угрозу для любого сервера — автоматический подбор паролей. Резюме для Ubuntu 24.04: поставить пакет через apt, создать /etc/fail2ban/jail.local с разумными bantime, findtime и maxretry, обязательно указать backend = systemd в секции [sshd], включить службу и проверить работу через fail2ban-client status sshd. Дальше система защищает себя сама, а вам остаётся изредка заглядывать в статистику.

Если для экспериментов или боевого проекта нужен сервер — у Cheap-Host тариф Start от 450 ₽/мес: 6 vCPU, 8 ГБ RAM, 96 ГБ NVMe, KVM с полным root-доступом, безлимитный трафик и выдача сервера за 45–60 секунд. Хватит и на защиту, и на всё, что вы будете защищать.

Читайте также