Fail2ban — программа, которая читает системные журналы, считает неудачные попытки входа с каждого адреса и временно закрывает доступ тем, кто перебирает пароли. Типовая схема такая: 5 промахов за 10 минут — бан на 1 час, повторным нарушителям сутки и больше. Ресурсов она почти не потребляет: 20–30 МБ памяти и доли процента процессора, поэтому спокойно живёт на любом сервере из раздела VPS на Linux, включая тарифы от 59 ₽ в месяц.
Материал для владельца сайта или бота, который недавно арендовал первый сервер и увидел в логах тысячи чужих попыток зайти по SSH. Разберём по шагам: как поставить Fail2ban на Ubuntu, что писать в файле jail.local, как включить джейлы для SSH и веб-сервера, как убедиться что бан реально работает, и как разбанить себя, если запёрли собственный адрес.
Что такое Fail2ban и как он ловит перебор паролей
Fail2ban — служба-наблюдатель. Она не стоит на пути трафика и не проверяет каждый пакет: она просто читает текстовые журналы сервисов и ищет в них строки об ошибках авторизации. Как только с одного IP-адреса набирается заданное число таких строк за заданный промежуток времени, Fail2ban отдаёт команду системному файрволу — и адрес перестаёт получать ответы.
Комплект «за чем следим + что считаем ошибкой + на сколько баним» называется джейлом (jail, «тюрьма»). Для каждого сервиса свой джейл: отдельный для SSH, отдельный для веб-сервера, отдельный для почты. Внутри джейла работает фильтр — набор регулярных выражений, описывающих строку неудачного входа в конкретном логе.
Само блокирование выполняет не Fail2ban, а iptables или nftables — механизм фильтрации пакетов в ядре Linux. Fail2ban создаёт цепочку правил с именем вида f2b-sshd и добавляет туда адреса нарушителей. Через заданное время правило удаляется автоматически.
Перебор идёт не «по вам лично», а массово, ботами по всему диапазону адресов дата-центра. Свежий сервер с открытым 22-м портом ловит от 500 до 5000 попыток входа в сутки уже в первые дни — это постоянный фон.
Сколько ресурсов нужно и на каком VPS Fail2ban работает
Fail2ban написан на Python и работает как один фоновый процесс. В покое он держит 20–30 МБ памяти, при активном разборе логов поднимается до 50–60 МБ. Процессор нагружается только на старте, когда служба перечитывает журналы за сутки: 2–5% одного ядра на несколько секунд.
Отдельный сервер под защиту не нужен, добавлять память ради неё тоже не нужно. Fail2ban ставится на тот же VPS, где уже крутится сайт или бот. Конфигурации 1 ядро, 1 ГБ RAM и 10 ГБ диска хватает с запасом: на такой машине живут веб-сервер, база и защита одновременно.
Ниже — стартовые тарифы провайдеров каталога, на которых схема разворачивается без оговорок. Цены указаны за минимальную конфигурацию, реальный выбор шире: у отдельных площадок собрано по 400–500 тарифов.
| Провайдер | Цена от | Стартовая конфигурация | Рейтинг | Тарифов |
|---|---|---|---|---|
| RuVDS | 139 ₽ / мес | 1 ядро, 0,5 ГБ RAM, 10 ГБ HDD | 4.3 | 440 |
| 4VPS | 110 ₽ / мес | 1 ядро, 1 ГБ RAM, 5 ГБ NVMe | 4.0 | 568 |
| Timeweb | 180 ₽ / мес | 15 ГБ NVMe | 4.3 | 77 |
| Selectel | 200 ₽ / мес | 1 ядро, 1 ГБ RAM, 10 ГБ NVMe | 4.5 | 69 |
| AdminVPS | 299 ₽ / мес | 1 ядро, 1 ГБ RAM, 15 ГБ NVMe | 4.5 | 149 |
| Beget | 330 ₽ / мес | 1 ядро, 1 ГБ RAM, 10 ГБ NVMe | 4.5 | 7 |
| Aéza | 593 ₽ / мес | 1 ядро, 2 ГБ RAM, 30 ГБ NVMe | 4.6 | 151 |
Данные проверены 02.09.2026.
Если задача — только площадка под тестовый стенд или маленький бот, смотрите раздел недорогие VPS: минимальные предложения там начинаются от 59 ₽ в месяц, и Fail2ban на них работает так же, как на машине за 600 ₽.

