· 14 мин чтения

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-auth401 на защищённых страницахСредняя
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 подсвечивается как скоординированная атака.

Типичные ошибки

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 — распределённый, делит блок-листы между серверами.

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.