Введение

Fail2Ban — это мощный инструмент защиты серверов от брутфорс-атак и автоматизированных сканирований. Написанный на Python, он работает как служба мониторинга логов, которая анализирует записи различных сервисов в реальном времени и автоматически блокирует IP-адреса, демонстрирующие подозрительное или вредоносное поведение.

В современном интернете серверы подвергаются постоянным атакам — тысячи попыток подбора паролей SSH, сканирования портов, эксплуатации уязвимостей веб-приложений происходят ежедневно. Fail2Ban создает динамический защитный барьер, автоматически реагируя на эти угрозы без необходимости постоянного ручного вмешательства администратора.

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

Архитектура и принцип работы Fail2Ban

Прежде чем приступить к установке, важно понять, как работает Fail2Ban.

Основные компоненты

Фильтры (Filters) — регулярные выражения, которые определяют подозрительные записи в логах. Каждый фильтр описывает паттерны для конкретного типа атак или ошибок.

Действия (Actions) — скрипты, определяющие, что делать при обнаружении атаки. Обычно это добавление правил в iptables или nftables для блокировки IP, но могут быть и другие действия: отправка email, запись в лог, уведомления в мессенджеры.

Тюрьмы (Jails) — конфигурации, объединяющие фильтры, действия и параметры мониторинга для конкретного сервиса. Например, jail «sshd» отвечает за защиту SSH.

Жизненный цикл блокировки

  1. Fail2Ban непрерывно читает указанные лог-файлы
  2. Применяет регулярные выражения фильтров к новым записям
  3. Подсчитывает количество совпадений для каждого IP в заданном временном окне
  4. При превышении порога срабатываний выполняет action (блокирует IP)
  5. По истечении времени блокировки автоматически снимает бан
  6. Ведет собственную статистику и логи

Установка Fail2Ban

Подготовка системы

Обновите систему до актуального состояния:

sudo apt update
sudo apt upgrade -y

Убедитесь, что установлен и работает iptables или nftables:

sudo iptables -L -n

Если вы используете UFW, Fail2Ban интегрируется с ним автоматически.

Установка пакета

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

sudo apt install fail2ban -y

Проверьте версию и статус:

fail2ban-client version
sudo systemctl status fail2ban

Включите автозапуск:

sudo systemctl enable fail2ban

Структура каталогов

После установки Fail2Ban создает следующую структуру:

  • /etc/fail2ban/ — основной каталог конфигурации
  • /etc/fail2ban/fail2ban.conf — глобальные настройки самого Fail2Ban
  • /etc/fail2ban/jail.conf — конфигурация тюрем (НЕ редактировать!)
  • /etc/fail2ban/jail.d/ — каталог для собственных конфигураций jail
  • /etc/fail2ban/filter.d/ — каталог с фильтрами
  • /etc/fail2ban/action.d/ — каталог с действиями
  • /var/log/fail2ban.log — лог работы Fail2Ban

Базовая конфигурация

Создание локального конфигурационного файла

Важно: никогда не редактируйте файлы jail.conf и fail2ban.conf напрямую! При обновлении пакета они будут перезаписаны. Вместо этого создайте локальные версии:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Либо создайте файл в каталоге jail.d:

sudo nano /etc/fail2ban/jail.d/custom.conf

Понимание базовых параметров

Откройте конфигурационный файл:

sudo nano /etc/fail2ban/jail.local

Рассмотрим ключевые параметры секции [DEFAULT]:

[DEFAULT]
# Время блокировки в секундах (по умолчанию 10 минут)
bantime = 10m

# Временное окно для подсчета нарушений (по умолчанию 10 минут)
findtime = 10m

# Количество нарушений до блокировки
maxretry = 5

# Игнорируемые IP (белый список)
ignoreip = 127.0.0.1/8 ::1

# Протокол бана (tcp, udp, icmp, all)
protocol = tcp

# Цепочка iptables для правил
chain = INPUT

# Порты (можно указать несколько через запятую)
port = 0:65535

# Уровень логирования (CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG)
loglevel = INFO

# Email для уведомлений
destemail = admin@example.com
sender = fail2ban@example.com

# Действие при бане (без уведомлений)
action = %(action_)s

# Действие с email-уведомлением
# action = %(action_mw)s

