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
После редактирования:
- Сохраните файл: нажмите
Ctrl + O, затемEnter - Выйдите из редактора:
Ctrl + X - Перезагрузите 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: 0Currently banned: 0(или больше, если уже были попытки)
⚠️ Если джейл не отображается — проверьте имя файла (должно быть
.conf) и синтаксис.
Выбор бэкенда фаервола
| Действие | Когда использовать | Примечание |
|---|---|---|
| nftables | Debian 13 по умолчанию | Современный бэкенд, используется в Debian 13 |
| iptables-multiport | Debian 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 fail2ban→active (running) - [ ] Джейл SSH включён:
sudo fail2ban-client status sshd→enabled - [ ] Конфигурация проверена:
sudo fail2ban-client -t→OK - [ ] Проверьте, что 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(более современный аналог)