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

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

⚠️ Важное предупреждение: Fail2Ban — это инструмент безопасности. Неправильная конфигурация может заблокировать легитимный доступ (в том числе ваш). Перед применением на продакшн-сервере протестируйте на тестовой машине.

В этом обновлённом руководстве мы:

  • Установим Fail2Ban из стандартных репозиториев Debian
  • Настроим базовые параметры (время бана, количество попыток, белый список)
  • Рассмотрим два способа конфигурации (jail.local и jail.d/)
  • Включим защиту для SSH, Apache, Nginx и почтовых служб
  • Разберём управление банами и мониторинг логов
  • Устраним типичные проблемы

Оглавление

Оглавление

Предварительные требования

Перед установкой убедитесь, что:

  • У вас установлена Debian 11, 12 или 13 (серверная или десктопная версия)
  • Ваш сервер имеет статический IP-адрес (или динамический с DDNS)
  • У вас есть доступ к терминалу (локально или по SSH)

⚠️ ВАЖНО: Проверьте права sudo перед установкой

Если вы не уверены, есть ли у вашего пользователя права администратора, выполните в терминале:

sudo -l

Что делает: Проверяет, есть ли у текущего пользователя права суперпользователя.

⚠️ Пароль при первом запуске! В зависимости от настроек в /etc/sudoers, при первом выполнении sudo -l в текущей сессии система может запросить ваш пароль (если не активировано правило NOPASSWD).

✅ Ожидаемый результат: Список разрешённых команд. Если видите (ALL : ALL) ALL — у вас полный доступ.

❌ Если видите ошибку user is not in the sudoers file или may not run sudo — сначала пройдите наше руководство по настройке sudo. Без этого дальнейшие шаги не сработают.

Обновление системы

Перед установкой всегда обновляйте список пакетов. Выполните в терминале:

sudo apt update
sudo apt upgrade

Что делает:

  • sudo — права суперпользователя
  • apt update — обновляет список доступных пакетов
  • apt upgrade — обновляет все установленные пакеты

Зачем: Это стандартная практика безопасности перед установкой нового ПО.

💡 Примечание: Флаг -y автоматически подтверждает все действия. В обучении его лучше не использовать: так вы видите список пакетов и можете отменить установку, если что-то выглядит подозрительно. Если вы уверены в своих действиях, можно добавить -y.

Установка Fail2Ban

Выполните в терминале:

sudo apt install 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)
Этот способ я оставил, но не рекомендую в современных версиях Debian 11 и выше.
Он может быть рабочим для тех кто эксперементирует со старыми дестрибутивами типа Debian 9
На Debian 11,12,13 нужно использовать способ «В» данного руководства.

Создайте файл jail.local и добавьте только те параметры, которые вы хотите изменить:

sudo touch /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Пример содержимого:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.25 198.51.100.10
bantime = 10m
findtime = 10m
maxretry = 5

[sshd]
enabled = true 
maxretry = 3 
bantime = 1h 
findtime = 10m

⚠️ Важно: 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 = auto (по умолчанию, не нужно указывать явно)
ignoreip = 127.0.0.1/8 ::1
bantime = 10m
findtime = 10m
maxretry = 5
bantime.increment = true
bantime.factor = 2

[sshd]
enabled = true
maxretry = 3
bantime = 1h
findtime = 10m

EOF

Обратите внимание, что конфигурационный файл будет лежать по адресу: /etc/fail2ban/jail.d/99-local-baseline.conf
И если в будщем вам понадобится вносить в него изменения — соответственно, команда для открытия файла будет такая:

sudo nano /etc/fail2ban/jail.d/99-local-baseline.conf 

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

  1. Сохраните файл: нажмите Ctrl + O, затем Enter
  2. Выйдите из редактора: Ctrl + X
  3. Перезагрузите Fail2Ban
sudo fail2ban-client reload

Пояснения: Почему теперь лучше использовать новый способ.

✅ 1. Почему мы не редактируем jail.conf?

Файл /etc/fail2ban/jail.confсистемный, «по умолчанию».

Он поставляется вместе с пакетом fail2ban.

👉 Главная проблема:
При обновлении пакета этот файл может быть перезаписан — и все твои правки исчезнут.

📦 Пример:

  • Ты вносишь настройки в jail.conf
  • Приходит обновление Fail2Ban
  • Система заменяет jail.conf на новый — твои правки — потеряны

❌ Это очень плохая практика.


✅ 2. Почему jail.local — устарел (но работает)

Файл /etc/fail2ban/jail.localисключение.
Fail2Ban специально не перезаписывает его при обновлении.

👉 Раньше (до версии 0.10) это был единственный способ настроить Fail2Ban.

