Любой 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 и других) с помощью фильтров на регулярных выражениях. Логика работы укладывается в четыре шага:
- Фильтр находит в логе строку о неудачной авторизации и извлекает из неё IP-адрес.
- Если с одного адреса за окно времени
findtimeнабираетсяmaxretryнеудачных попыток, срабатывает jail («тюрьма») для этой службы. - Jail вызывает действие
banaction— обычно это блокирующее правило в nftables или UFW, которое отбрасывает пакеты с адреса нарушителя на времяbantime. - По истечении
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-адрес | 10m | 1h–24h; -1 — навсегда |
findtime | Окно, в котором считаются неудачные попытки | 10m | 10m–30m |
maxretry | Сколько неудачных попыток допускается за окно | 5 | 3–5 |
ignoreip | Адреса и подсети, которые не банятся никогда | 127.0.0.1/8 | localhost + ваш статический 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 секунд. Хватит и на защиту, и на всё, что вы будете защищать.