Введение
Fail2Ban — это мощный инструмент защиты серверов от брутфорс-атак и автоматизированных сканирований. Написанный на Python, он работает как служба мониторинга логов, которая анализирует записи различных сервисов в реальном времени и автоматически блокирует IP-адреса, демонстрирующие подозрительное или вредоносное поведение.
В современном интернете серверы подвергаются постоянным атакам — тысячи попыток подбора паролей SSH, сканирования портов, эксплуатации уязвимостей веб-приложений происходят ежедневно. Fail2Ban создает динамический защитный барьер, автоматически реагируя на эти угрозы без необходимости постоянного ручного вмешательства администратора.
В этой статье мы рассмотрим не только базовую установку, но и профессиональную настройку Fail2Ban для защиты различных сервисов, создание собственных фильтров, интеграцию с системами оповещения и методы тонкой настройки для минимизации ложных срабатываний.
Архитектура и принцип работы Fail2Ban
Прежде чем приступить к установке, важно понять, как работает Fail2Ban.
Основные компоненты
Фильтры (Filters) — регулярные выражения, которые определяют подозрительные записи в логах. Каждый фильтр описывает паттерны для конкретного типа атак или ошибок.
Действия (Actions) — скрипты, определяющие, что делать при обнаружении атаки. Обычно это добавление правил в iptables или nftables для блокировки IP, но могут быть и другие действия: отправка email, запись в лог, уведомления в мессенджеры.
Тюрьмы (Jails) — конфигурации, объединяющие фильтры, действия и параметры мониторинга для конкретного сервиса. Например, jail «sshd» отвечает за защиту SSH.
Жизненный цикл блокировки
- Fail2Ban непрерывно читает указанные лог-файлы
- Применяет регулярные выражения фильтров к новым записям
- Подсчитывает количество совпадений для каждого IP в заданном временном окне
- При превышении порога срабатываний выполняет action (блокирует IP)
- По истечении времени блокировки автоматически снимает бан
- Ведет собственную статистику и логи
Установка 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
Проверьте последовательно:
- Jail активен:
sudo fail2ban-client status sshd
- Логи доступны и читаются:
sudo ls -la /var/log/auth.log
sudo fail2ban-client get sshd logpath
- Фильтр работает:
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
- SELinux не блокирует (если используется):
sudo ausearch -m avc -ts recent
- Проверьте права доступа:
sudo chmod 640 /var/log/auth.log
sudo chown root:adm /var/log/auth.log
Ложные срабатывания
Если блокируются легитимные IP:
- Добавьте в белый список:
ignoreip = 127.0.0.1/8 192.168.1.0/24 203.0.113.42
- Увеличьте порог срабатывания:
maxretry = 10
findtime = 30m
- Уточните регулярные выражения в фильтре
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
Лучшие практики
Рекомендации по безопасности
- Не блокируйте себя — всегда добавляйте свой IP в белый список
- Используйте разумные пороги — слишком агрессивные настройки приведут к блокировке легитимных пользователей
- Мониторьте ложные срабатывания — регулярно проверяйте логи
- Комбинируйте с другими мерами — Fail2Ban не заменяет правильную настройку сервисов
- Регулярно обновляйте — новые версии содержат улучшенные фильтры
Рекомендованная структура файлов
/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 работает незаметно, эффективно отражая тысячи атак, но требует периодического внимания администратора для оптимизации правил и анализа новых угроз.