Защита от подбора паролей с помощью fail2ban
Установка и настройка fail2ban для SSH, проверка блокировок и разблокировка адреса.
На этой странице
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 fail2banAlmaLinux и 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] содержит общие значения.
Узнайте публичный IP-адрес, с которого вы подключаетесь: откройте
https://ip.blackbox.md/ruи нажмите «Копировать» (Инструмент «Ваш публичный IP-адрес»). Если вы работаете из нескольких мест, например из офиса и из дома, запишите каждый адрес.В 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 тоже не нужны.
Откройте файл в редакторе:
nano /etc/fail2ban/jail.localЕсли в AlmaLinux или CentOS Stream появилось «nano: command not found», сначала установите редактор:
dnf install -y nanoВставьте текст ниже и замените
ВАШ_IPадресом из шага 1 (несколько адресов разделяются пробелом). Если файл уже существует, например вы создали его по чек-листу, не дублируйте разделы: допишите недостающие строки в существующие.[DEFAULT] ignoreip = 127.0.0.1/8 ::1 ВАШ_IP bantime = 1h findtime = 10m maxretry = 5 [sshd] enabled = trueТолько в Ubuntu и Debian, если на шаге 2 файла журнала не оказалось: добавьте в раздел
[sshd]под строкойenabled = trueтакую строку.backend = systemdСохраните файл и закройте редактор: в
nano— Ctrl + O, Enter, затем Ctrl + X.Если вы выполнили шаг 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Запуск и проверка
Проверьте конфигурацию. Правильный ответ — «OK: configuration test is successful»; в противном случае сообщение укажет файл и строку с ошибкой.
fail2ban-client -tВключите автозапуск и запустите службу, затем перезапустите её, чтобы она гарантированно прочитала
jail.local(в Ubuntu и Debian служба может работать уже с момента установки):systemctl enable --now fail2ban systemctl restart fail2banПроверьте список активных jail. В строке «Jail list» должен быть
sshd:fail2ban-client statusПроверьте защиту SSH:
fail2ban-client status sshdStatus 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-подключение с вашего компьютера отклоняется или зависает до тайм-аута, хотя из другой сети сервер отвечает. Есть четыре варианта:
- Дождитесь окончания блокировки (
bantime, в примере выше — один час). Перезагрузка сервера не поможет: fail2ban помнит действующие блокировки и восстанавливает их при запуске. - Подключитесь из другой сети, например через мобильный интернет телефона, снимите блокировку, как описано выше, и добавьте адрес в
ignoreip. - Если вы подключили AI-ассистента через токен с разрешением «Выполнять любые команды от root на моих серверах», попросите его выполнить команду разблокировки: она попадает на сервер через подключение BLACKBOX, а не с вашего адреса (Выполнение команд на сервере через AI).
- Напишите нам и укажите 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 на сервере.