Но у него три недостатка:

ПроблемаОбъяснение
❌ Один файл на всёВсё в jail.local — SSH, Nginx, WordPress… сложно поддерживать
❌ Нет модульностиНельзя «отключить» часть конфига — только комментировать
❌ Неочевидно, что он приоритетныйНовички часто думают: «А зачем .local

🔁 Это как писать все настройки сервера в один nginx.conf, а не в отдельные sites-available/


✅ 3. Почему теперь — jail.d/? (современный способ)

Fail2Ban начиная с 0.10 (2018+) поддерживает директорию:

/etc/fail2ban/jail.d/

Все файлы в ней с расширением .confавтоматически загружаются и переопределяют настройки из jail.conf.

👉 Это современная практика — как в nginx, systemd, rsyslog и других системных сервисах.

✅ Преимущества jail.d/:

ПлюсОбъяснение
✅ МодульностьМожно: sshd.conf, nginx.conf, wordpress.conf
✅ БезопасностьНе трогаем системные файлы
✅ УправляемостьХочешь отключить — переименуй в .bak
✅ Порядок загрузки01-, 99- — контролируешь приоритет
✅ Совместимость со скриптамиЛегко автоматизировать (tee, Ansible, Puppet)

Основные параметры конфигурации

Выбор бэкенда для чтения логов

В Debian 11–13 бэкенд auto работает корректно. Не нужно указывать backend = systemd — это может привести к тому, что Fail2Ban не увидит логи SSH в /var/log/auth.log.

Рекомендуемый вариант: ничего не указывать, использовать auto по умолчанию.

Базовые параметры бана

