BLACKBOXЦентр помощи

Защита от подбора паролей с помощью fail2ban

Установка и настройка fail2ban для SSH, проверка блокировок и разблокировка адреса.

общееОбновлено 2026-10-09~9 мин чтения
На этой странице

fail2ban читает журналы сервера и временно блокирует IP-адреса, с которых за короткое время слишком много раз не удалось войти. Его устанавливают и настраивают на самом сервере — по SSH, под root (Подключение к серверу по SSH (Windows, macOS, Linux)). BLACKBOX не устанавливает fail2ban на новые серверы, а в панели app.blackbox.md настроек для него нет.

Доступно: всем, у кого есть root-доступ по SSH к серверу BLACKBOX с Ubuntu, Debian, AlmaLinux или CentOS Stream. На серверах с отметкой «Обслуживается» на странице «Мои серверы» изменения вносит команда BLACKBOX — напишите нам.

Когда нужен fail2ban

Боты в интернете без перерыва перебирают пароли на SSH-порту любого публичного сервера. Польза от fail2ban зависит от отметки в карточке сервера на странице «Мои серверы»:

Отметка Ситуация Что делает fail2ban
«Пароль + ключ» Пароль root работает по SSH, и его можно подобрать Блокирует адреса, с которых подбирают пароль. Рекомендуется.
«Только ключ» SSH принимает только ключи, пароль подобрать нельзя В основном убирает шум из журналов и снижает нагрузку от ботов. Тоже рекомендуется.

Надёжнее всего — вход только по ключу: Включение и отключение входа по паролю по SSH. fail2ban дополняет его, но не заменяет. Место fail2ban среди остальных шагов защиты описано в статье Защита нового сервера: чек-лист. Если на сервере установлена панель управления (тарифы «VPS hosting»), сначала уточните у поддержки: у панели может быть собственный fail2ban.

Установка

Ubuntu и Debian

apt update
apt install -y fail2ban

AlmaLinux и CentOS Stream

fail2ban устанавливается из репозитория EPEL:

dnf install -y epel-release
dnf install -y fail2ban

Настройка в jail.local

Настройки по умолчанию хранятся в /etc/fail2ban/jail.conf. Не меняйте этот файл: обновление пакета может его перезаписать. Свои настройки пишите в /etc/fail2ban/jail.local: он читается после jail.conf и файлов .conf из /etc/fail2ban/jail.d/ и имеет приоритет над ними. Каждый раздел защищает одну службу и называется jail: [sshd] — для SSH, [nginx-http-auth] — для nginx и т. д. Раздел [DEFAULT] содержит общие значения.

  1. Узнайте публичный IP-адрес, с которого вы подключаетесь: откройте https://ip.blackbox.md/ru и нажмите «Копировать» (Инструмент «Ваш публичный IP-адрес»). Если вы работаете из нескольких мест, например из офиса и из дома, запишите каждый адрес.

  2. В Ubuntu и Debian проверьте, есть ли файл журнала SSH:

    ls -l /var/log/auth.log

    Если команда выводит «No such file or directory», система хранит журналы только в журнале systemd (например, в Debian 12) — тогда выполните и шаг 5. В AlmaLinux и CentOS Stream пропустите этот шаг: там fail2ban по умолчанию читает журнал systemd, поэтому шаги 5 и 7 тоже не нужны.

  3. Откройте файл в редакторе:

    nano /etc/fail2ban/jail.local

    Если в AlmaLinux или CentOS Stream появилось «nano: command not found», сначала установите редактор:

    dnf install -y nano
  4. Вставьте текст ниже и замените ВАШ_IP адресом из шага 1 (несколько адресов разделяются пробелом). Если файл уже существует, например вы создали его по чек-листу, не дублируйте разделы: допишите недостающие строки в существующие.

    [DEFAULT]
    ignoreip = 127.0.0.1/8 ::1 ВАШ_IP
    bantime = 1h
    findtime = 10m
    maxretry = 5
    
    [sshd]
    enabled = true
  5. Только в Ubuntu и Debian, если на шаге 2 файла журнала не оказалось: добавьте в раздел [sshd] под строкой enabled = true такую строку.

    backend = systemd
  6. Сохраните файл и закройте редактор: в nano — Ctrl + O, Enter, затем Ctrl + X.

  7. Если вы выполнили шаг 5, установите модуль, который нужен для backend = systemd. Обычно он уже устанавливается вместе с fail2ban — тогда команда просто это подтвердит.

    apt install -y python3-systemd
Параметр Что делает Значение в примере
ignoreip Адреса и сети, которые никогда не блокируются. 127.0.0.1/8 ::1 — сам сервер. Можно указывать и сети, например 198.51.100.0/24. ваш адрес
bantime Сколько длится блокировка. Единицы: m (минуты), h (часы), d (дни). 1 час (по умолчанию 10 минут)
findtime Интервал, за который считаются неудачные попытки. 10 минут (как по умолчанию)
maxretry Сколько неудачных попыток за findtime приводят к блокировке. 5 (как по умолчанию)
bantime.increment Необязательно, в [DEFAULT]. При значении true каждая следующая блокировка того же адреса длится дольше предыдущей. —
enabled В [sshd]: включает защиту SSH. true
backend В [sshd]: systemd означает, что fail2ban читает журнал systemd. В AlmaLinux и CentOS Stream это и так значение по умолчанию. В Ubuntu и Debian его добавляют, только если нет файла журнала. только на шаге 5

