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.
Шаг 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Включите и проверьте службу
sudo systemctl enable --now fail2ban
sudo systemctl status fail2banВ статусе должно быть active (running). Заодно проверьте версию клиента:
fail2ban-client versionШаг 2. Настройте jail sshd в 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.
Примените изменения:
sudo systemctl restart fail2banШаг 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— конкретные забаненные адреса.
Шаг 4. Разбаньте IP-адрес
Если под бан попал нужный адрес (например, ваш собственный после серии опечаток), снимите его вручную:
sudo fail2ban-client set sshd unbanip 203.0.113.10Проверьте, что адрес исчез из списка:
sudo fail2ban-client status sshdBanned IP list больше не должен содержать этот 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».