Установка Fail2ban на Ubuntu: команды по шагам
Пакет лежит в стандартных репозиториях Ubuntu, сторонние источники не нужны. Всё делается по SSH под пользователем с правами sudo. Подойдёт любая сборка из раздела VPS с Ubuntu: команды ниже одинаковы для версий 20.04, 22.04 и 24.04.
- Обновите список пакетов и поставьте службу:
sudo apt update && sudo apt install fail2ban -y. - Проверьте, что процесс запустился и прописан в автозагрузку.
- Создайте собственный файл настроек jail.local — штатный jail.conf не трогаем.
- Опишите джейлы для SSH и веб-сервера.
- Проверьте синтаксис и перезапустите службу.
- Убедитесь по статусу, что джейлы поднялись и счётчики растут.
Первые две команды выглядят так:
sudo apt update
sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
В выводе последней команды должна быть строка active (running). Если написано inactive или failed — служба не стартовала, и правки конфига смысла не имеют.
Ключевой момент: файл /etc/fail2ban/jail.conf редактировать нельзя. Он перезаписывается при каждом обновлении пакета, и все правки исчезнут молча. Свои настройки кладут рядом, в jail.local — этот файл читается вторым и переопределяет значения из jail.conf.
sudo nano /etc/fail2ban/jail.local
Файл jail.local: разбор параметров построчно
Минимальный рабочий конфиг умещается в полтора десятка строк. Секция [DEFAULT] задаёт значения для всех джейлов сразу, а секции с именами сервисов — [sshd], [nginx-http-auth] — переопределяют их точечно.
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
[sshd]
enabled = true
port = 22
maxretry = 5
bantime = 1h
Адрес 203.0.113.10 в строке ignoreip — пример, подставьте свой домашний или офисный IP. Если провайдер выдаёт динамический адрес, впишите подсеть целиком, например 203.0.113.0/24.
| Параметр | Что задаёт | Типовое значение |
|---|---|---|
| maxretry | Сколько неудачных попыток допустимо до бана | 5 |
| findtime | Окно, внутри которого считаются попытки | 10m (600 секунд) |
| bantime | Длительность блокировки адреса | 1h (3600 секунд) |
| ignoreip | Белый список: адреса, которые не банятся никогда | 127.0.0.1/8 плюс ваш IP |
| backend | Откуда читать события: журнал systemd или файл | systemd |
| enabled | Включён ли конкретный джейл | true |
| port | Порт, который закрывается при бане | 22 для SSH |
Время пишется человекочитаемо: 10m — десять минут, 1h — час, 24h или 1d — сутки, 7d — неделя. Значение -1 в bantime означает вечный бан, но для боевого сервера это плохая идея: список правил файрвола растёт бесконечно, а рано или поздно в него попадает нужный адрес.
Джейл для SSH: 5 попыток за 10 минут и бан на час
Джейл [sshd] — тот, ради которого Fail2ban обычно и ставят. Он читает события демона sshd и ловит строки вида «Failed password for root from …» и «Invalid user admin from …». По умолчанию SSH слушает порт 22, и на него приходится основная масса переборов.
Комбинация maxretry 5 и findtime 10m означает: пять ошибок за десять минут дают бан. Человек, который ошибся паролем дважды и полез искать его в менеджере, под это не попадает. Бот, перебирающий по 20 паролей в минуту, попадает через 15 секунд.
Часа блокировки хватает, чтобы сделать перебор бессмысленным: за это время бот проверил бы тысячи вариантов, а получает пять. Для тех, кто возвращается снова, есть джейл recidive — он следит за собственным логом Fail2ban и банит адреса, попавшие в бан трижды за сутки.
[recidive]
enabled = true
bantime = 7d
findtime = 1d
maxretry = 3
Если вы перенесли SSH на нестандартный порт — скажем, 2222 — обязательно поправьте строку port. Иначе Fail2ban поймает нарушителя, но заблокирует ему 22-й порт, где уже никто не слушает, и подбор продолжится. Как менять порт и настраивать демон, разобрано в гайде как настроить SSH на VPS.
Джейлы для веб-сервера: nginx и подбор паролей к админке
Второй фронт — веб-сервер. Здесь перебирают не системные пароли, а формы входа: админку CMS, закрытые каталоги с HTTP-авторизацией, служебные скрипты. Fail2ban читает логи nginx и Apache так же, как журнал SSH.
Готовые фильтры лежат в пакете, включить их — вопрос трёх строк. Джейл nginx-http-auth ловит ошибки базовой авторизации, nginx-botsearch — сканеры, которые стучатся в /wp-admin, /phpmyadmin и десятки похожих адресов.
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
[nginx-botsearch]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 10
bantime = 24h
| Джейл | Что ловит | Журнал | Порты |
|---|---|---|---|
| sshd | Подбор пароля к серверу | journald или /var/log/auth.log | 22 |
| nginx-http-auth | Подбор пароля в HTTP-авторизации | /var/log/nginx/error.log | 80, 443 |
| nginx-botsearch | Сканирование служебных адресов | /var/log/nginx/error.log | 80, 443 |
| recidive | Повторные нарушители | /var/log/fail2ban.log | все |
Для веб-джейлов порог ставят выше — 10 вместо 5. Обычный посетитель легко получает несколько ошибок 404 подряд из-за битой ссылки или старой закладки, и банить его за это не нужно. А бан на 24 часа здесь уместнее часа: сканеры возвращаются пачками.

