Fail2ban на VPS: защита от брутфорса SSH
Пошаговое руководство по установке и настройке fail2ban на VPS для защиты от подбора паролей SSH. Разбор конфигурации, сравнение с альтернативами и диагностика.
Содержание
Брутфорс SSH — одна из самых распространённых атак на VPS. Злоумышленники перебирают пары логин/пароль, используя автоматизированные скрипты. Даже сложный пароль не всегда спасает, если атака идёт с тысячи IP-адресов. Fail2ban — простое и эффективное решение: оно анализирует логи, обнаруживает повторяющиеся неудачные попытки и временно блокирует источник по firewall.
Что такое fail2ban и как он работает
Fail2ban — это демон, который следит за лог-файлами (например, /var/log/auth.log) и выполняет действия при совпадении с правилами. Для SSH он реагирует на сообщения об ошибках аутентификации. После определённого числа неудач (maxretry) за заданный период (findtime) IP-адрес блокируется на время (bantime) через iptables, nftables или firewalld.
Программа написана на Python и легко настраивается через конфигурационные файлы. Она поддерживает фильтры для многих служб, но применительно к VPS чаще всего используется для SSH.
Установка fail2ban на VPS
Установка выполняется из официального репозитория вашего дистрибутива. Перед установкой рекомендуется обновить списки пакетов.
# Debian/Ubuntu
sudo apt update
sudo apt install fail2ban -y
# CentOS/RHEL
sudo dnf install epel-release -y
sudo dnf install fail2ban -y
После установки служба запустится автоматически. Проверьте статус:
sudo systemctl status fail2ban
Если он активен, переходите к настройке. Актуальные версии и особенности установки лучше проверять на официальном сайте fail2ban (см. источники).
Базовая настройка защиты SSH
Основной конфигурационный файл — /etc/fail2ban/jail.conf. Его не рекомендуется редактировать напрямую, так как при обновлении он будет перезаписан. Вместо этого создайте файл jail.local и укажите параметры в нём.
sudo nano /etc/fail2ban/jail.local
Вот минимальная конфигурация для защиты SSH:
[DEFAULT]
# Время блокировки в секундах (например, 1 час = 3600)
bantime = 3600
# Период, за который учитываются попытки
findtime = 600
# Максимальное число попыток за findtime
maxretry = 5
# Игнорировать локальные адреса и свой VPS
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
[sshd]
enabled = true
В секции [sshd] можно переопределить параметры для конкретного сервиса. Например, увеличить bantime для SSH:
[sshd]
enabled = true
bantime = 7200
maxretry = 3
После изменения конфигурации перезапустите службу:
sudo systemctl restart fail2ban
Убедитесь, что jail активен:
sudo fail2ban-client status sshd
Сравнение fail2ban с альтернативами
Fail2ban не единственный инструмент для защиты SSH. Рассмотрим основные варианты.
- Fail2ban — гибкий, поддерживает множество сервисов, но требует настройки и слежения за логами.
- DenyHosts — специализируется только на SSH, проще в настройке, но менее гибок.
- SSHGuard — работает быстрее, анализирует логи в реальном времени, но имеет меньше возможностей для расширений.
- Облачные решения (например, firewall от провайдера) — не требуют установки ПО, но зависят от внешнего сервиса и могут быть платными.
Для большинства VPS fail2ban — оптимальный баланс гибкости и простоты. Выбирайте по сценарию: если нужно защитить только SSH и не хочется возиться с настройкой — DenyHosts. Если необходимо отслеживать несколько служб — fail2ban. Если атаки идут распределённо — стоит комбинировать с облачным фильтром.
Проверка работы и диагностика
После запуска важно убедиться, что fail2ban действительно блокирует. Для этого можно искусственно вызвать неудачные попытки входа.
Сначала проверьте список заблокированных IP:
sudo fail2ban-client status sshd
Вы увидите информацию о jail: количество запрещённых IP, фильтры, действия. Чтобы проверить, срабатывает ли фильтр, имитируйте атаку (не с своего рабочего IP, если он не в исключениях):
ssh invalid@your_server_ip
Повторите несколько раз (больше maxretry). Затем снова выполните status — IP должен появиться в списке.
Логи можно посмотреть в файле:
sudo tail -f /var/log/fail2ban.log
Если блокировки не происходит, проверьте:
- Указан ли правильный лог-файл в jail.local (например, для Debian — /var/log/auth.log).
- Не перекрывает ли конфигурация в [DEFAULT] параметры секции.
- Активен ли jail (enabled = true).
- Правильно ли работает chain в iptables (может потребоваться установка iptables-persistent).
Частые ошибки и советы
- Не перезапустили fail2ban после изменения конфигурации. Всегда выполняйте restart или reload.
- Игнорирование собственного IP. Обязательно добавьте свой IP и локальные подсети в ignoreip, чтобы не заблокировать самих себя.
- Слишком большой bantime. Для разовой атаки это ок, но для легитимных пользователей, которые забыли пароль, это проблема. Начните с 15-30 минут.
- Не настроили уведомления. Fail2ban может отправлять письма, но по умолчанию вы не узнаете о блокировках. Настройте действие action = %(action_mwl)s в jail.local.
- Не обновляете базы фильтров. При установке из репозитория фильтры могут устаревать. Проверяйте обновления fail2ban.
Также не забудьте отключить вход по паролю, если используете SSH-ключи. Это снизит риск даже при отсутствии fail2ban.
Мини-чеклист
- Обновить пакетный менеджер и установить fail2ban
- Создать /etc/fail2ban/jail.local с параметрами для SSH
- Проверить корректность пути к лог-файлу в конфигурации
- Добавить свой IP в ignoreip
- Перезапустить службу fail2ban
- Проверить статус jail через fail2ban-client
- Имитировать неудачные входы и убедиться в блокировке
- Просмотреть логи /var/log/fail2ban.log на предмет ошибок
Частые ошибки
- Редактирование jail.conf вместо jail.local
- Забыли перезапустить fail2ban после изменения конфига
- Не настроили ignoreip и заблокировали сами себя
- Указали неверный лог-файл для вашего дистрибутива
- Излишне длинный bantime мешает легитимным пользователям
- Не проверили работу после настройки
Источники и документация
FAQ
Какие параметры fail2ban самые важные для SSH?
Основные — maxretry (сколько неудачных попыток), findtime (за какой период), bantime (на сколько блокировать). Рекомендуемые значения: maxretry=5, findtime=600, bantime=3600.
Можно ли настроить fail2ban на вечные баны?
Да, для этого в bantime укажите большое значение (например, -1 означает вечный бан). Но это может быть неудобно, так как придётся вручную снимать блокировку.
Как разблокировать IP вручную?
Используйте команду: sudo fail2ban-client set sshd unbanip IP_АДРЕС. Замените sshd на имя вашего jail.
Будет ли fail2ban работать с firewalld?
Да, fail2ban поддерживает firewalld и iptables. В конфигурации можно выбрать действие через banaction, например, banaction = firewalld-ipset.
Хотите перейти сразу к рабочему доступу?
Если сценарий уже ясен и не хочется проходить все шаги вручную, оформите доступ и проверьте подключение на своем устройстве.
Получить доступ