Fail2ban представляет собой систему реагирования на подозрительные действия, анализирующую логи сервера. Многие ошибочно полагают, что этот инструмент создан исключительно для защиты от брутфорс-атак, но его возможности гораздо шире. Программа способна блокировать любых злоумышленников, которые злоупотребляют доступностью сервера - будь то многочисленные запросы к ресурсу DDOS или попытки подобрать пароли к почтовым ящикам.

В интернете часто встречается упрощенное понимание этого софта. На самом деле, это полноценная система обнаружения вторжений на уровне приложений, которая гибко настраивается под любые сценарии.

Установка и запуск

Процесс инсталляции различается в зависимости от дистрибутива Linux. Я покажу два основных способа - из официальных репозиториев и с помощью deb-пакета с GitHub.

Установка из репозитория

Для систем семейства RPM (Rocky Linux, CentOS, РЕД ОС) сначала подключаем репозиторий EPEL:

yum install epel-release

После этого устанавливаем сам пакет:

yum install fail2ban

На Debian/Ubuntu и их производных процесс выглядит проще:

apt update
apt install fail2ban

После установки обязательно активируем автозапуск и стартуем службу:

systemctl enable fail2ban
systemctl start fail2ban

Установка из deb-пакета

Разработчики Fail2ban на GitHub рядом с исходным кодом выкладывают готовые deb-пакеты. Это удобно, когда в репозитории вашего дистрибутива устаревшая версия или пакет отсутствует.

Устанавливаем curl для загрузки:

apt update
apt install curl

Заходим на страницу релизов проекта, копируем ссылку на нужную версию для Debian. Загружаем файл:

curl -sLO https://github.com/fail2ban/fail2ban/releases/download/1.1.0/fail2ban_1.1.0-1.upstream1_all.deb

Монтируем пакет в систему:

apt install ./fail2ban_*_all.deb

Запускаем сервис стандартными командами, которые я привел выше.

Базовая настройка

Конфигурация Fail2ban не зависит от дистрибутива - принципы везде одинаковы. Основной файл настроек лежит по пути /etc/fail2ban/jail.conf, но трогать его не рекомендуется. Для пользовательских изменений создаем файлы в каталоге /etc/fail2ban/jail.d.

Создаем первый файл с базовыми параметрами:

vi /etc/fail2ban/jail.d/default.conf

Для CentOS/Red Hat содержимое будет таким:

[DEFAULT]
maxretry = 4
findtime = 480
bantime = 720
action = firewallcmd-ipset
ignoreip = 127.0.0.1/8

Для Ubuntu/Debian используем:

[DEFAULT]
maxretry = 4
findtime = 480
bantime = 720
action = iptables
ignoreip = 127.0.0.1/8

Разберем параметры подробнее. maxretry определяет количество неудачных попыток до блокировки. findtime - промежуток времени в секундах, за который эти попытки учитываются. Если за 8 минут (480 секунд) система зафиксирует 5 срабатываний (maxretry=4, то есть 4+1), IP попадет в бан на 12 минут (720 секунд). action указывает, какой именно механизм будет использован для блокировки. ignoreip содержит адреса, которые никогда не будут забанены.

Настройка правил для конкретных сервисов

Каждый защищаемый сервис требует отдельного конфигурационного файла в каталоге /etc/fail2ban/jail.d/. Я покажу создание правила для SSH:

vi /etc/fail2ban/jail.d/ssh.conf
[ssh]
enabled = true
port = ssh
filter = sshd
action = iptables[name=sshd, port=ssh, protocol=tcp]
logpath = /var/log/auth.log
maxretry = 10
findtime = 600

Параметр enabled включает или отключает правило. port указывает целевой порт сервиса - можно использовать как имя (ssh), так и номер (22). filter ссылается на файл из каталога /etc/fail2ban/filter.d (без расширения .conf), где описаны регулярные выражения для поиска подозрительной активности. action определяет команды блокировки. В квадратных скобках я задал имя правила, порт и протокол. logpath указывает путь к лог-файлу для анализа.

