Добавить в корзинуПозвонить
Найти в Дзене

Настройка Fail2Ban для нестандартных сервисов (не только SSH)

Проблема Большинство администраторов знакомят с Fail2Ban через SSH. Он эффективно блокирует IP адреса, с которых идёт перебор паролей. Однако современная инфраструктура состоит из десятков сервисов, каждый из которых потенциально уязвим для брутфорса. Почтовые серверы (Postfix, Dovecot) страдают от атак на SASL аутентификацию. Веб-серверы (Nginx, Apache) от сканирования уязвимостей и перебора паролей к админ панелям. FTP серверы (vsftpd) от подбора учётных данных к файловым хранилищам. Ограничиваясь защитой только SSH, администратор оставляет эти сервисы беззащитными. Решение Fail2Ban это фреймворк для предотвращения вторжений. Он анализирует логи сервисов, находит подозрительные повторяющиеся события (например, неудачные попытки аутентификации) и временно блокирует IP адрес нарушителя на уровне межсетевого экрана. Он работает с iptables, nftables, firewalld и другими бэкендами. В этой статье мы выполним следующие действия. Установим и настроим Fail2Ban на сервере с Ubuntu 22.04.
Наст

Проблема

Большинство администраторов знакомят с 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. Научились создавать собственные фильтры для любых приложений, используя регулярные выражения, а также познакомились с расширенными возможностями. Белыми списками, рецидивными блокировками и уведомлениями по почте.

Настройка Fail2Ban для нестандартных сервисов (не только SSH) | Андрей Коровин | Сисадмин | IT-инженер