[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

Зачем: Добавьте сюда IP-адреса, которые никогда не должны блокироваться (например, ваш домашний IP).

Прогрессивный бан (для повторных нарушителей)

[DEFAULT]
bantime.increment = true
bantime.factor = 2

Что делает: Каждый следующий бан для одного IP будет в 2 раза дольше (первый — 10 минут, второй — 20 минут, третий — 40 минут и т.д.).

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

Джейл sshd уже включён по умолчанию. Ужесточим его:

[sshd]
enabled = true
maxretry = 3
bantime = 1h
findtime = 10m

💡 Примечание: Параметр port = ssh можно не указывать — Fail2Ban автоматически использует стандартный порт SSH. Указывайте вручную только если у вас нестандартный порт.

⚠️ Если вы изменили порт 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 reset by <HOST> port \d+$
ignoreregex =

EOF

Что делает: Ловит разрывы соединений на этапе pre-auth.

Шаг 2: Проверьте фильтр на реальных логах

sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd-kex.local

Ожидаемый вывод: Failregex: X total (где X > 0 — количество найденных совпадений).

⚠️ Если Failregex показывает 0, значит, формат строк в ваших логах не совпадает с регулярным выражением. Проверьте несколько строк из лога и скорректируйте failregex.

Шаг 3: Добавьте джейл

Для jail.d/ создайте отдельный файл:

sudo tee /etc/fail2ban/jail.d/sshd-kex.conf > /dev/null <<'EOF'

[sshd-kex]
enabled = true 
filter = sshd-kex 
port = ssh maxretry = 5 
bantime = 1h 
findtime = 10m

EOF

Шаг 4: Перезапустите Fail2Ban

sudo fail2ban-client -t

✅ Ожидаемый вывод:

Successfully loaded the jail 'sshd-kex'
Success

❌ Если есть ошибка — вернитесь к предыдущим шагам и проверьте файл /etc/fail2ban/jail.d/sshd-kex.conf.

2. Перезагрузите конфигурацию

Теперь примените изменения без остановки сервиса:

sudo fail2ban-client reload

💡 Это безопаснее, чем systemctl restart, потому что защита продолжает работать.

3. Проверьте статус джейла

Убедитесь, что джейл sshd-kex активен:

sudo fail2ban-client status sshd-kex

✅ Ожидаемый результат:

  • Джейл включён
  • Currently failed: 0
  • Currently banned: 0 (или больше, если уже были попытки)

⚠️ Если джейл не отображается — проверьте имя файла (должно быть .conf) и синтаксис.

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

ДействиеКогда использоватьПримечание
nftablesDebian 13 по умолчаниюСовременный бэкенд,
используется в Debian 13
iptables-multiportDebian 11/12 по умолчаниюКлассический бэкенд
ufwЕсли вы уже используете UFWТребуется предварительная
настройка UFW

Чтобы сменить бэкенд, добавьте в [DEFAULT]:

banaction = ufw

💡 Если вы используете UFW: сначала убедитесь, что он установлен и включён (sudo ufw status). Затем в Fail2Ban укажите banaction = ufw. Без этого Fail2Ban не сможет блокировать IP через UFW.

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

Защита Apache

[apache-badbots]
enabled = true
port = http,https
logpath = /var/log/apache2/access.log
bantime = 48h
maxretry = 1
[apache-botsearch]
enabled = true 
port = http,https 
logpath = /var/log/apache2/error.log 
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 Ошибка при запуске: код 255 (Debian 12/13)

Симптом: systemctl status fail2ban показывает code=exited, status=255/EXCEPTION.

Причина: Проблемы с бэкендом или доступом к логам.

Решение: Убедитесь, что вы не указали backend = systemd (оставьте auto по умолчанию). Проверьте, что лог-файлы существуют:

ls -la /var/log/auth.log

Перезапустите:

sudo systemctl restart fail2ban

9.2 Джейл не банит, хотя в логах есть попытки

Симптом: Джейл включён, но баны не происходят.

Пошаговая диагностика:

Шаг 1: Убедитесь, что джейл включён и активен:

sudo fail2ban-client status sshd

Шаг 2: Проверьте, видит ли Fail2Ban строки в логе:

sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

Шаг 3: Убедитесь, что лог не пустой и пишется:

sudo tail -n 20 /var/log/auth.log | grep -i "Failed"

Шаг 4: Проверьте, не стоит ли ignoreip на вашем тестовом IP:

grep ignoreip /etc/fail2ban/jail.d/*.conf /etc/fail2ban/jail.local 2>/dev/null

Шаг 5: Посмотрите ошибки самого Fail2Ban:

sudo journalctl -u fail2ban -n 30 --no-pager

9.3 Сброс базы данных при повреждении

Симптом: Fail2Ban не запускается с ошибкой SQLite database is malformed.

Решение:

sudo rm /var/lib/fail2ban/fail2ban.sqlite3
sudo systemctl restart fail2ban

⚠️ Внимание: Это удалит историю банов и счётчики попыток.

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

sudo fail2ban-client -t

Ожидаемый вывод: OK: configuration test is successful

Чек-лист: что проверить после настройки

  • [ ] Fail2Ban установлен: fail2ban-client --version показывает версию
  • [ ] Сервис активен: systemctl status fail2banactive (running)
  • [ ] Джейл SSH включён: sudo fail2ban-client status sshdenabled
  • [ ] Конфигурация проверена: sudo fail2ban-client -tOK
  • [ ] Проверьте, что Fail2Ban принимает команды управления: sudo fail2ban-client get sshd actionstart без ошибок

Удаление Fail2Ban

Полное удаление с очисткой конфигов

sudo systemctl disable --now fail2ban
sudo apt remove --purge fail2ban
sudo apt autoremove

Ручная очистка (только если нужно полностью удалить следы)

⚠️ Внимание: Эти команды удаляют все конфигурации и базы данных Fail2Ban.

sudo rm -rf /etc/fail2ban
sudo rm -rf /var/lib/fail2ban
sudo rm -rf /var/log/fail2ban.log*

Часто задаваемые вопросы (FAQ)

Вопрос: Почему я не вижу банов, хотя в логах есть попытки?
Ответ: Проверьте, что джейл включён (sudo fail2ban-client status sshd должен показывать enabled). Также проверьте, что Fail2Ban видит попытки: sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf. Используйте пошаговую диагностику из раздела 9.2.

Вопрос: Как добавить свой IP в белый список?
Ответ: Добавьте IP в параметр ignoreip в [DEFAULT] в файле /etc/fail2ban/jail.d/99-local-baseline.conf или /etc/fail2ban/jail.local.

Вопрос: Как временно отключить Fail2Ban?
Ответ: sudo systemctl stop fail2ban.

Вопрос: Как проверить, забанен ли IP?
Ответ: sudo fail2ban-client get sshd banip или sudo iptables -L -n | grep IP-адрес.

Вопрос: Почему Fail2Ban не видит логи на Debian 13?
Ответ: Проверьте, что бэкенд не переопределён на systemd. Используйте auto по умолчанию и убедитесь, что логи пишутся в /var/log/auth.log.

Заключение

Теперь Fail2Ban установлен и настроен на вашем Debian. Ваш сервер защищён от брутфорс-атак. Джейл SSH включён по умолчанию, а вы можете добавить защиту для Apache, Nginx, Postfix и других служб.

Связанные статьи:

Как добавить пользователя в sudoers в Debian 13, 12, 11: полное руководство

Что дальше?

  • Настройте отправку email-уведомлений о банах (destemail в jail.local)
  • Изучите официальную документацию Fail2Ban
  • Рассмотрите альтернативы: crowdsec (более современный аналог)