Обратите внимание: я переопределил глобальные параметры maxretry и findtime именно для этого правила. После создания конфига перезапускаем сервис:

systemctl restart fail2ban

Белые списки

Чтобы администратор или важные серверы случайно не отправились в бан, настраиваем исключения через параметр ignoreip. Его можно задать как глобально, так и для конкретного правила.

В глобальном файле /etc/fail2ban/jail.d/default.conf добавляем:

[DEFAULT]
ignoreip = 192.168.0.0/24 95.95.95.95

Теперь вся подсеть 192.168.0.0/24 и отдельный адрес 95.95.95.95 не подпадают под фильтры.

Для SSH-правила можно создать отдельное исключение в /etc/fail2ban/jail.d/ssh.conf:

[ssh]
ignoreip = 192.168.1.22

IP 192.168.1.22 никогда не будет заблокирован этим конкретным правилом. После изменений обязательно перезапускаем fail2ban. Важный момент: добавление адреса в белый список не снимает уже наложенную блокировку - такие IP нужно разблокировать вручную.

Действия и фильтры

ФАЕРВОЛЛ

Механизмы блокировки

Файлы действий хранятся в /etc/fail2ban/action.d. Они определяют, как именно будет происходить блокировка. Чаще всего используются:

  • iptables - классическое создание правил в netfilter. Подходит для большинства дистрибутивов.
  • iptables-multiport - расширение с поддержкой диапазонов портов. Удобно для веб-серверов, где нужно блокировать сразу http и https.
  • iptables-ipset - использует механизм ipset для более эффективного управления большими списками блокировок.
  • iptables-allports - блокирует все порты для нарушителя. Жестко, но эффективно.
  • firewallcmd-new - создание правил через firewall-cmd в CentOS/RHEL 7+.
  • firewallcmd-ipset - комбинация firewalld и ipset.
  • firewallcmd-rich-rules - создание rich-правил в firewalld для тонкой настройки.

Фильтры поиска

Фильтры в /etc/fail2ban/filter.d содержат регулярные выражения для поиска подозрительных записей в логах. Каждый фильтр - это набор шаблонов, по которым fail2ban определяет, что действие требует блокировки.

Я часто использую готовые фильтры как основу для своих. Например, стандартный фильтр для SSH ищет строки с "Failed password" или "authentication failure". При необходимости можно создать свой фильтр, взяв за образец существующий.

Практические примеры настройки

Защита SSH

Для CentOS 7 с firewalld создаем /etc/fail2ban/jail.d/ssh.conf:

[ssh]
enabled = true
port = ssh
filter = sshd
action = firewallcmd-new[name=sshd]
logpath = /var/log/secure

На CentOS 8/9 логи часто пишутся через systemd, поэтому добавляем параметр backend:

[ssh]
enabled = true
port = ssh
filter = sshd
action = firewallcmd-new[name=sshd]
backend = systemd

Для Ubuntu с iptables:

[ssh]
enabled = true
port = ssh
filter = sshd
action = iptables[name=sshd]
logpath = /var/log/auth.log

После создания файлов перезапускаем fail2ban.

Asterisk

Для IP-телефонии защита особенно важна. Настраиваем правило:

[asterisk]
enabled = true
filter = asterisk
action = iptables-allports[name=asterisk, protocol=all]
logpath = /var/log/asterisk/messages

Если используете firewalld, меняем только action:

action = firewallcmd-new[name=asterisk, protocol=all]

Веб-сервер NGINX

Базовая защита HTTP-авторизации:

[nginx]
enabled = true
port = http,https
filter = nginx-http-auth
action = iptables-multiport[name=nginx, port="http,https", protocol=tcp]
logpath = /var/log/nginx/error.log

Защита от DDoS в NGINX

Это более сложный сценарий. Сначала настраиваем сам NGINX. В /etc/nginx/nginx.conf в секцию http добавляем:

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=25r/s;
}

Для конкретного домена в секции server/location прописываем:

limit_req zone=one burst=50 nodelay;

Проверяем конфигурацию и перезагружаем NGINX. Теперь при превышении лимита в логах появятся записи вида:

2020/11/16 19:11:08 [error] 1330844#1330844: *16640836 limiting requests, excess: 10.520 by zone "one", client: xxx.xxx.xxx.xxx

Создаем фильтр для fail2ban, если его нет, в /etc/fail2ban/filter.d/nginx-limit-req.conf:

[Definition]
ngx_limit_req_zones = [^"]+
failregex = ^\s*\[error\] \d+#\d+: \*\d+ limiting requests, excess: [\d\.]+ by zone "(?:%(ngx_limit_req_zones)s)", client: <HOST>
ignoreregex =

Теперь само правило в /etc/fail2ban/jail.d/nginx-ddos.conf:

[nginx-ddos]
enabled = true
port = http,https
filter = nginx-limit-req
action = iptables-multiport[name=nginxddos, port="http,https", protocol=tcp]
logpath = /var/log/nginx/error.log

Перезапускаем fail2ban.

Управление заблокированными адресами

Просмотр текущих блокировок

Полный список правил и их статус:

fail2ban-client status

Детали по конкретному правилу:

fail2ban-client status ssh

Увидим примерно такое:

- action
   |- Currently banned: 2
   |  `- IP list:       31.207.47.55 10.212.245.29

Если заблокированных много, команда выше покажет не все. Для полного списка используем:

fail2ban-client banned

Можно посмотреть правила напрямую в фаерволе. Для iptables:

iptables -L -n --line

Для firewalld:

firewall-cmd --direct --get-all-rules

Разблокировка адресов

Снимаем блокировку через fail2ban:

fail2ban-client set ssh unbanip 31.207.47.55

Через iptables:

iptables -D fail2ban-ssh -s 10.212.245.29

Для firewalld:

firewall-cmd --direct --permanent --remove-rule ipv4 filter f2b-sshd 0 -s 188.134.7.221
firewall-cmd --reload

Типичные проблемы

Ошибка "Failed during configuration have not found any log file for sshd jail"

На Ubuntu 22.04 и новее после установки fail2ban служба может не запускаться с этой ошибкой. Проблема в том, что логи SSH теперь пишутся не в классический /var/log/auth.log, а в журнал systemd.

Решение - изменить backend для SSH. Открываем файл:

vi /etc/fail2ban/jail.d/defaults-debian.conf

Находим секцию [sshd] и добавляем:

backend = systemd

Запускаем сервис:

systemctl start fail2ban

Сравнение механизмов блокировки

Механизм Тип фаервола Поддержка диапазонов портов Работа с ipset Основное применение
iptables Netfilter Нет Нет Базовая блокировка
iptables-multiport Netfilter Да Нет Веб-серверы (http, https)
iptables-ipset Netfilter Да Да Большие списки блокировки
iptables-allports Netfilter Нет (все порты) Нет Жесткая блокировка нарушителей
firewallcmd-new Firewalld Нет Нет CentOS/RHEL 7+
firewallcmd-ipset Firewalld Да Да Современные дистрибутивы с firewalld

Альтернативные решения

Честно говоря, достойных аналогов Fail2ban на Linux практически нет. Есть несколько проектов, но они либо сырые, либо слабо документированы.

Tallow - интересная задумка, но до продакшена еще далеко. Документации почти нет, сообщество маленькое.

Для Windows ситуация лучше. RDPDefender специализируется на защите RDP, работает неплохо. IPBan - мощный инструмент с управлением из командной строки. ts_block тоже достоин внимания, хотя интерфейс оставляет желать лучшего.

На мой взгляд, для Linux-серверов Fail2ban остается безальтернативным стандартом. За годы существования он доказал свою надежность, а гибкость настройки позволяет адаптировать его под любые задачи - от защиты почтового сервера до отражения DDoS-атак на веб-приложения.

Еще по теме

Что будем искать? Например,Идея