Fail2ban — инструмент командной строки, который используют для предотвращения атак на серверы. Утилита отслеживает логи служб и автоматически блокирует IP-адреса при обнаружении подозрительных действий — например, если зафиксирует много неудачных попыток входа. Интегрируясь с системами фильтрации сетевого трафика (iptables, nftables, firewalld), fail2ban временно или на постоянной основе изолирует нежелательные адреса, обеспечивая защиту SSH-доступа, веб-серверов, почтовых служб и других критически важных сервисов.
Fail2ban — один из наиболее эффективных и популярных решений для усиления безопасности Linux-серверов. В статье мы подробно рассмотрим процесс установки и настройки утилиты для протокола SSH и веб-сервера nginx.
Требования
Для установки и настройки fail2ban нам понадобится:
- Сервер или виртуальная машина с ОС Linux. Минимальная конфигурация для тестирования: 1vCPU, 1 ГБ RAM, 20 ГБ SSD.
- Тестовый сервер (опционально, но рекомендуется). С его помощью мы будем имитировать атаки для проверки блокировок, чтобы наглядно показать работу fail2ban.
Установка fail2ban
Утилита доступна для установки на большинство дистрибутивов Linux, а также FreeBSD.
Все приведённые ниже команды необходимо выполнять от имени пользователя root или с использованием привилегий sudo.
Дистрибутивы Debian/Ubuntu
Команда для установки:
apt update && apt -y install fail2banДистрибутивы CentOS/RHEL/Fedora
Перед установкой пакета fail2ban на RPM-дистрибутивы необходимо подключить EPEL — репозиторий с дополнительных пакетов программного обеспечения.
Установите пакет epel-release:
dnf -y install epel-releaseВведите команду для установки fail2ban:
dnf -y install fail2banFreeBSD
Команда для установки пакета fail2ban:
pkg install fail2banНастройка fail2ban
Рассмотрим практические примеры настройки для защиты SSH-сервера и веб-сервера nginx. В качестве базовой системы в инструкции используется сервер с Ubuntu 24.04.
Настройка для SSH
Правило для SSH активировано по умолчанию. Базовая конфигурация предполагает блокировку IP-адреса на 10 минут после 5 неудачных попыток входа в течение 10 минут.
Чтобы убедиться, что правило для SSH работает, выведите список активных правил с помощью команды:
fail2ban-client status
Если в разделе Jail list есть запись sshd, значит, защита SSH работает. Для изменения параметров понадобится пользовательский конфигурационный файл:
- Создайте файл
jail.localдля хранения конфигурации fail2ban:
nano /etc/fail2ban/jail.local- Введите настройки. Например:
[sshd]
ignoreip = 127.0.0.1
bantime = 10s
findtime = 1d
maxretry = 2 Расшифровка параметров:
- ignoreip — IP-адреса или подсети, исключённые из блокировки (по умолчанию — localhost).
- maxretry — предельное число неудачных попыток до момента блокировки.
- findtime — временной интервал (в секундах), в течение которого отслеживаются неудачные попытки. Превышение лимита maxretry в установленный период времени ведёт к блокировке.
- bantime — срок блокировки адреса ( в секундах, минутах, часах, днях). Значение -1 означает постоянный бан.
В приведённом примере 2 неудачные попытки входа в течение 1 дня приведут к блокировке на 10 секунд.
Чтобы применить настройки, сохраните изменения в файле и выйдите из текстового редактора.
- Примените изменения, перезапустив службу:
systemctl restart fail2ban- Проверьте статус сервиса:
systemctl status fail2ban
Если в статусе отображается active (running), сервис перезапущен.
- Попробуйте подключиться к серверу по SSH с другого устройства и дважды ввести неверный пароль. После второй ошибки ваш IP должен быть заблокирован.
ssh alex@192.168.234.128Проверить список заблокированных IP можно с помощью команды:
fail2ban-client status sshd
В строке Banned IP list появятся заблокированные адреса (в данном случае 192.168.234.1). В нашей конфигурации блокировка снимется автоматически через 10 секунд. Однако всегда можно разблокировать IP-адрес вручную с помощью команды:
fail2ban-client set sshd unbanip 192.168.234.128Где:
- sshd — название службы (jail), в рамках которой была применена блокировка. Это имя соответствует заголовку в квадратных скобках [sshd] внутри конфигурационного файла.
- 192.168.234.128 — конкретный IP-адрес, который необходимо исключить из чёрного списка и возобновить для него доступ.
Настройка для nginx
Помимо готовых фильтров, входящих в комплект Fail2Ban, можно создавать собственные. В качестве примера настроим обнаружение и блокировку IP-адресов, генерирующих множество ошибок 404.
Настроим fail2ban для веб-сервера nginx.
- Создайте пользовательский фильтр.
nano /etc/fail2ban/filter.d/nginx-404.confСодержимое файла:
[Definition]
failregex = ^<HOST> - .* "(GET|POST|HEAD) .*HTTP/.*" 404 .*
ignoreregex =В данной конфигурации параметр failregex ищет строки в файле access.log с кодом 404. <HOST> — это значение для IP-адресов: fail2ban будет автоматически подставлять адреса, которые попадут под критерий поиска.
- Создайте правило блокировки:
nano /etc/fail2ban/jail.d/nginx-404.confПример настроек:
[nginx-404]
enabled = true
port = http, https
filter = nginx-404
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 60
bantime = 1800
backend = polling
action = iptables-multiport[name=nginx-404, port="http,https", protocol=tcp]Описание параметров:
- [nginx-404] — уникальный идентификатор правила (jail), который используется для управления и мониторинга.
- enabled — флаг активации: значение true включает правило, false — отключает его без удаления файла.
- port = http, https — указывает сетевые порты, доступ к которым будет ограничен для заблокированных адресов. В данном случае это стандартные порты для HTTP (80) и HTTPS (443).
- filter = nginx-404 — ссылка на файл с регулярными выражениями (
/etc/fail2ban/filter.d/nginx-404.conf). Этот фильтр анализирует логи, выявляя шаблоны, соответствующие подозрительной активности (например, повторяющиеся запросы к несуществующим страницам). - logpath = /var/log/nginx/access.log — путь к файлу лога, в котором будет происходить поиск подозрительной активности. В нашем примере fail2Ban будет искать в нём строки с кодом 404.
- maxretry — максимальное количество неудачных запросов (в нашем случае — запросов с кодом 404) перед блокировкой IP-адреса.
- findtime — период в секундах, в течение которого происходит подсчёт неудачных запросов. В нашей конфигурации мы задали период в 60 секунд.
- bantime — срок блокировки IP-адреса в секундах. По его окончании IP автоматически разблокируется.
- backend = polling — способ мониторинга лог-файла. При методе polling, fail2Ban периодически опрашивает файл лога.
- action = nftables-multiport[name=nginx-404, port="http,https", protocol=tcp] — действие при блокировке IP-адреса:
- nftables-multiport — записывает правило nftables;
- name=nginx-404 — имя цепочки в nftables;
- port="http,https" — блокирует только указанные порты (80 и 443);
- protocol=tcp — считает подозрительным только TCP-трафик.
- Перезапустите сервис fail2ban:
systemctl restart fail2ban- Убедитесь, что новое правило nginx-404 появилось в списке:
fail2ban-client status
- С тестового сервера выполните серию запросов к несуществующим страницам:
for i in {1..30}; do curl -I http://109.23.194.243/test1.html-$i; doneЭто цикл в bash, который последовательно выполняет 30 HTTP-запросов к несуществующим файлам с именами типа test1.html-1, test1.html-2 и т.д. до test1.html-30.
- Вернитесь на сервер с установленным fail2ban и проверьте список заблокированных IP-адресов:
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-404.conf
IP-адрес сервера, с которого мы выполняли команду curl, был заблокирован.
Настройка логов
Детальное логирование необходимо для аудита безопасности и отладки. Основные параметры настраиваются в файле /etc/fail2ban/fail2ban.conf
Параметры для работы с лог-файлами:
- loglevel — задает уровни детализации логов. Поддерживаются уровни CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG. CRITICAL фиксирует только критические ошибки, которые влияют на работу утилиты. ERROR — ошибки выполнения, на которые нужно обратить внимание. WARNING — потенциальные проблемы. NOTICE — важные операционные события, такие как блокировки IP. INFO — подробная информация о работе системы; DEBUG — максимально детальные данные для отладки.
- logtarget — путь к файлу логов (по умолчанию используется
/var/log/fail2ban.log). - logformat — формат записи логов. Поддерживает опции, которые позволяют отображать дату и время — %(asctime)s, уровень логирования — %(levelname)s, текст сообщения —%(message)s, имя модуля — %(module)s.
Параметры для детального логирования:
loglevel = INFO
logtarget = /var/log/fail2ban.log
logformat = %(asctime)s [%(levelname)s] %(message)sПосле правок перезапустите службу:
systemctl restart fail2banМониторинг логов в режиме реального времени
Отслеживание логов в реальном времени:
tail -f /var/log/fail2ban.logПросмотр последних 100 лог-записей:
tail -n 100 /var/log/fail2ban.logДля фильтрации записей по блокировки IP-адресов (например, если нужно найти все записи с блокировкой (Ban) или разблокировкой (Unban) используйте команду:
grep -E "Ban|Unban" /var/log/fail2ban.logЗаключение
Fail2Ban — это эффективный и гибкий инструмент для защиты серверов от автоматизированных атак и подозрительной активности.
Основные преимущества fail2Ban:
- Простота использования. Наличие готовых конфигурационных шаблонов для популярных служб (SSH, Nginx, Apache, WordPress) позволяет быстро организовать базовую защиту.
- Гибкость настройки. Возможность тонкой настройки всех параметров блокировки и создания собственных фильтров под специфичные угрозы.
- Минимальные накладные расходы: Программа работает в фоновом режиме с минимальным потреблением ресурсов, не влияя на производительность сервера.
Настройка защиты SSH является обязательным минимумом для любого сервера, доступного извне. Однако потенциал Fail2Ban гораздо шире: его можно адаптировать для защиты баз данных, веб-приложений, панелей управления и многих других сервисов. Полное описание параметров конфигурации fail2ban доступно в документации по ссылке.