Проверка синтаксиса и перезапуск службы
После правки конфига Fail2ban не перечитывает файл сам. Пока служба не перезапущена, новые джейлы не существуют — это самая частая причина «настроил, а не работает». Перед перезапуском прогоните проверку синтаксиса: она разбирает конфиг и показывает строку с ошибкой.
sudo fail2ban-client -t
sudo systemctl restart fail2ban
Ответ OK: configuration test is successful означает, что файл разобран корректно. Сообщения про Unable to read the filter или Have not found any log file говорят о несуществующем фильтре либо о пути к журналу, которого нет на этой машине.
Отдельная тонкость Ubuntu 24.04: привычного файла /var/log/auth.log там нет, события SSH пишутся в журнал systemd. Поэтому в конфиге стоит backend = systemd, а не путь к файлу. На 20.04 и 22.04 работают оба варианта, но systemd-режим не зависит от ротации логов.
Перезапуск занимает 1–2 секунды и не рвёт текущие соединения: активные SSH-сессии продолжают работать. А вот список забаненных адресов при перезапуске обнуляется — все, кто сидел в бане, получают доступ заново и при следующей попытке считаются с нуля.
Как убедиться, что защита реально работает
Три команды показывают полную картину: общий список активных джейлов, детали по конкретному джейлу и живой лог событий.
sudo fail2ban-client status
sudo fail2ban-client status sshd
sudo tail -n 50 /var/log/fail2ban.log
Вывод по джейлу sshd содержит четыре цифры: сколько строк ошибок найдено всего, сколько сейчас в активном счётчике, сколько адресов забанено прямо сейчас и сколько банов было за всё время. Если через час после запуска на публичном сервере все счётчики по нулям — почти наверняка Fail2ban читает не тот источник событий.
Проверить, есть ли вообще перебор, можно напрямую по журналу. Команда ниже считает строки с неудачным вводом пароля за сутки — на свежем сервере с открытым 22-м портом там обычно от нескольких сотен до нескольких тысяч.
sudo journalctl -u ssh --since "24 hours ago" | grep -c "Failed password"
sudo iptables -L f2b-sshd -n --line-numbers
Вторая команда показывает цепочку правил, которую Fail2ban создал в файрволе, вместе со списком заблокированных адресов. Если цепочки f2b-sshd не существует, служба до файрвола не дошла — смотрите ошибки в её собственном логе.
Как разбанить свой адрес и не потерять доступ к серверу
Забанить себя проще, чем кажется: хватит трижды перепутать пароль или дважды подключиться с неправильным SSH-ключом. Соединение после этого не отваливается с ошибкой — оно перестаёт устанавливаться, клиент виснет и выдаёт timeout. Симптом узнаваемый: сайт открывается, а SSH молчит.
Если доступ ещё есть, снимите бан командой. Если доступа нет, помогает веб-консоль в панели провайдера: она подключается к серверу напрямую, минуя сеть и файрвол, и почти везде доступна бесплатно.
sudo fail2ban-client set sshd unbanip 203.0.113.10
sudo fail2ban-client unban --all
Первая команда снимает конкретный адрес с конкретного джейла, вторая чистит все баны разом. Чтобы это не повторялось, добавьте свой адрес в ignoreip — адреса из белого списка не банятся никогда. Домашние и мобильные подключения меняют адрес, поэтому туда лучше вписывать подсеть, а не одиночный IP.
Ещё одна страховка: держите открытой вторую SSH-сессию, пока правите конфиг. Если новая настройка отрежет вход, старое соединение продолжит работать, и вы успеете всё вернуть.
Что Fail2ban не делает: ключи и файрвол он не заменяет
Fail2ban замедляет перебор, но не отменяет саму возможность подобрать пароль. Он реагирует постфактум — сначала находит пять неудачных попыток в логе, потом банит. Если пароль слабый и угадывается с третьего раза, служба не успеет ничего сделать.
Поэтому порядок другой. Первым делом — вход по ключу и отключение парольной авторизации: параметры PasswordAuthentication no и PermitRootLogin prohibit-password в конфиге sshd убирают перебор как класс, подбирать становится нечего. Fail2ban после этого работает как фильтр шума и защита по другим сервисам.
Вторым слоем идёт файрвол. Fail2ban закрывает адреса, которые уже проявили себя, а UFW закрывает всё, что вы не открывали явно: у сервера остаются доступными только 22, 80 и 443, остальные порты просто не отвечают. Пошаговая настройка — в гайде как настроить файрвол на Linux-сервере.
Третий слой — обновления: ни бан, ни файрвол не спасают от дыры в устаревшей CMS. Чек-лист базовой защиты собран в материале про безопасность VPS.
Частые ошибки при настройке Fail2ban
Почти все проблемы новичков сводятся к шести сценариям, и внешний эффект у них одинаковый: команда status показывает нули, а в логах копятся чужие попытки входа.
Проверяйте в этом порядке — от самой частой причины к самой редкой. Три четверти случаев закрываются на первых двух пунктах.
- Не перезапустили службу. Конфиг правится в файле, но применяется только после
systemctl restart fail2ban. - Правки внесли в jail.conf. При обновлении пакета файл перезаписывается, настройки исчезают без предупреждения.
- Джейл следит не за тем логом. На Ubuntu 24.04 нужен backend systemd, путь к /var/log/auth.log там не сработает.
- Порт в джейле не совпадает с реальным. SSH перенесли на 2222, а блокируется по-прежнему 22.
- Забанили себя и не внесли IP в ignoreip. Спасает веб-консоль провайдера и
unban --all. - Поставили bantime -1 и maxretry 2. Вечные баны копятся сотнями, а под раздачу попадают живые люди.
Отдельный случай — сайт за CDN или балансировщиком. В логах веб-сервера тогда виден адрес не посетителя, а промежуточного узла, и джейл забанит сам CDN, отрезав сайт от всех сразу. Лечится настройкой real_ip в nginx до включения веб-джейлов.
Частые вопросы
Сколько ресурсов занимает Fail2ban на слабом VPS? В покое 20–30 МБ оперативной памяти и практически нулевая нагрузка на процессор. На тарифе с 1 ГБ RAM за 139–200 ₽ в месяц это незаметно даже рядом с работающим сайтом и базой данных.
Какие значения maxretry и bantime поставить новичку? Начните с классики: maxretry 5, findtime 10 минут, bantime 1 час. Через неделю посмотрите статистику командой status и, если банов много, поднимите bantime до 24 часов и включите джейл recidive.
Fail2ban защищает только SSH? Нет. В пакете есть готовые фильтры для nginx, Apache, Postfix и Dovecot, FTP и панелей управления. Принцип общий: есть лог с записями об ошибках входа — можно сделать джейл.
Что будет, если я забаню собственный адрес? SSH-соединение перестанет устанавливаться, клиент будет висеть до таймаута. Зайдите через веб-консоль провайдера, выполните fail2ban-client unban --all и добавьте свой IP в ignoreip.
Нужен ли Fail2ban, если вход по паролю отключён? Полезен, но уже не критичен для SSH. Перебирать при входе только по ключу нечего, зато джейлы для веб-сервера и почты остаются актуальными — формы входа в админку никуда не деваются.
Чем Fail2ban отличается от файрвола? Файрвол решает статически: этот порт открыт, этот закрыт. Fail2ban принимает решение по поведению — открытый порт закрывается конкретному адресу на 1 час после 5 промахов. Они работают вместе: Fail2ban отдаёт команды тому же iptables.
Как понять, что защиту пробуют обойти? Смотрите на счётчик Total banned в выводе status. Резкий рост за сутки с десятков до сотен адресов означает распределённый перебор — тогда имеет смысл увеличить bantime и подключить recidive на 7 дней.
Итог
Fail2ban ставится за 5 минут и закрывает самый шумный тип атак на сервер — автоматический перебор паролей. Рабочий минимум: пакет из репозитория, свой файл jail.local, джейл sshd с порогом 5 попыток за 10 минут и баном на 1 час, свой адрес в ignoreip и обязательный перезапуск службы. Проверка занимает одну команду status.
Помните, что это второй слой, а не первый: сначала ключи вместо паролей и закрытые лишние порты, потом уже автоматические баны. Ресурсов схема почти не требует — подойдёт любой тариф от 59 ₽ в месяц, подобрать машину можно в разделе VPS на Linux с фильтрами по памяти, диску и локации.