Fail2Ban — это система предотвращения вторжений, которая защищает ваш сервер от брутфорс-атак и автоматических попыток взлома. Она работает как охранник, который круглосуточно следит за логами и при обнаружении подозрительной активности (многократные неудачные попытки входа, подбор паролей) автоматически блокирует IP-адрес нарушителя на уровне фаервола.
В этом обновлённом руководстве мы:
- Установим Fail2Ban из стандартных репозиториев Debian
- Настроим базовые параметры (время бана, количество попыток, белый список)
- Рассмотрим два способа конфигурации (
jail.localиjail.d/) - Включим защиту для SSH, Apache, Nginx и почтовых служб
- Добавим кастомный фильтр для pre-auth атак (
sshd-kex) - Разберём управление банами и мониторинг логов
- Устраним типичные проблемы
Предварительные требования
Перед установкой убедитесь, что:
- У вас установлена Debian 11, 12 или 13 (серверная или десктопная версия)
- Ваш сервер имеет статический IP-адрес (или динамический с DDNS)
- У вас есть доступ к терминалу (локально или по SSH)
⚠️ ВАЖНО: Проверьте права sudo перед установкой
Если вы не уверены, есть ли у вашего пользователя права администратора, выполните в терминале:
sudo whoami
✅ Ожидаемый вывод: root
❌ Если выводит is not in the sudoers file — сначала пройдите наше руководство по настройке sudo.
Обновление системы
sudo apt update && sudo apt upgrade -y
Установка Fail2Ban
sudo apt install -y fail2ban
Что делает: Устанавливает Fail2Ban и необходимые зависимости.
Проверка установки
Версия Fail2Ban
fail2ban-client --version
| Версия Debian | Версия Fail2Ban |
|---|---|
| Debian 13 (Trixie) | 1.1.0 |
| Debian 12 (Bookworm) | 1.0.2 |
| Debian 11 (Bullseye) | 0.11.2 |
Статус сервиса
sudo systemctl status fail2ban
✅ Ожидаемый вывод: Active: active (running)
Если сервис не активен:
sudo systemctl enable --now fail2ban
Базовая настройка Fail2Ban
Fail2Ban поставляется с конфигурацией в /etc/fail2ban/jail.conf. Никогда не редактируйте её напрямую — при обновлении она будет перезаписана.
Вместо этого используйте один из двух способов:
Способ A: Классический (jail.local)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Способ B: Современный (jail.d/) — рекомендуется
Этот способ хранит только ваши изменения, не копируя весь стандартный конфиг.
sudo install -d -m 0755 /etc/fail2ban/jail.d
sudo tee /etc/fail2ban/jail.d/99-local-baseline.conf > /dev/null <<'EOF'
[DEFAULT]
backend = systemd
ignoreip = 127.0.0.1/8 ::1
bantime = 10m
findtime = 10m
maxretry = 5
[sshd]
enabled = true
maxretry = 3
bantime = 1h
findtime = 10m
EOF
Основные параметры конфигурации
Выбор бэкенда для чтения логов
Для Debian 12 и 13 обязательно укажите backend = systemd (в jail.local или jail.d/):
[DEFAULT]
backend = systemd
Зачем: На системах с journald традиционные лог-файлы могут быть пустыми.
Базовые параметры бана
[DEFAULT]
bantime = 10m # время бана (можно: s, m, h, d)
findtime = 10m # окно подсчёта попыток
maxretry = 5 # количество попыток до бана
Белый список (игнорируемые IP)
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.25 198.51.100.10
Прогрессивный бан (для повторных нарушителей)
[DEFAULT]
bantime.increment = true
bantime.factor = 2
bantime.formula = ban.Time * (1<<(ban.Count if ban.Count<20 else 20)) * banFactor
Что делает: Каждый следующий бан для одного IP будет в 2 раза дольше.
Настройка защиты SSH
Джейл sshd уже включён по умолчанию. Ужесточим его:
[sshd]
enabled = true
port = ssh
maxretry = 3
bantime = 1h
findtime = 10m
⚠️ Если вы изменили порт SSH, замените port = ssh на port = 2222 (укажите ваш порт).
Кастомный фильтр для SSH pre-auth атак (sshd-kex)
Стандартный фильтр sshd не ловит атаки, которые обрываются на этапе обмена ключами (kex_exchange_identification). Добавим отдельный фильтр.
Шаг 1: Создайте фильтр
sudo tee /etc/fail2ban/filter.d/sshd-kex.local > /dev/null <<'EOF'
[INCLUDES]
before = common.conf
[Definition]
_daemon = sshd
failregex = ^%(__prefix_line)sConnection closed by <HOST> port \d+\s*$
ignoreregex =
EOF
Шаг 2: Проверьте фильтр
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd-kex.local
✅ Ожидаемый вывод: Failregex: X total (X > 0).
Шаг 3: Добавьте джейл
Для jail.local: добавьте в конец файла:
[sshd-kex]
enabled = true
filter = sshd-kex
port = ssh
backend = systemd
maxretry = 5
bantime = 1h
findtime = 10m
Для jail.d/: создайте отдельный файл:
sudo tee /etc/fail2ban/jail.d/sshd-kex.conf > /dev/null <<'EOF'
[sshd-kex]
enabled = true
filter = sshd-kex
port = ssh
backend = systemd
maxretry = 5
bantime = 1h
findtime = 10m
EOF
Шаг 4: Перезапустите Fail2Ban
sudo fail2ban-client -t
sudo systemctl restart fail2ban
sleep 2
sudo fail2ban-client status sshd-kex
Выбор бэкенда фаервола
| Действие | Когда использовать | Примечание |
|---|---|---|
nftables | Debian 13 по умолчанию | Современный бэкенд, используется в Debian 13 |
iptables-multiport | Debian 11/12 по умолчанию | Классический бэкенд |
ufw | Если вы уже используете UFW | Требуется предварительная настройка UFW |
Чтобы сменить бэкенд, добавьте в [DEFAULT]:
banaction = ufw
Настройка дополнительных джейлов
Защита Apache
[apache-badbots]
enabled = true
port = http,https
logpath = %(apache_access_log)s
bantime = 48h
maxretry = 1
[apache-botsearch]
enabled = true
port = http,https
logpath = %(apache_error_log)s
bantime = 72h
maxretry = 1
Защита Nginx
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 1h
Защита почтовых служб
[postfix]
enabled = true
port = smtp,ssmtp,submission
logpath = /var/log/mail.log
maxretry = 3
bantime = 2h
[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps
logpath = /var/log/mail.log
maxretry = 3
bantime = 2h
Применение изменений
После добавления новых джейлов перезапустите Fail2Ban:
sudo systemctl restart fail2ban
Управление банами вручную
Список активных джейлов
sudo fail2ban-client status
Статус конкретного джейла (SSH)
sudo fail2ban-client status sshd
Бан IP вручную
sudo fail2ban-client set sshd banip 192.0.2.100
Разбан IP
sudo fail2ban-client set sshd unbanip 192.0.2.100
Перезагрузка конфигурации без остановки сервиса
sudo fail2ban-client reload
Мониторинг логов
Просмотр логов в реальном времени
sudo tail -f /var/log/fail2ban.log
Поиск по логам
sudo grep "198.51.100.45" /var/log/fail2ban.log
sudo grep "error" /var/log/fail2ban.log
Решение типичных проблем
9.1 Ошибка: fail2ban-client: command not found
Решение: Используйте правильную команду:
fail2ban-client --version
9.2 Ошибка при запуске: код 255 (Debian 12/13)
Симптом: systemctl status fail2ban показывает code=exited, status=255/EXCEPTION.
Причина: Бэкенд auto не может найти лог-файлы.
Решение: Добавьте в [DEFAULT]:
backend = systemd
Затем перезапустите:
sudo systemctl restart fail2ban
9.3 Джейл не банит, хотя в логах есть попытки
Шаг 1: Проверьте бэкенд (должен быть systemd).
Шаг 2: Проверьте, что Fail2Ban видит попытки:
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
Шаг 3: Проверьте статус джейла:
sudo fail2ban-client status sshd
9.4 Сброс базы данных при повреждении
Симптом: Fail2Ban не запускается с ошибкой SQLite database is malformed.
Решение:
sudo rm /var/lib/fail2ban/fail2ban.sqlite3
sudo systemctl restart fail2ban
⚠️ Внимание: Это удалит историю банов и счётчики попыток.
9.5 Проверка синтаксиса конфигурации
sudo fail2ban-client -t
✅ Ожидаемый вывод: OK: configuration test is successful
Чек-лист: что проверить после настройки
- [ ] Fail2Ban установлен:
fail2ban-client --versionпоказывает версию - [ ] Сервис активен:
systemctl status fail2ban→active (running) - [ ] Джейл SSH включён:
sudo fail2ban-client status sshd→enabled - [ ] Кастомный фильтр sshd-kex работает:
sudo fail2ban-client status sshd-kex→enabled - [ ] Конфигурация проверена:
sudo fail2ban-client -t→OK - [ ] Можно вручную забанить IP:
sudo fail2ban-client set sshd banip 192.0.2.1 - [ ] Можно разбанить IP:
sudo fail2ban-client set sshd unbanip 192.0.2.1
Удаление Fail2Ban
sudo systemctl disable --now fail2ban
sudo apt remove --purge fail2ban
sudo apt autoremove
sudo rm -rf /etc/fail2ban /var/lib/fail2ban /var/log/fail2ban.log*
Заключение
Теперь Fail2Ban установлен и настроен на вашем Debian. Ваш сервер защищён от брутфорс-атак, включая pre-auth разрывы SSH. Джейл SSH включён по умолчанию, а вы можете добавить защиту для Apache, Nginx, Postfix и других служб.
Что дальше?
- Настройте отправку email-уведомлений о банах (
destemailвjail.local) - Изучите официальную документацию Fail2Ban
- Рассмотрите альтернативы:
crowdsec(более современный аналог)