Проблема
Большинство администраторов знакомят с Fail2Ban через SSH. Он эффективно блокирует IP адреса, с которых идёт перебор паролей. Однако современная инфраструктура состоит из десятков сервисов, каждый из которых потенциально уязвим для брутфорса. Почтовые серверы (Postfix, Dovecot) страдают от атак на SASL аутентификацию. Веб-серверы (Nginx, Apache) от сканирования уязвимостей и перебора паролей к админ панелям. FTP серверы (vsftpd) от подбора учётных данных к файловым хранилищам. Ограничиваясь защитой только SSH, администратор оставляет эти сервисы беззащитными.
Решение
Fail2Ban это фреймворк для предотвращения вторжений. Он анализирует логи сервисов, находит подозрительные повторяющиеся события (например, неудачные попытки аутентификации) и временно блокирует IP адрес нарушителя на уровне межсетевого экрана. Он работает с iptables, nftables, firewalld и другими бэкендами.
В этой статье мы выполним следующие действия.
Установим и настроим Fail2Ban на сервере с Ubuntu 22.04.
Настроим готовые джейлы для Postfix, Dovecot, Nginx и vsftpd, которые уже входят в состав Fail2Ban.
Научимся создавать собственные фильтры с помощью регулярных выражений для любых сервисов, которые пишут в лог.
Рассмотрим расширенные возможности. Белые списки, увеличение времени бана при повторных нарушениях и отправку уведомлений.
Пошаговая инструкция
1. Установка Fail2Ban
Debian, Ubuntu.
text
sudo apt update
sudo apt install fail2ban -y
RHEL, CentOS, Rocky Linux.
text
sudo dnf install fail2ban fail2ban-firewalld -y
После установки служба будет автоматически запущена. Проверим её статус.
text
sudo systemctl status fail2ban
2. Базовая конфигурация
Fail2Ban использует два типа конфигурационных файлов.
/etc/fail2ban/jail.conf основной файл, который не рекомендуется редактировать напрямую, так как он перезаписывается при обновлении пакета.
/etc/fail2ban/jail.local переопределяет параметры по умолчанию. Именно его мы будем редактировать для настройки джейлов (правил защиты).
Создадим jail.local на основе стандартного.
text
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Теперь отредактируем jail.local. Все настройки в секции [DEFAULT] будут применяться ко всем джейлам, если не переопределены в самом джейле.
text
sudo nano /etc/fail2ban/jail.local
Основные параметры [DEFAULT].
text
[DEFAULT]
# Время блокировки в секундах (600 секунд = 10 минут)
bantime = 600
# Период времени (в секундах), в течение которого считаются ошибки
findtime = 600
# Количество ошибок за период findtime, после которого IP блокируется
maxretry = 5
# Действие по умолчанию — блокировка через iptables
banaction = iptables-multiport
# Игнорируем локальные адреса
ignoreip = 127.0.0.1/8 ::1
Официальная документация. Все параметры конфигурации подробно описаны на GitHub странице Fail2Ban и в man jail.conf.
3. Защита Nginx (веб-сервер)
Fail2Ban может защищать веб-сервер от брутфорса и сканирования. Рассмотрим два сценария.
3.1. Блокировка неудачных попыток HTTP аутентификации
Если на сайте используется базовая HTTP аутентификация (через модуль ngx_http_auth_basic_module), неудачные попытки логируются в error.log. Fail2Ban уже имеет встроенный фильтр nginx-http-auth для этого.
Добавим джейл в jail.local.
text
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 600
После этого Fail2Ban будет отслеживать строки вроде.
text
client 192.168.1.100: user "admin": authentication failure
3.2. Блокировка подозрительных запросов (кастомный фильтр)
Иногда требуется блокировать не только неудачные логины, но и запросы, содержащие определённые паттерны. Например, сканирование phpMyAdmin или попытки выполнить eval().
Создадим собственный фильтр /etc/fail2ban/filter.d/nginx-badbots.conf.
text
[Definition]
failregex = ^<HOST> .* "GET /(?:phpmyadmin|pma|admin|wp-login\.php).*" .*$
ignoreregex =
Этот фильтр будет находить в логах Nginx (/var/log/nginx/access.log) IP адреса, с которых приходят запросы к подозрительным URL.
Добавим джейл в jail.local.
text
[nginx-badbots]
enabled = true
port = http,https
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 3
bantime = 3600
findtime = 600
Теперь любой IP, который трижды обратится к запрещённым URL в течение 10 минут, будет заблокирован на час.
4. Защита почтового сервера (Postfix + Dovecot)
Почтовый сервер одна из главных целей брутфорс атак. Злоумышленники перебирают пароли к учётным записям, пытаясь использовать их для рассылки спама.
4.1. Postfix. Блокировка неудачных SASL аутентификаций
Fail2Ban имеет встроенный фильтр postfix и postfix-sasl. Второй специализируется на отслеживании ошибок SASL аутентификации.
Добавим в jail.local.
text
[postfix-sasl]
enabled = true
port = smtp,ssmtp
filter = postfix-sasl
logpath = /var/log/mail.log
maxretry = 3
bantime = 1800
findtime = 300
Фильтр будет искать в логах строки вида.
text
warning: unknown[192.168.1.100]: SASL LOGIN authentication failed: authentication failure
Официальная информация. Детали о встроенных фильтрах Postfix можно найти в документации Fail2Ban.
4.2. Dovecot. Блокировка неудачных IMAP и POP3 логинов
Dovecot также имеет встроенный фильтр dovecot.
Добавим джейл в jail.local.
text
[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps
filter = dovecot
logpath = /var/log/mail.log
maxretry = 3
bantime = 1800
findtime = 300
Фильтр находит в логах строки вроде.
text
dovecot: auth: passwd-file(admin,192.168.1.100): unknown user
5. Защита FTP сервера vsftpd
FTP серверы классическая цель для брутфорса. В vsftpd все неудачные попытки логируются в /var/log/vsftpd.log.
В Fail2Ban есть встроенный фильтр vsftpd.
Добавим джейл в jail.local.
text
[vsftpd]
enabled = true
port = ftp,ftp-data,ftps,ftps-data
filter = vsftpd
logpath = /var/log/vsftpd.log
maxretry = 3
bantime = 3600
findtime = 600
Фильтр отслеживает строки.
text
Mon Apr 7 12:00:00 2025 [pid 12345] [ftpuser] FAIL LOGIN: Client "192.168.1.100"
Официальная информация. Подробности о фильтре vsftpd можно найти в исходном коде Fail2Ban.
6. Создание собственного фильтра для любого сервиса
Предположим, у вас есть собственное приложение, которое пишет в лог строки.
text
2025-04-07 12:00:00 [ERROR] Failed login attempt from 192.168.1.100 for user admin
Создадим фильтр /etc/fail2ban/filter.d/myapp.conf.
text
[Definition]
failregex = ^.*Failed login attempt from <HOST> for user .*$
ignoreregex =
Здесь <HOST> специальный тег Fail2Ban, который захватывает IP адрес. Он работает с IPv4 и IPv6 и поддерживает маски портов (например 192.168.1.100:12345).
Добавим джейл в jail.local.
text
[myapp]
enabled = true
port = 8080
filter = myapp
logpath = /var/log/myapp/error.log
maxretry = 3
bantime = 600
Перед применением всегда тестируйте фильтр с помощью встроенной утилиты fail2ban-regex.
text
fail2ban-regex /var/log/myapp/error.log /etc/fail2ban/filter.d/myapp.conf
Утилита покажет, сколько строк успешно совпало с регулярным выражением, и выведет извлечённые IP адреса.
7. Расширенные настройки
7.1. Увеличение времени бана при повторных нарушениях (recidive)
Если IP продолжает атаковать после того, как бан закончился, можно настроить «рецидивный» джейл, который будет увеличивать время блокировки.
В jail.local добавьте.
text
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
filter = fail2ban
maxretry = 3
bantime = 86400 # 24 часа
findtime = 86400
Этот джейл отслеживает сам лог Fail2Ban и при повторных блокировках назначает более длительный бан.
7.2. Белый список (игнорирование IP)
Если нужно исключить определённые IP адреса из блокировки (например, доверенные серверы мониторинга или сети офисов), добавьте их в ignoreip в секции [DEFAULT].
text
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 10.10.10.0/24 192.168.1.10
7.3. Настройка уведомлений по электронной почте
Fail2Ban может отправлять письма при блокировке IP. Для этого в jail.local укажите.
text
[DEFAULT]
destemail = admin@example.com
sendername = Fail2Ban
action = %(action_mwl)s
Параметр action_mwl отправляет письмо с whois информацией о заблокированном IP и строками лога.
8. Управление Fail2Ban
Просмотр статуса всех джейлов.
text
sudo fail2ban-client status
Просмотр статуса конкретного джейла.
text
sudo fail2ban-client status nginx-http-auth
Ручная разблокировка IP.
text
sudo fail2ban-client unban 192.168.1.100
Перезагрузка конфигурации после изменений.
text
sudo systemctl restart fail2ban
Устранение распространённых проблем
ПроблемаВероятная причинаРешениеДжейл не блокирует IPФильтр не находит строки в логеПротестируйте фильтр с fail2ban-regex. Убедитесь, что logpath указывает на правильный файл и он существует.Блокировка не срабатывает на IPv6Фильтр не обрабатывает IPv6Убедитесь, что в регулярном выражении используется тег <HOST>, а не жёсткий паттерн для IPv4.Fail2ban не видит логи после ротацииНекорректная обработка ротацииВ параметре logpath можно указать несколько файлов через пробел или использовать wildcard: logpath = /var/log/nginx/*error.log.Ошибка Permission denied при чтении логаСлужба fail2ban не имеет прав на чтение файлаПроверьте права на файл лога. Пользователь fail2ban должен иметь доступ на чтение.При обновлении пакета сбрасываются настройкиИзменения внесены в jail.conf, а не в jail.localВсе пользовательские настройки должны храниться в jail.local. Он не перезаписывается при обновлении.Fail2ban блокирует легитимные запросыСлишком низкие значения maxretry или findtimeУвеличьте maxretry или уменьшите findtime. Проверьте, что в лог не попадают легитимные ошибки.
Мы разобрали настройку Fail2Ban для защиты не только SSH, но и таких сервисов, как Nginx, Postfix, Dovecot и vsftpd. Научились создавать собственные фильтры для любых приложений, используя регулярные выражения, а также познакомились с расширенными возможностями. Белыми списками, рецидивными блокировками и уведомлениями по почте.