Важно Добавьте свой адрес в ignoreip до запуска fail2ban. Иначе несколько неудачных входов с вашего компьютера закроют вам доступ к серверу. Не закрывайте текущую SSH-сессию, пока не убедитесь, что можете подключиться из нового терминала. У многих домашних и мобильных подключений адрес динамический и меняется: если подключиться не получается, снова проверьте адрес на ip.blackbox.md.

AlmaLinux и CentOS Stream: как применяется блокировка

В этих системах пакет fail2ban устанавливает вместе с собой firewalld и блокирует адреса через него. На новом сервере firewalld не запущен, а без него блокировки не срабатывают. Проверьте:

systemctl is-active firewalld
Ответ Что делать
active Ничего: блокировки добавляются в firewalld.
inactive или другой ответ Добавьте в раздел [DEFAULT] файла jail.local две строки ниже — тогда fail2ban будет блокировать адреса напрямую через nftables. Другой вариант — запустить и настроить firewalld: Файрвол: сетевая фильтрация и ufw/firewalld на сервере.
banaction = nftables-multiport
banaction_allports = nftables-allports

Если вы не пользуетесь firewalld, проверьте также, не включён ли его автозапуск:

systemctl is-enabled firewalld

Если ответ enabled, отключите автозапуск. Иначе после перезагрузки firewalld запустится с правилами по умолчанию: они пропускают SSH, но закрывают порты сайтов 80 и 443.

systemctl disable firewalld

