Fail2Ban для SSH: защита Linux-серверов от брутфорса
Меня зовут Семёнов Евгений Сергеевич, директор АйТи Фреш. За 15+ лет в Linux-администрировании Fail2Ban стал одним из инструментов-ветеранов, который я ставлю буквально первой командой после apt update. Он не заменяет ключи, 2FA и bastion, но закрывает главную дыру — постоянный шум брутфорса, который забивает логи и маскирует реальные инциденты. Разберём правильную настройку: джейлы, фильтры, действия и алерты.
Как работает Fail2Ban
Fail2Ban — демон, который в реальном времени парсит лог-файлы (auth.log, nginx access, dovecot) и сопоставляет их с фильтрами — регулярными выражениями. Когда фильтр сработал maxretry раз за findtime секунд с одного IP, срабатывает action — обычно добавление правила в iptables или nftables на bantime секунд.
У нас на практике на обычном VPS с открытым 22 портом приходит от 300 до 2000 попыток брутфорса в сутки. Fail2Ban режет это до единиц.
Установка на Ubuntu 22.04
sudo apt update
sudo apt install fail2ban
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
После установки демон уже работает, но с дефолтной конфигурацией. Никогда не редактируем /etc/fail2ban/jail.conf — переопределяем в jail.local.
Боевой jail.local
# /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8 10.0.0.0/8 203.0.113.5
bantime = 1h
findtime = 10m
maxretry = 4
backend = systemd
banaction = nftables-multiport
banaction_allports = nftables-allports
destemail = alerts@itfresh.ru
sender = fail2ban@srv01.itfresh.ru
action = %(action_mwl)s
[sshd]
enabled = true
port = 58722
maxretry = 3
findtime = 5m
bantime = 24h
[sshd-aggressive]
enabled = true
port = 58722
filter = sshd[mode=aggressive]
maxretry = 2
findtime = 1d
bantime = 30d
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
[nginx-badbots]
enabled = true
port = http,https
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 2
[recidive]
enabled = true
bantime = 1w
findtime = 1d
maxretry = 5
Что делает каждый джейл
| Джейл | Назначение | Агрессивность |
|---|---|---|
| sshd | Неудачный вход по паролю или ключу | Средняя |
| sshd-aggressive | Подозрительные протокольные сигнатуры | Высокая, длинный бан |
| nginx-http-auth | 401 на защищённых страницах | Средняя |
| nginx-badbots | Известные плохие User-Agent | Быстрый бан |
| recidive | Повторные нарушители — неделя бана | Меганизкая частота, серьёзные последствия |
Перевод на nftables
Начиная с Ubuntu 22.04 по умолчанию стоит nftables. Я всегда переключаю Fail2Ban на соответствующий backend — iptables-nft как прослойка работает, но медленнее и с нюансами.
banaction = nftables-multiport
banaction_allports = nftables-allports
# Проверка работы
sudo nft list ruleset | grep f2b
sudo fail2ban-client status sshd
Алерты в Telegram
Письма в почту теряются. Лично у меня бот в Telegram пишет в канал «серверные алерты», и я вижу бан каждый раз в течение секунд.
# /etc/fail2ban/action.d/telegram.conf
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = curl -s -X POST https://api.telegram.org/bot<TOKEN>/sendMessage \
-d chat_id=<CHATID> \
-d text="BAN <name>
IP: <ip>
Host: $(hostname)"
actionunban = curl -s -X POST https://api.telegram.org/bot<TOKEN>/sendMessage \
-d chat_id=<CHATID> \
-d text="UNBAN <name> <ip>"
[Init]
TOKEN = 123456:AAAA...
CHATID = -1001234567890
# Подключаем в jail.local
[sshd]
action = %(action_)s
telegram[name=SSH]
Мини-кейс: сеть небольших VPS
Прошлой весной клиент — студия дизайна с пятью VPS на разных хостингах — пожаловался: «серверы лагают, каждый день что-то». Разбор логов: на каждом хосте ежедневно по 1500–3000 попыток SSH-брутфорса, 250 попыток WP-login, около 70 атак на phpmyadmin. За 3 часа я поставил Fail2Ban на все 5 серверов с единым конфигом, подключил Telegram-алерты, вынес доступ за bastion на Dell Xeon Platinum 8280 в дата-центре МТС. За первую неделю забанено 1247 IP, атак на обычный продакшен прекратилось. Стоимость — 18 000 руб. за 1 день работы на 5 серверов.
Мониторинг и отладка
# Список активных джейлов
sudo fail2ban-client status
# Статус конкретного
sudo fail2ban-client status sshd
# Тест фильтра на лог-файле
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
# Разбанить IP
sudo fail2ban-client set sshd unbanip 1.2.3.4
# Забанить IP вручную
sudo fail2ban-client set sshd banip 1.2.3.4
Интеграция с SIEM
На серьёзных проектах я подключаю агент Wazuh — он видит все бан/анбан события и корректирует корреляцию с другими источниками. В результате один IP, баненый на 5 серверах, в SIEM подсвечивается как скоординированная атака.
Типичные ошибки
- Забыли ignoreip для своего IP. Бухгалтер ввёл пароль не с той раскладки трижды — сам админ улетает в бан. Обязательно белый список офисных IP.
- Слишком агрессивный maxretry=1. Любая опечатка — бан на сутки. Нормальное значение 3–5.
- bantime 60 секунд. Бессмысленно, бот вернётся. Минимум час, для recidive неделя-месяц.
- Не читать логи самого Fail2Ban.
/var/log/fail2ban.logсодержит инфу о загруженных джейлах и ошибках фильтров. - Дубли правил в iptables/nftables. Рестарт демона без чистки оставляет старые цепочки — периодически проверяйте
nft list ruleset.
Fail2Ban против CrowdSec
CrowdSec — современный конкурент. Плюсы: распределённые блок-листы между серверами, красивый CLI, поддержка HAProxy и Cloudflare. Минусы: сложнее поднять, тяжеловеснее. Для 1–10 серверов — Fail2Ban. Для 50+ — смотрите в сторону CrowdSec. Я в своём зоне ответственности пока держу Fail2Ban и не жалею.
Защитим ваши Linux-серверы от брутфорса
Установка Fail2Ban с правильной конфигурацией, Telegram-алерты, интеграция с SIEM, ежеквартальный аудит. От 12 000 руб. за 1–3 сервера, от 30 000 за инфраструктуру из 10+ хостов.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — частые вопросы о Fail2Ban
- Как Fail2Ban отличает бота от забывчивого пользователя?
- Никак. Работает по порогу: X неудач за Y секунд — бан. Важно задать разумные значения и белый список собственных IP.
- Забанил сам себя — как разбанить?
- Зайти с другого IP или через консоль хостинга и выполнить fail2ban-client set sshd unbanip 1.2.3.4.
- Fail2Ban замедляет сервер?
- Практически нет. Парсит хвост лог-файла, потребление CPU минимальное.
- Можно ли использовать Fail2Ban с nftables?
- Да, через banaction=nftables-multiport. Для современных систем это предпочтительный вариант.
- Какая альтернатива Fail2Ban для больших инфраструктур?
- CrowdSec — распределённый, делит блок-листы между серверами.