
Каждый публичный сервер получает попытки перебора паролей - это факт. Боты непрерывно сканируют диапазоны IP и пробуют стандартные логины и пароли на порту 22. Даже если вы уже настроили SSH-ключи и отключили парольный вход, fail2ban полезен как дополнительный слой: он снижает нагрузку на сервис и ведёт журнал атак.
Для Nginx и других веб-приложений fail2ban блокирует IP, которые генерируют ошибки 4xx или атакуют конкретные пути. В статье - установка, настройка jail для SSH, расширение на Nginx и управление заблокированными IP.
Как работает fail2ban
Fail2ban читает лог-файлы и применяет регулярные выражения для поиска паттернов подозрительной активности. Когда IP превышает заданное число неудачных попыток за определённое время, fail2ban добавляет правило в iptables (или nftables, в зависимости от версии) и блокирует этот IP на заданный срок.
Три ключевых параметра:
maxretry- максимальное число попыток до блокировкиfindtime- временное окно для подсчёта попыток (в секундах)bantime- время блокировки (в секундах; отрицательное значение означает постоянную блокировку)
Например: maxretry = 5, findtime = 600, bantime = 3600 означает "заблокировать на 1 час IP, который 5 раз ошибся за 10 минут".
Установка fail2ban
sudo apt update
sudo apt install fail2ban -y
Запустите сервис и включите автозапуск:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Проверьте статус:
sudo systemctl status fail2ban

Структура конфигурации
Fail2ban хранит конфигурацию в /etc/fail2ban/:
fail2ban.conf- основной конфиг (уровень логирования, сокет)jail.conf- настройки всех jail'ов (не редактируйте этот файл)jail.d/- директория для пользовательских override-файловfilter.d/- регулярные выражения для парсинга логовaction.d/- действия при блокировке (ban/unban)
Важно: не редактируйте jail.conf напрямую. При обновлении пакета файл перезапишется. Вместо этого создайте файл /etc/fail2ban/jail.local или добавьте файлы в /etc/fail2ban/jail.d/.
Настройка jail для SSH
Создайте файл конфигурации:
sudo nano /etc/fail2ban/jail.local
Добавьте содержимое:
[DEFAULT]
# Время блокировки: 1 час
bantime = 3600
# Временное окно для подсчёта попыток: 10 минут
findtime = 600
# Максимальное число попыток
maxretry = 5
# Бэкенд для чтения логов (auto определяется автоматически)
backend = auto
# Игнорировать эти IP (localhost и ваш IP)
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
bantime = 7200
Здесь для SSH задаём более строгие параметры, чем по умолчанию: только 3 попытки и блокировка на 2 часа.
Сохраните файл и перезапустите fail2ban:
sudo systemctl restart fail2ban

Проверка активных jail'ов
Убедитесь, что sshd jail запущен:
sudo fail2ban-client status
Посмотрите детали конкретного jail:
sudo fail2ban-client status sshd
Вывод покажет число заблокированных IP, число неудачных попыток и список текущих банов.

Настройка jail для Nginx
Fail2ban умеет защищать Nginx от нескольких типов атак: перебор паролей через HTTP-аутентификацию, сканирование запрещённых путей, превышение лимитов запросов.
Добавьте секции в /etc/fail2ban/jail.local:
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
[nginx-noscript]
enabled = true
port = http,https
filter = nginx-noscript
logpath = /var/log/nginx/access.log
maxretry = 6
bantime = 86400
[nginx-badbots]
enabled = true
port = http,https
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 86400
Фильтр nginx-http-auth встроен в fail2ban. Фильтры nginx-noscript и nginx-badbots нужно создать или найти в /etc/fail2ban/filter.d/.
Проверьте, есть ли они:
ls /etc/fail2ban/filter.d/ | grep nginx
Если фильтра нет, создайте:
sudo nano /etc/fail2ban/filter.d/nginx-noscript.conf
[Definition]
failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)
ignoreregex =
Перезапустите fail2ban после изменений:
sudo systemctl restart fail2banПросмотр заблокированных IP
Посмотреть список забаненных IP в конкретном jail:
sudo fail2ban-client status sshd
В разделе Banned IP list будут все активные блокировки.
Посмотреть лог fail2ban в реальном времени:
sudo tail -f /var/log/fail2ban.log
Пример записи в логе:
2026-05-22 14:32:11,524 fail2ban.actions [1234]: NOTICE [sshd] Ban 203.0.113.45Разбан IP
Если заблокировали нужный IP (например, свой при неправильном вводе пароля):
sudo fail2ban-client set sshd unbanip 203.0.113.45
Замените sshd на нужный jail и 203.0.113.45 на IP.
Убедитесь, что IP разблокирован:
sudo fail2ban-client status sshd
IP должен исчезнуть из списка Banned IP list.
Постоянная блокировка повторных нарушителей
Для особо настойчивых атак можно настроить нарастающее время бана. Fail2ban поддерживает bantime.increment:
[DEFAULT]
bantime.increment = true
bantime.factor = 1
bantime.formula = ban.Time * (1<<(ban.Count if ban.Count<20 else 20)) * banFactor
bantime.maxtime = 2592000
bantime.maxtime = 2592000 - максимальный бан 30 дней (в секундах).
После добавления этих параметров в [DEFAULT] в jail.local и перезапуска fail2ban IP, которые продолжают атаковать после разбана, будут блокироваться на всё более долгий срок.
Проверка конфигурации без перезапуска
Перед применением изменений проверьте, что конфигурация корректна:
sudo fail2ban-client -t
Если ошибок нет, команда выведет OK.
Дополнительные действия: уведомления на email
Fail2ban может отправлять уведомления при блокировках. Для этого нужен настроенный почтовый агент на сервере (postfix или msmtp).
В jail.local в секцию [DEFAULT] добавьте:
destemail = admin@example.com
sendername = Fail2Ban
mta = sendmail
action = %(action_mwl)s
action_mwl отправляет письмо с whois-информацией и фрагментом лога при каждом бане.
Типичные проблемы
Fail2ban не блокирует, хотя попытки есть. Проверьте, правильно ли указан путь к логу в logpath. На Ubuntu 24.04 SSH-логи могут идти в journald без записи в файл. Убедитесь, что backend = systemd или backend = auto.
Заблокировали себя. Используйте VNC-консоль провайдера или второй IP. Добавьте свой IP в ignoreip в секции [DEFAULT].
Fail2ban не запускается. Проверьте синтаксис конфигурации: sudo fail2ban-client -t. Посмотрите детальный вывод: sudo journalctl -u fail2ban -n 50.
После настройки fail2ban сервер автоматически справляется с большинством атак перебором. Вместе с SSH-ключами и UFW это три основных уровня защиты, которые нужны каждому VPS.