MHOSTMHOST

Fail2ban: защита от брутфорса

SSH на любом публичном VPS почти сразу начинают сканировать боты — в логе аутентификации быстро накапливаются десятки чужих попыток входа с перебором пароля. Fail2ban сам следит за такими логами и временно банит IP-адрес в файрволе после нескольких неудачных попыток подряд. В этой статье вы установите fail2ban, настроите jail sshd в jail.local (bantime, findtime, maxretry), проверите его статус через fail2ban-client status sshd и научитесь вручную снимать бан с IP-адреса.

Что понадобится

  • VPS mHost на Ubuntu 22.04/24.04, Debian 11/12 или AlmaLinux/Rocky Linux 8/9.
  • Доступ по SSH под root либо пользователем с правами sudo.
Совет: команды ниже даны с sudo. Если вы уже подключены как root и sudo в системе нет — выполняйте те же команды без префикса sudo.

Шаг 1. Установите fail2ban

Ubuntu / Debian

bash
sudo apt update
sudo apt install -y fail2ban

Пакет fail2ban есть в стандартном репозитории — подключать сторонние источники не нужно.

AlmaLinux / Rocky Linux

Fail2ban не входит в стандартные репозитории AlmaLinux/Rocky — сначала подключите EPEL:

bash
sudo dnf install -y epel-release
sudo dnf install -y fail2ban fail2ban-systemd fail2ban-firewalld
Совет: fail2ban-systemd и fail2ban-firewalld — не лишние пакеты. На AlmaLinux/Rocky jail sshd по умолчанию читает не файл лога, а журнал systemd — для этого нужны Python-биндинги из fail2ban-systemd. А банить IP-адреса fail2ban должен через firewalld — штатный файрвол этих дистрибутивов, — иначе он вставит правила в iptables мимо firewalld, и бан будет числиться в статусе, а трафик реально пропускаться не перестанет. Пакет fail2ban-firewalld настраивает это автоматически.

Включите и проверьте службу

bash
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban

В статусе должно быть active (running). Заодно проверьте версию клиента:

bash
fail2ban-client version
Совет: на Debian/Ubuntu пакет fail2ban сразу включает jail sshd (через /etc/fail2ban/jail.d/defaults-debian.conf) — SSH уже под защитой настройками по умолчанию. Но ниже мы всё равно явно опишем jail в jail.local, чтобы конфигурация была понятной и одинаковой на всех дистрибутивах.

Шаг 2. Настройте jail sshd в jail.local

Важно: не редактируйте /etc/fail2ban/jail.conf напрямую — это файл из пакета, он будет переписан при обновлении fail2ban. Все свои настройки кладите в /etc/fail2ban/jail.local — так рекомендует сама шапка jail.conf, и настройки из jail.local имеют приоритет.

Создайте файл:

bash
sudo nano /etc/fail2ban/jail.local

И заполните его так:

ini
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1

[sshd]
enabled  = true
bantime  = 1h
findtime = 10m
maxretry = 5

Что означают параметры:

  • maxretry — сколько неудачных попыток входа допускается для одного IP;
  • findtime — за какой промежуток времени они учитываются (если между попытками проходит больше findtime, счётчик для этого IP начинается заново);
  • bantime — на сколько времени блокируется IP, если он превысил maxretry попыток в пределах findtime. Время можно писать числом секунд или с суффиксом: m — минуты, h — часы, d — дни, w — недели;
  • ignoreip — список адресов, которые fail2ban никогда не забанит; в jail.conf эта опция закомментирована по умолчанию, так что без неё не защищён даже localhost;
  • enabled — jail sshd в jail.conf выключен по умолчанию, enabled = true включает его именно здесь, в jail.local.
Важно: ignoreip = 127.0.0.1/8 ::1 защищает от бана только localhost — ваш собственный рабочий IP-адрес это не спасёт. Если у вас есть постоянный домашний/офисный IP, добавьте его через пробел: ignoreip = 127.0.0.1/8 ::1 203.0.113.5 — иначе несколько опечаток в пароле подряд могут забанить вас самих.
Совет: если SSH на сервере слушает нестандартный порт (не 22), добавьте в ту же секцию [sshd] строку port = <ваш порт>. Fail2ban передаёт этот порт действию блокировки — если оставить port = ssh (то есть 22) при реальном порте, скажем, 2222, бан будет появляться в статусе, но блокировать не тот порт, и атака продолжится.

Примените изменения:

bash
sudo systemctl restart fail2ban
Совет: после первого включения jail (когда меняется enabled) надёжнее полный systemctl restart fail2ban, как выше. Для мелких правок уже работающего jail (например, поменяли только maxretry) обычно достаточно sudo fail2ban-client reload — он не прерывает текущий мониторинг.

Шаг 3. Проверьте статус jail sshd

Список активных jail'ов:

bash
sudo fail2ban-client status
text
Status
|- Number of jail:      1
`- Jail list:   sshd

Подробности по конкретному jail:

bash
sudo fail2ban-client status sshd
text
Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  |- Total failed:     13
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     2
   `- Banned IP list:   203.0.113.10
  • Currently failed / Total failed — сколько неудачных попыток входа фильтр видит прямо сейчас (в пределах текущего findtime) и сколько всего с момента запуска jail;
  • Currently banned / Total banned — сколько IP забанено прямо сейчас и сколько всего было забанено;
  • Banned IP list — конкретные забаненные адреса.
Совет: на AlmaLinux/Rocky вместо строки File list: /var/log/auth.log вы увидите Journal matches: _SYSTEMD_UNIT=sshd.service... — это нормально, там логи читаются из журнала systemd, а не из файла (см. шаг 1).

Шаг 4. Разбаньте IP-адрес

Если под бан попал нужный адрес (например, ваш собственный после серии опечаток), снимите его вручную:

bash
sudo fail2ban-client set sshd unbanip 203.0.113.10

Проверьте, что адрес исчез из списка:

bash
sudo fail2ban-client status sshd

Banned IP list больше не должен содержать этот IP.

Совет: если не помните, в каком именно jail забанен адрес, используйте sudo fail2ban-client unban 203.0.113.10 — эта форма снимает бан сразу во всех jail'ах и из базы fail2ban.
Готово: jail sshd включён, бан по вашим bantime/findtime/maxretry работает, а разбанить нужный IP можно в любой момент одной командой.

Что дальше

Fail2ban умеет защищать не только SSH — в /etc/fail2ban/filter.d/ уже есть готовые фильтры для Nginx, Apache, Postfix, MySQL и десятков других сервисов; чтобы включить любой из них, добавьте в jail.local свою секцию [имя-jail] с enabled = true — по тому же принципу, что и [sshd] выше. Для IP, которые попадаются повторно уже после разбана, в комплекте есть отдельный jail recidive с более долгим баном — это отдельная тема для настройки. Банит fail2ban напрямую через файрвол сервера (iptables/nftables/firewalld), поэтому он спокойно работает вместе с ufw — если файрвол на сервере ещё не настроен, см. статью «Настройка файрвола UFW».