opened image

Fail2ban: автоматическая блокировка брутфорса SSH и веб-приложений

 

 

Каждый публичный сервер получает попытки перебора паролей - это факт. Боты непрерывно сканируют диапазоны 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.