Fail2ban: защита от брутфорса
SSH на любом публичном VPS почти сразу начинают сканировать боты — в логе аутентификации быстро накапливаются десятки чужих попыток входа с перебором пароля. Fail2ban сам следит за такими логами и временно банит IP-адрес в файрволе после нескольких неудачных попыток подряд. В этой статье вы установите fail2ban, настроите jail sshd в jail.local (bantime, findtime, maxretry), проверите его статус через fail2ban-client status sshd и научитесь вручную снимать бан с IP-адреса.
Что понадобится
- VPS ForestsNet Cloud на Ubuntu 22.04/24.04, Debian 11/12 или AlmaLinux/Rocky Linux 8/9.
- Доступ по SSH под
rootлибо пользователем с правамиsudo.
ℹ️ Совет: команды ниже даны с sudo. Если вы уже подключены как root и sudo в системе нет — выполняйте те же команды без префикса sudo.
Шаг 1. Установите fail2ban
Ubuntu / Debian
sudo apt update
sudo apt install -y fail2banПакет fail2ban есть в стандартном репозитории — подключать сторонние источники не нужно.
AlmaLinux / Rocky Linux
Fail2ban не входит в стандартные репозитории AlmaLinux/Rocky — сначала подключите EPEL:
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 настраивает это автоматически.
Включите и проверьте службу
sudo systemctl enable --now fail2ban
sudo systemctl status fail2banВ статусе должно быть active (running). Заодно проверьте версию клиента:
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 имеют приоритет.
Создайте файл:
sudo nano /etc/fail2ban/jail.localИ заполните его так:
[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— jailsshdв 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, бан будет появляться в статусе, но блокировать не тот порт, и атака продолжится.
Примените изменения:
sudo systemctl restart fail2banℹ️ Совет: после первого включения jail (когда меняется enabled) надёжнее полный systemctl restart fail2ban, как выше. Для мелких правок уже работающего jail (например, поменяли только maxretry) обычно достаточно sudo fail2ban-client reload — он не прерывает текущий мониторинг.
Шаг 3. Проверьте статус jail sshd
Список активных jail'ов:
sudo fail2ban-client statusStatus
|- Number of jail: 1
`- Jail list: sshdПодробности по конкретному jail:
sudo fail2ban-client status sshdStatus 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.10Currently 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-адрес
Если под бан попал нужный адрес (например, ваш собственный после серии опечаток), снимите его вручную:
sudo fail2ban-client set sshd unbanip 203.0.113.10Проверьте, что адрес исчез из списка:
sudo fail2ban-client status sshdBanned 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».