Установка и настройка Fail2Ban на Debian 13, 12, 11: подробное руководство

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 = systemdjail.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

Выбор бэкенда фаервола

ДействиеКогда использоватьПримечание
nftablesDebian 13 по умолчаниюСовременный бэкенд,
используется в Debian 13
iptables-multiportDebian 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 fail2banactive (running)
  • [ ] Джейл SSH включён: sudo fail2ban-client status sshdenabled
  • [ ] Кастомный фильтр sshd-kex работает: sudo fail2ban-client status sshd-kexenabled
  • [ ] Конфигурация проверена: sudo fail2ban-client -tOK
  • [ ] Можно вручную забанить 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 (более современный аналог)