# Действие с email и логами
# action = %(action_mwl)s

Настройка времени блокировки

Можно использовать различные форматы времени:

bantime = 1h      # 1 час
bantime = 1d      # 1 день
bantime = 1w      # 1 неделя
bantime = -1      # Постоянная блокировка

Для прогрессивного увеличения времени блокировки:

bantime.increment = true
bantime.factor = 1
bantime.formula = ban.Time * (1<<(ban.Count if ban.Count<20 else 20)) * banFactor
bantime.maxtime = 5w

Эта формула экспоненциально увеличивает время блокировки при повторных нарушениях.

Белый список IP-адресов

Добавьте доверенные IP в ignoreip:

ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 203.0.113.42

Внимание: используйте эту опцию осторожно. Даже доверенные IP могут быть скомпрометированы.

Настройка защиты SSH

SSH — наиболее атакуемый сервис на серверах. Правильная настройка защиты SSH критически важна.

Базовая конфигурация SSH jail

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h
findtime = 10m

Если вы используете нестандартный порт SSH:

[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h
findtime = 10m

Расширенная защита SSH

Создайте отдельный jail для агрессивной защиты:

[sshd-aggressive]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 2
bantime = 1d
findtime = 5m
# Блокировать за попытки входа с несуществующими пользователями
banaction = iptables-multiport

Защита от DDoS через SSH

Создайте jail для защиты от большого количества соединений:

[sshd-ddos]
enabled = true
port = ssh
filter = sshd-ddos
logpath = /var/log/auth.log
maxretry = 6
findtime = 60
bantime = 600

Создайте соответствующий фильтр:

sudo nano /etc/fail2ban/filter.d/sshd-ddos.conf
[Definition]
failregex = ^.*sshd\[.*\]: Connection from <HOST> port.*$
ignoreregex =

Защита веб-сервера Nginx

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

Защита от HTTP-атак

[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 1h
findtime = 10m

[nginx-badbots]

enabled = true port = http,https filter = nginx-badbots logpath = /var/log/nginx/access.log maxretry = 2 bantime = 1d findtime = 1h

[nginx-noscript]

enabled = true port = http,https filter = nginx-noscript logpath = /var/log/nginx/access.log maxretry = 6 bantime = 1h findtime = 2m

[nginx-noproxy]

enabled = true port = http,https filter = nginx-noproxy logpath = /var/log/nginx/access.log maxretry = 2 bantime = 1d findtime = 2m

Защита от сканирования уязвимостей

Создайте фильтр для блокировки сканеров:

sudo nano /etc/fail2ban/filter.d/nginx-scanner.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD).*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi).*".*$
            ^<HOST> -.*"(GET|POST).*(/admin|/phpmyadmin|/wp-admin|/administrator).*".*$
            ^<HOST> -.*"(GET|POST).*(select|union|insert|concat|declare|script).*".*$
ignoreregex =

Активируйте jail:

[nginx-scanner]
enabled = true
port = http,https
filter = nginx-scanner
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 1w
findtime = 10m

Защита WordPress

Специфическая защита для WordPress-сайтов:

sudo nano /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
            ^<HOST> .* "POST /xmlrpc.php
ignoreregex =
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/nginx/access.log
maxretry = 3
bantime = 2h
findtime = 5m

Защита других сервисов

Postfix (почтовый сервер)

[postfix]
enabled = true
port = smtp,465,submission
filter = postfix
logpath = /var/log/mail.log
maxretry = 3
bantime = 1h

[postfix-sasl]

enabled = true port = smtp,465,submission,imap,imaps,pop3,pop3s filter = postfix[mode=auth] logpath = /var/log/mail.log maxretry = 3 bantime = 1h

Dovecot (IMAP/POP3)

