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