Запуск и проверка

  1. Проверьте конфигурацию. Правильный ответ — «OK: configuration test is successful»; в противном случае сообщение укажет файл и строку с ошибкой.

    fail2ban-client -t
  2. Включите автозапуск и запустите службу, затем перезапустите её, чтобы она гарантированно прочитала jail.local (в Ubuntu и Debian служба может работать уже с момента установки):

    systemctl enable --now fail2ban
    systemctl restart fail2ban
  3. Проверьте список активных jail. В строке «Jail list» должен быть sshd:

    fail2ban-client status
  4. Проверьте защиту SSH:

    fail2ban-client status sshd
    Status for the jail: sshd
    |- Filter
    |  |- Currently failed: 2
    |  |- Total failed:     57
    |  `- File list:        /var/log/auth.log
    `- Actions
       |- Currently banned: 1
       |- Total banned:     9
       `- Banned IP list:   203.0.113.45
Поле Что показывает
«Currently failed» Сколько адресов с неудачными попытками за findtime ещё не заблокированы
«Total failed» Сколько неудачных попыток учтено с момента запуска fail2ban
«File list» или «Journal matches» Откуда fail2ban читает журнал: из файла или, при backend = systemd, из журнала systemd
«Currently banned», «Total banned», «Banned IP list» Сколько адресов заблокировано сейчас, сколько блокировок было с момента запуска fail2ban и какие адреса заблокированы сейчас

История блокировок и ошибки записываются в журнал fail2ban — обычно это файл /var/log/fail2ban.log. Последние блокировки и разблокировки:

grep -E "(Ban|Unban) " /var/log/fail2ban.log | tail -n 20

Если такого файла нет, смотрите журнал службы в systemd:

journalctl -u fail2ban -n 50

Проверьте, что блокировка работает

Один раз убедитесь, что блокировка действительно срабатывает. Для проверки возьмите 203.0.113.10 — адрес, зарезервированный для документации, он никому не принадлежит:

fail2ban-client set sshd banip 203.0.113.10
fail2ban-client status sshd
tail -n 20 /var/log/fail2ban.log
fail2ban-client set sshd unbanip 203.0.113.10

Адрес должен появиться в «Banned IP list», а в журнале после строки с Ban 203.0.113.10 не должно быть строк с ERROR (если файла журнала нет, используйте команду journalctl выше). Если ошибки есть, смотрите раздел «Частые проблемы» ниже.

Разблокировка адреса

Снимите блокировку SSH с адреса:

fail2ban-client set sshd unbanip IP_АДРЕС

Или сразу во всех jail:

fail2ban-client unban IP_АДРЕС

Чтобы адрес больше не блокировался, добавьте его в ignoreip в файле /etc/fail2ban/jail.local и перезапустите fail2ban:

systemctl restart fail2ban

Если вы заблокировали собственный адрес

Признак: SSH-подключение с вашего компьютера отклоняется или зависает до тайм-аута, хотя из другой сети сервер отвечает. Есть четыре варианта:

  1. Дождитесь окончания блокировки (bantime, в примере выше — один час). Перезагрузка сервера не поможет: fail2ban помнит действующие блокировки и восстанавливает их при запуске.
  2. Подключитесь из другой сети, например через мобильный интернет телефона, снимите блокировку, как описано выше, и добавьте адрес в ignoreip.
  3. Если вы подключили AI-ассистента через токен с разрешением «Выполнять любые команды от root на моих серверах», попросите его выполнить команду разблокировки: она попадает на сервер через подключение BLACKBOX, а не с вашего адреса (Выполнение команд на сервере через AI).
  4. Напишите нам и укажите IP-адрес сервера и ваш IP-адрес: Как связаться с поддержкой BLACKBOX.

Внимание Веб-консоли или VNC, через которые можно попасть на сервер в обход блокировки, у клиентов нет. Поэтому добавьте свой адрес в ignoreip до запуска fail2ban.

Защита для nginx (необязательно)

Если на сервере работает nginx (Веб-сервер с HTTPS: nginx или Apache и Let's Encrypt), в fail2ban есть готовые фильтры. Они читают журналы ошибок nginx (/var/log/nginx/*error.log) и блокируют порты 80 и 443.

Jail Что блокирует Когда включать
nginx-http-auth Адреса, с которых раз за разом вводят неверное имя пользователя или пароль на страницах с HTTP-аутентификацией (auth_basic) Если у вас есть такие страницы, например панель администратора
nginx-limit-req Адреса, которые раз за разом превышают лимит запросов, заданный в nginx Только если вы настроили limit_req_zone и limit_req; без них в журнале нечего отслеживать

Добавьте в конец /etc/fail2ban/jail.local только нужные разделы:

[nginx-http-auth]
enabled = true

[nginx-limit-req]
enabled = true

Затем проверьте конфигурацию, перезапустите службу и посмотрите состояние нового jail:

fail2ban-client -t
systemctl restart fail2ban
fail2ban-client status nginx-http-auth

Если сайты пишут журнал ошибок в другое место, добавьте в раздел строку logpath = ПУТЬ_К_ЖУРНАЛУ.

Примечание Если домен работает через прокси Cloudflare (оранжевое облако), запросы приходят с адресов Cloudflare, а не напрямую от посетителей. Блокировка на сервере тогда не остановит атакующего и может заблокировать сами адреса Cloudflare. Для таких доменов не включайте jail для nginx — пользуйтесь средствами защиты в аккаунте Cloudflare.

Частые проблемы

Начните с этих команд: первая показывает ошибки конфигурации, остальные — состояние службы.

fail2ban-client -t
systemctl status fail2ban
journalctl -u fail2ban -n 50
Сообщение Причина Что делать
Failed to access socket path: …/fail2ban.sock. Is fail2ban running? Служба не запущена, обычно из-за ошибки в конфигурации Исправьте ошибку, которую показала первая команда выше, и перезапустите службу. Если вы только что её запустили, подождите несколько секунд и повторите команду
Have not found any log file for sshd jail Нет файла журнала SSH (Ubuntu, Debian) Выполните шаги 5 и 7 из раздела «Настройка в jail.local»
Have not found any log file for nginx-http-auth jail (или nginx-limit-req) nginx не установлен или его журналы лежат в другом месте Удалите раздел из jail.local или добавьте logpath
В журнале fail2ban при блокировке: iptables: not found Способ блокировки по умолчанию использует iptables, а он не установлен (такое бывает в Debian) Установите пакет iptables и перезапустите fail2ban
В журнале fail2ban при блокировке: FirewallD is not running В AlmaLinux или CentOS Stream остановлен firewalld Следуйте разделу «AlmaLinux и CentOS Stream: как применяется блокировка»

Частые вопросы

У сервера отметка «Только ключ». Нужен ли fail2ban? Да. Пароль подобрать нельзя, но боты продолжают подключаться и засорять журналы. fail2ban блокирует их после нескольких попыток, и в журналах становится меньше шума, а на сервере — меньше нагрузки.

Показывает ли панель, работает ли fail2ban? Для серверов, заказанных на blackbox.md, — нет: страница «Мониторинг» показывает нагрузку серверов с услугой «Мониторинг» (CPU, ОЗУ, диск), а не состояние fail2ban (Страница «Мониторинг»). Проверяйте на сервере командами из раздела «Запуск и проверка». Для серверов компании, которые обслуживает BLACKBOX, на странице «Обзор» есть плашка «Нет fail2ban» и столбец «fail2ban» (Страница «Обзор» (Overview)).

Защищает ли fail2ban от DDoS-атак? Нет. fail2ban реагирует на неудачные входы и ошибки в журналах, отдельно для каждого адреса. Если сервер или сайт атакуют, прочитайте статью Сервер взломан или атакован: что делать и напишите нам.

Можно ли использовать fail2ban вместе с ufw или firewalld? Да. fail2ban добавляет собственные правила блокировки, отдельно от ваших правил файрвола. Сетевая фильтрация, которой управляет BLACKBOX, работает независимо от них: Файрвол: сетевая фильтрация и ufw/firewalld на сервере.

Не нашли ответ?Напишите нам — служба поддержки ответит. support@blackbox.md
Открыть тикет