[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps,submission,465,sieve
filter = dovecot
logpath = /var/log/mail.log
maxretry = 3
bantime = 1h

MySQL/MariaDB

[mysqld-auth]
enabled = true
port = 3306
filter = mysqld-auth
logpath = /var/log/mysql/error.log
maxretry = 3
bantime = 1h

Apache

[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 3
bantime = 1h

[apache-badbots]

enabled = true port = http,https filter = apache-badbots logpath = /var/log/apache2/access.log maxretry = 2 bantime = 1d

FTP (vsftpd)

[vsftpd]
enabled = true
port = ftp,ftp-data,ftps,ftps-data
filter = vsftpd
logpath = /var/log/vsftpd.log
maxretry = 3
bantime = 1h

Создание собственных фильтров

Для защиты специфических приложений часто требуется создание собственных фильтров.

Анализ лог-файлов

Сначала изучите формат логов вашего приложения:

tail -f /var/log/application.log

Найдите записи, указывающие на неудачные попытки аутентификации или атаки.

Создание фильтра

Создайте новый файл фильтра:

sudo nano /etc/fail2ban/filter.d/custom-app.conf

Базовая структура:

[INCLUDES]
before = common.conf

[Definition]
# Основное регулярное выражение
failregex = ^.*Failed login from <HOST>.*$
            ^.*Authentication failed for <HOST>.*$
            ^.*Invalid user .* from <HOST>.*$

# Исключения (необязательно)
ignoreregex =

# Префильтр для оптимизации (необязательно)
prefregex = ^.*(?:authentication|login|failed).*$

[Init]
# Максимальное количество строк для проверки
maxlines = 1

# Параметры для datepattern
datepattern = {^LN-BEG}%%Y-%%m-%%d %%H:%%M:%%S

Тестирование фильтра

Используйте утилиту fail2ban-regex для тестирования:

sudo fail2ban-regex /var/log/application.log /etc/fail2ban/filter.d/custom-app.conf

Эта команда покажет, сколько строк соответствует вашему регулярному выражению.

Пример тестирования на конкретной строке:

sudo fail2ban-regex "2024-03-15 10:30:45 Failed login from 192.168.1.100" /etc/fail2ban/filter.d/custom-app.conf

Регулярные выражения для Fail2Ban

Fail2Ban использует специальные теги:

  • <HOST> — автоматически заменяется на паттерн IPv4/IPv6 адреса
  • <ADDR> — только IPv4
  • <ADDR6> — только IPv6

Пример сложного фильтра с несколькими паттернами:

[Definition]
failregex = ^%(__prefix_line)sAuthentication failure for .* from <HOST>
            ^%(__prefix_line)sUser .* from <HOST> not allowed
            ^%(__prefix_line)sInvalid password for .* from <HOST>
            ^%(__prefix_line)sConnection denied from <HOST>

ignoreregex = ^%(__prefix_line)svalid user

Переменная __prefix_line определена в common.conf и содержит стандартный префикс syslog.

Создание собственных действий (Actions)

Actions определяют, что происходит при блокировке IP.

Структура action

sudo nano /etc/fail2ban/action.d/custom-action.conf
[Definition]
# Команда при блокировке
actionstart = # Команда при запуске Fail2Ban
actionstop = # Команда при остановке Fail2Ban
actioncheck = # Проверка возможности выполнения действия
actionban = # Команда блокировки IP
actionunban = # Команда разблокировки IP

[Init]
# Инициализация переменных
name = custom
protocol = tcp
chain = INPUT

Пример: отправка в Telegram

Создайте action для уведомлений в Telegram:

sudo nano /etc/fail2ban/action.d/telegram-notify.conf
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = curl -s -X POST https://api.telegram.org/bot<token>/sendMessage -d chat_id=<chat_id> -d text="[Fail2Ban] <name>: Blocked IP <ip> after <failures> attempts"
actionunban = curl -s -X POST https://api.telegram.org/bot<token>/sendMessage -d chat_id=<chat_id> -d text="[Fail2Ban] <name>: Unbanned IP <ip>"

[Init]
token = YOUR_BOT_TOKEN
chat_id = YOUR_CHAT_ID

Использование в jail:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h
action = iptables-multiport[name=SSH, port="ssh", protocol=tcp]
         telegram-notify[name=SSH]

Пример: блокировка на уровне nginx

sudo nano /etc/fail2ban/action.d/nginx-block.conf
[Definition]
actionstart = 
actionstop = rm -f /etc/nginx/conf.d/fail2ban-*.conf
              systemctl reload nginx
actioncheck = 
actionban = printf "%%s\n" "deny <ip>;" >> /etc/nginx/conf.d/fail2ban-<name>.conf
            systemctl reload nginx
actionunban = sed -i '/deny <ip>;/d' /etc/nginx/conf.d/fail2ban-<name>.conf
              systemctl reload nginx

Пример: запись в базу данных

sudo nano /etc/fail2ban/action.d/db-log.conf
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = mysql -u fail2ban -p'password' fail2ban_db -e "INSERT INTO bans (ip, jail, ban_time) VALUES ('<ip>', '<name>', NOW())"
actionunban = mysql -u fail2ban -p'password' fail2ban_db -e "UPDATE bans SET unban_time = NOW() WHERE ip = '<ip>' AND jail = '<name>' AND unban_time IS NULL"

Продвинутая конфигурация

Использование nftables вместо iptables

Если ваша система использует nftables:

[DEFAULT]
banaction = nftables-multiport
banaction_allports = nftables-allports

Геоблокировка

Блокировка IP по географическому расположению:

sudo apt install geoip-bin geoip-database

Создайте фильтр с геоблокировкой:

sudo nano /etc/fail2ban/filter.d/geoip.conf
[Definition]
failregex = ^.*<HOST>.*$
ignoreregex =

[Init]
# Блокировать IP из определенных стран
geoiplist = CN RU KP

Координация между несколькими серверами

Для синхронизации баз заблокированных IP между серверами используйте централизованное хранилище.

Создайте скрипт синхронизации:

sudo nano /usr/local/bin/fail2ban-sync.sh
#!/bin/bash
JAIL="sshd"
REMOTE_SERVER="central.example.com"

# Получить список заблокированных IP
BANNED_IPS=$(fail2ban-client get $JAIL banip)

# Отправить на центральный сервер
for IP in $BANNED_IPS; do
    ssh root@$REMOTE_SERVER "fail2ban-client set $JAIL banip $IP"
done

Добавьте в cron для периодического запуска:

*/5 * * * * /usr/local/bin/fail2ban-sync.sh

Динамическое изменение параметров

Параметры можно менять без перезагрузки:

# Изменить время блокировки
sudo fail2ban-client set sshd bantime 7200

# Изменить максимальное количество попыток
sudo fail2ban-client set sshd maxretry 5

# Изменить время окна наблюдения
sudo fail2ban-client set sshd findtime 600

Управление Fail2Ban

Основные команды

Проверка статуса:

sudo systemctl status fail2ban
sudo fail2ban-client status

Список активных jail:

sudo fail2ban-client status

Статус конкретного jail:

sudo fail2ban-client status sshd

Просмотр заблокированных IP:

sudo fail2ban-client get sshd banip

Ручное управление блокировками

Заблокировать IP вручную:

sudo fail2ban-client set sshd banip 192.168.1.100

Разблокировать IP:

sudo fail2ban-client set sshd unbanip 192.168.1.100

Разблокировать все IP в jail:

sudo fail2ban-client unban --all

Перезагрузка конфигурации

После изменения конфигурации:

# Перезагрузить все jail
sudo fail2ban-client reload

# Перезагрузить конкретный jail
sudo fail2ban-client reload sshd

# Полная перезагрузка службы
sudo systemctl restart fail2ban

Тестирование конфигурации

Проверка синтаксиса:

sudo fail2ban-client -t

Эта команда проверит все конфигурационные файлы и сообщит об ошибках.

Мониторинг и анализ

Анализ логов Fail2Ban

Основной лог:

sudo tail -f /var/log/fail2ban.log

Поиск блокировок:

sudo grep "Ban" /var/log/fail2ban.log

Поиск разблокировок:

sudo grep "Unban" /var/log/fail2ban.log

Статистика по jail:

sudo grep "sshd" /var/log/fail2ban.log | grep "Ban" | wc -l

Создание скрипта отчетности

sudo nano /usr/local/bin/fail2ban-report.sh
#!/bin/bash

echo "=== Fail2Ban Daily Report ==="
echo "Date: $(date)"
echo ""

for JAIL in $(fail2ban-client status | grep "Jail list" | sed 's/.*://'); do
    echo "--- $JAIL ---"
    fail2ban-client status $JAIL | grep "Currently banned"
    echo ""
done

echo "=== Recent Bans ==="
grep "$(date +%Y-%m-%d)" /var/log/fail2ban.log | grep "Ban" | tail -20

Сделайте исполняемым и добавьте в cron:

sudo chmod +x /usr/local/bin/fail2ban-report.sh
# Ежедневный отчет в 8:00
0 8 * * * /usr/local/bin/fail2ban-report.sh | mail -s "Fail2Ban Daily Report" admin@example.com

Визуализация с помощью fail2ban-dashboard

Установите веб-интерфейс для мониторинга:

cd /opt
sudo git clone https://github.com/fail2ban/fail2ban-dashboard.git
cd fail2ban-dashboard
sudo pip3 install -r requirements.txt

Настройте и запустите:

sudo python3 app.py

Интеграция с Prometheus

Создайте экспортер метрик:

sudo nano /usr/local/bin/fail2ban-exporter.sh
#!/bin/bash

cat << EOF > /var/lib/prometheus/node-exporter/fail2ban.prom
# HELP fail2ban_banned_ips Number of banned IPs
# TYPE fail2ban_banned_ips gauge
EOF

for JAIL in $(fail2ban-client status | grep "Jail list" | sed 's/.*://'); do
    COUNT=$(fail2ban-client status $JAIL | grep "Currently banned" | awk '{print $4}')
    echo "fail2ban_banned_ips{jail=\"$JAIL\"} $COUNT" >> /var/lib/prometheus/node-exporter/fail2ban.prom
done

Оптимизация производительности

Уменьшение нагрузки на систему

Для серверов с большим количеством логов оптимизируйте проверку:

[DEFAULT]
# Использовать systemd journal вместо файлов (если доступно)
backend = systemd

# Уменьшить интервал опроса
logtimezone = UTC

Использование systemd backend

Для современных систем с systemd:

[sshd]
enabled = true
filter = sshd
backend = systemd
journalmatch = _SYSTEMD_UNIT=sshd.service
maxretry = 3
bantime = 1h

Это эффективнее чтения файлов логов.

Оптимизация регулярных выражений

Используйте префильтры для предварительной фильтрации:

[Definition]
# Сначала быстрая проверка на наличие ключевых слов
prefregex = ^.*(failed|invalid|error).*$

# Затем более сложная проверка только для подходящих строк
failregex = ^.*Failed password for .* from <HOST>.*$

Кэширование DNS-запросов

Если используете hostname вместо IP в ignoreip:

sudo apt install nscd
sudo systemctl enable --now nscd

Решение проблем и отладка

Fail2Ban не блокирует IP

Проверьте последовательно:

  1. Jail активен:
sudo fail2ban-client status sshd
  1. Логи доступны и читаются:
sudo ls -la /var/log/auth.log
sudo fail2ban-client get sshd logpath
  1. Фильтр работает:
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
  1. SELinux не блокирует (если используется):
sudo ausearch -m avc -ts recent
  1. Проверьте права доступа:
sudo chmod 640 /var/log/auth.log
sudo chown root:adm /var/log/auth.log

Ложные срабатывания

Если блокируются легитимные IP:

  1. Добавьте в белый список:
ignoreip = 127.0.0.1/8 192.168.1.0/24 203.0.113.42
  1. Увеличьте порог срабатывания:
maxretry = 10
findtime = 30m
  1. Уточните регулярные выражения в фильтре

Fail2Ban не запускается

Проверьте синтаксис конфигурации:

sudo fail2ban-client -t

Проверьте логи ошибок:

sudo journalctl -u fail2ban -n 50
sudo tail -50 /var/log/fail2ban.log

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

  • Ошибки в регулярных выражениях
  • Недоступные лог-файлы
  • Конфликты портов в jail
  • Некорректный формат конфигурации

Блокировки не снимаются

Проверьте текущие правила iptables:

sudo iptables -L -n -v

Вручную удалите правило:

sudo iptables -D INPUT -s 192.168.1.100 -j DROP

Или сбросьте все правила Fail2Ban:

sudo fail2ban-client unban --all

Интеграция с мониторингом и оповещениями

Email-уведомления

Настройте полные email-отчеты:

[DEFAULT]
destemail = admin@example.com
sender = fail2ban@example.com
sendername = Fail2Ban

# Действие с полным логом
action = %(action_mwl)s

Для этого требуется установленный MTA (например, Postfix):

sudo apt install postfix mailutils

Интеграция со Slack

Создайте webhook в Slack и настройте action:

sudo nano /etc/fail2ban/action.d/slack-notify.conf
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = curl -X POST <webhook_url> -H 'Content-type: application/json' --data '{"text":"[Fail2Ban] <name>: Banned <ip> after <failures> failures"}'
actionunban =

[Init]
webhook_url = https://hooks.slack.com/services/YOUR/WEBHOOK/URL

Интеграция с Zabbix

Создайте UserParameter для Zabbix:

sudo nano /etc/zabbix/zabbix_agentd.d/fail2ban.conf
UserParameter=fail2ban.status[*],sudo fail2ban-client status $1 | grep "Currently banned" | awk '{print $$4}'
UserParameter=fail2ban.jails,sudo fail2ban-client status | grep "Jail list" | sed 's/.*://' | wc -w

Добавьте права sudo:

sudo visudo
zabbix ALL=(ALL) NOPASSWD: /usr/bin/fail2ban-client status*

Бэкап и восстановление конфигурации

Создание бэкапа

#!/bin/bash
BACKUP_DIR="/backup/fail2ban"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

# Бэкап конфигурации
tar -czf $BACKUP_DIR/fail2ban-config-$DATE.tar.gz /etc/fail2ban/

# Бэкап текущих блокировок
fail2ban-client status > $BACKUP_DIR/fail2ban-status-$DATE.txt

# Удаление старых бэкапов (старше 30 дней)
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete

Восстановление

# Остановить Fail2Ban
sudo systemctl stop fail2ban

# Восстановить конфигурацию
sudo tar -xzf /backup/fail2ban/fail2ban-config-20240315.tar.gz -C /

# Запустить Fail2Ban
sudo systemctl start fail2ban

Лучшие практики

Рекомендации по безопасности

  1. Не блокируйте себя — всегда добавляйте свой IP в белый список
  2. Используйте разумные пороги — слишком агрессивные настройки приведут к блокировке легитимных пользователей
  3. Мониторьте ложные срабатывания — регулярно проверяйте логи
  4. Комбинируйте с другими мерами — Fail2Ban не заменяет правильную настройку сервисов
  5. Регулярно обновляйте — новые версии содержат улучшенные фильтры

Рекомендованная структура файлов

/etc/fail2ban/
├── fail2ban.local          # Глобальные настройки (если нужны)
├── jail.local              # Основные jail (deprecated)
├── jail.d/
│   ├── 00-defaults.conf    # Параметры по умолчанию
│   ├── 10-sshd.conf        # SSH
│   ├── 20-nginx.conf       # Nginx
│   ├── 30-custom.conf      # Кастомные приложения
├── filter.d/
│   └── custom-app.conf     # Кастомные фильтры
└── action.d/
    └── custom-action.conf  # Кастомные действия

Рекомендованные параметры для разных сценариев

Публичный веб-сервер:

bantime = 1h
findtime = 10m
maxretry = 3

Сервер разработки:

bantime = 5m
findtime = 10m
maxretry = 10

Критичный production-сервер:

bantime = 1d
findtime = 5m
maxretry = 2
bantime.increment = true

Заключение

Fail2Ban — мощный и гибкий инструмент защиты серверов, который при правильной настройке значительно повышает безопасность инфраструктуры. Автоматическая блокировка атакующих IP снижает нагрузку на сервер и уменьшает поверхность атаки.

Ключевые моменты для успешного использования Fail2Ban:

  • Начните с базовой конфигурации и постепенно адаптируйте под свои нужды
  • Регулярно анализируйте логи для выявления паттернов атак
  • Создавайте собственные фильтры для специфических приложений
  • Интегрируйте с системами мониторинга и оповещений
  • Не полагайтесь только на Fail2Ban — используйте его как часть многоуровневой защиты

Помните, что Fail2Ban защищает от брутфорс-атак и автоматизированных сканирований, но не заменяет другие меры безопасности: регулярные обновления, правильную настройку сервисов, использование сильных паролей и ключей, сегментацию сети и резервное копирование.

Правильно настроенный Fail2Ban работает незаметно, эффективно отражая тысячи атак, но требует периодического внимания администратора для оптимизации правил и анализа новых угроз.