
Как настроить Fail2Ban для SSH на Ubuntu
Объясняем работу Fail2Ban, включаем защиту SSH, проверяем чтение журнала и блокировку тестового адреса, затем безопасно снимаем ban.
Содержание
Публичный SSH-сервер быстро начинает получать автоматические попытки входа. Fail2Ban читает сообщения об ошибках аутентификации и на ограниченное время блокирует адрес, с которого за короткий период пришло слишком много отказов.
Fail2Ban не проверяет пароли сам и не заменяет сетевой фильтр. Его настройка, называемая jail, связывает три вещи: журнал с событиями SSH, фильтр для распознавания отказа и действие, которое добавляет временное правило блокировки. Если программа читает не тот журнал или блокирует не тот порт, включённая служба не даёт ожидаемой защиты.
Сначала должны работать вход по SSH-ключу, запрет прямого входа root и UFW с разрешением реального SSH-порта. Fail2Ban — следующий слой, а не способ исправить небезопасный SSH.
Убедитесь, что сможете снять ошибочную блокировку
Оставьте текущую SSH-сессию открытой и проверьте вход в консоль VPS через панель хостера. Тестировать блокировку лучше с другого внешнего адреса, например через мобильное подключение, чтобы основной канал администрирования оставался доступным.
Узнайте итоговый порт SSH:
sudo sshd -T | grep '^port '
sshd -T выводит фактическую конфигурацию сервера с учётом подключённых файлов. Запишите число из ответа: оно понадобится в jail. Имя ssh в настройках Fail2Ban обычно означает стандартный TCP-порт 22 и не подходит, если SSH уже перенесён на другое значение.
Посмотрите несколько последних событий службы SSH:
sudo journalctl -u ssh.service --since '30 minutes ago' --no-pager
В журнале должны появляться недавние подключения и ошибки аутентификации. Если служба называется иначе или событий нет, сначала выясните, где конкретная система хранит журнал SSH. Fail2Ban не сможет распознать то, чего нет в выбранном источнике.
Установите Fail2Ban и проверьте службу
Обновите сведения о пакетах и установите Fail2Ban из репозитория Ubuntu:
sudo apt update
sudo apt install fail2ban
Первая команда загружает актуальные индексы, вторая устанавливает программу и готовые фильтры. Запустите службу сейчас и включите её при следующих загрузках:
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban --no-pager
Ожидается состояние active (running). Если служба не запустилась, не переходите к созданию jail: прочитайте сообщение в статусе и последние строки journalctl -u fail2ban.
Пакет устанавливает общие примеры в jail.conf и фильтры в filter.d. Убедитесь, что фильтр SSH присутствует:
ls -l /etc/fail2ban/filter.d/sshd.conf
Файл должен существовать и читаться. Его не нужно копировать или редактировать для обычного OpenSSH: проект Fail2Ban поддерживает готовые выражения вместе с пакетом.
Создайте небольшой локальный jail для SSH
Не меняйте /etc/fail2ban/jail.conf: при обновлении пакета локальные правки трудно отличить от новых значений поставщика. Откройте отдельный файл:
sudoedit /etc/fail2ban/jail.d/sshd.local
Для SSH на стандартном порту 22 начните с такой конфигурации:
[sshd]
enabled = true
port = 22
backend = systemd
findtime = 10m
maxretry = 5
bantime = 15m
Секция [sshd] включает готовый фильтр OpenSSH. backend = systemd указывает читать системный журнал. В течение findtime программа считает неудачные попытки одного адреса; после maxretry попыток действие блокирует его на bantime.
Числа 10m, 5 и 15m — спокойная отправная точка для проверки, а не универсальный стандарт. Очень маленький maxretry легко наказывает владельца за опечатку, а бессрочная блокировка затрудняет восстановление. После наблюдения значения можно изменить под реальный способ входа.
Если команда sshd -T показала другой порт, замените 22 именно этим числом. Не меняйте порт SSH и настройки Fail2Ban одновременно: при ошибке будет непонятно, какое изменение оборвало доступ.
Проверьте файл до перезапуска
До перезапуска попросите Fail2Ban прочитать итоговую конфигурацию и проверить синтаксис. Эта команда не применяет новый jail и поэтому безопасна для текущего соединения:
sudo fail2ban-client -t
Успешная проверка заканчивается сообщением Configuration test is successful. Ошибка содержит имя файла и параметра; исправьте её до перезапуска, иначе защита может остаться выключенной.
Теперь примените конфигурацию и посмотрите список работающих jail:
sudo systemctl restart fail2ban
sudo fail2ban-client status
В строке Jail list должен присутствовать sshd. Если список пуст или служба завершилась, снова откройте её журнал. Простое наличие файла sshd.local не доказывает, что он был принят.
Получите подробности именно по SSH:
sudo fail2ban-client status sshd
Здесь показываются число распознанных отказов, текущие блокировки и используемое действие. На новом jail счётчики могут быть нулевыми — это нормально, пока после запуска не было подходящих событий.
Убедитесь, что фильтр видит реальные отказы
Создайте одну заведомо неуспешную попытку с тестового адреса и сразу снова посмотрите журнал SSH. Не вводите рабочий пароль в случайном клиенте; достаточно указать несуществующего пользователя или неподходящий тестовый ключ.
После этого повторите статус jail:
sudo fail2ban-client status sshd
Значение Total failed должно увеличиться. Если журнал SSH содержит отказ, а счётчик не меняется, проверьте backend и версию готового фильтра. Не уменьшайте maxretry до единицы, пытаясь скрыть проблему чтения событий.
При создании собственного фильтра его проверяют отдельно на обезличенной копии реальных строк:
fail2ban-regex /path/to/test.log /etc/fail2ban/filter.d/custom.conf
Первый путь должен указывать на тестовый журнал без секретов и персональных данных, второй — на ваш фильтр. В отчёте изучают не только совпадения, но и пропущенные строки. Непроверенное регулярное выражение может не заметить атаку или извлечь чужой адрес из пользовательского текста и заблокировать невиновный узел.
Проведите контролируемую блокировку
Оставив основную сессию открытой, с тестового внешнего адреса создайте пять неудачных попыток в течение десяти минут. После достижения порога запросите статус и журнал Fail2Ban:
sudo fail2ban-client status sshd
sudo journalctl -u fail2ban --since '15 minutes ago' --no-pager
Тестовый адрес должен появиться в Banned IP list, а в журнале — событие Ban. Новые подключения с этого адреса перестанут доходить до SSH на время bantime. При этом новая сессия с основного адреса должна открываться как раньше.
Снимите тестовую блокировку, не дожидаясь таймера:
sudo fail2ban-client set sshd unbanip 203.0.113.10
Адрес 203.0.113.10 предназначен только для документации. Подставьте точный IP из строки Banned IP list. Повторный статус должен показать пустой список, а тестовое подключение — снова доходить до SSH.
Не превращайте исключения в обход защиты
Параметр ignoreip заставляет jail никогда не блокировать указанный адрес или сеть. Он оправдан для постоянного административного адреса только тогда, когда этот адрес действительно контролируется и исключение задокументировано.
Домашний IP может измениться, VPN используется несколькими людьми, а общий офисный адрес скрывает разные устройства. Широкое исключение создаёт место, где перебор не ограничивается. Для первого рабочего jail лучше сохранить консоль хостера и понятную команду unbanip, чем исключать крупные диапазоны «на всякий случай».
Оценивайте работу, а не число блокировок
Публичные адреса постоянно сканируют, поэтому десятки ban за сутки сами по себе не означают ни надёжную защиту, ни успешную атаку. Регулярно проверяйте другое:
- служба Fail2Ban работает после обновления и перезагрузки;
- jail
sshdвидит новые ошибки аутентификации; - правило блокирует фактический порт SSH;
- в журнале нет повторяющихся ошибок самого Fail2Ban;
- среди успешных входов нет неизвестных пользователей, ключей и адресов.
Fail2Ban реагирует на повторные отказы. Вход с украденным действующим ключом может быть успешным с первой попытки и не попасть под его условие. Поэтому следующий материал хаба посвящён проверке успешных входов и действий sudo.
Не включайте десятки готовых jail только из-за их наличия в пакете. Каждый новый jail имеет смысл, если сервис действительно открыт, журнал содержит надёжный адрес клиента, фильтр проверен на реальных строках, а команда разблокировки известна. Для сайта за reverse proxy особенно важно не принять адрес прокси за адрес каждого посетителя.
Как вернуть рабочую конфигурацию
Если после изменения Fail2Ban не запускается, сохраните текущую SSH-сессию и снова выполните fail2ban-client -t. Верните последний небольшой файл sshd.local, а не отключайте UFW и безопасные настройки SSH одновременно.
Если собственный адрес оказался заблокирован, войдите через открытую сессию или консоль и выполните unbanip. При необходимости временно остановить только Fail2Ban используйте sudo systemctl stop fail2ban, исправьте jail, проверьте синтаксис и запустите службу снова. Сетевой фильтр UFW при этом должен оставаться включённым.
Первоисточники
Самопроверка
Проверьте, что материал усвоен
Ответьте на все вопросы. Результат сохранится только в этом браузере и будет учтён в статистике прочитанных материалов.
Разбираем коротко
Частые вопросы
Нужен ли Fail2Ban, если вход по паролю уже отключён?
Он может уменьшить поток автоматических попыток и нагрузку на журнал, но его роль становится менее важной. Fail2Ban не защитит от входа с украденным действующим ключом, поэтому ключи, обновления и ограниченные права остаются основой.
Почему настройки не меняют в jail.conf?
jail.conf устанавливается вместе с пакетом и может измениться при обновлении. Локальные отличия хранят в jail.local или в небольших файлах jail.d с расширением .local.
Как снять блокировку со своего IP-адреса?
Из сохранённой SSH-сессии или консоли хостера выполните fail2ban-client set sshd unbanip с точным адресом. Затем исправьте причину, а не добавляйте широкий диапазон в исключения.


