fail2ban против брутфорса SSH
Как только сервер выходит в интернет, боты начинают долбить порт 22 тысячами паролей в сутки. fail2ban читает логи, ловит неудачные попытки и банит IP на файрволе. Настроим надёжную защиту.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Принцип работы
fail2ban мониторит логи сервисов (SSH, nginx, почта) по регулярным выражениям — «фильтрам». Когда с одного IP набирается N неудачных попыток за окно времени, срабатывает «jail»: адрес добавляется в правило firewall и блокируется на заданный срок. По истечении срока бан снимается автоматически, поэтому список заблокированных не растёт бесконечно.
Это не замена ключам и файрволу, а дополнительный слой, который отсекает автоматизированный перебор и разгружает логи. Он состоит из трёх частей: фильтр (что искать в логе), jail (какой лог читать и когда банить) и action (как именно блокировать — обычно через iptables или nftables).
Разумная стратегия защиты SSH строится в несколько эшелонов: вход только по ключу, нестандартный порт по желанию, файрвол и уже поверх — fail2ban. Каждый слой независим, и пробить все сразу автоматизированному боту практически нереально.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать защищённый VPSУстановка
На Debian/Ubuntu:
apt update
apt install -y fail2ban
systemctl enable --now fail2ban
Никогда не редактируйте jail.conf напрямую — при обновлении пакета он перезапишется. Создайте собственный jail.local, он имеет приоритет:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Правильнее держать в jail.local только изменённые параметры, а не полную копию — так проще читать конфиг.
Настройка jail для SSH
Откройте /etc/fail2ban/jail.local и приведите секцию к такому виду:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 203.0.113.5
[sshd]
enabled = true
port = ssh
backend = systemd
Разбор: maxretry — сколько промахов допускается, findtime — за какое окно они считаются, bantime — на сколько банить. ignoreip — белый список (обязательно впишите свой офисный/домашний IP, чтобы не забанить себя).
Для повторных нарушителей включите нарастающие баны — каждый следующий бан того же IP становится длиннее предыдущего:
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 168h
fail2ban умеет защищать не только SSH. Тем же механизмом ловят перебор паролей на веб-панелях, попытки эксплойтов в логах nginx или флуд на почтовый сервер. Достаточно включить соответствующий jail (nginx-http-auth, postfix-sasl и другие) — фильтры для популярных сервисов идут в комплекте, лежат в /etc/fail2ban/filter.d/.
Применение и мониторинг
После правки перечитайте конфиг и проверьте статус:
fail2ban-client reload
fail2ban-client status
fail2ban-client status sshd
Второй вывод покажет число текущих и всех банов и список заблокированных IP. Разбанить адрес вручную:
fail2ban-client set sshd unbanip 198.51.100.23
Живой лог работы показывает каждое обнаружение и бан в реальном времени — удобно держать открытым при отладке фильтров:
tail -f /var/log/fail2ban.log
Проверить, что бан реально применился на файрволе, можно напрямую (для nftables):
nft list set inet f2b-table addr-set-sshd
Частые ошибки
- Забанил себя — добавьте свой IP в ignoreip заранее. Если уже заблокированы, зайдите через веб-консоль (KVM) панели и снимите бан.
- Jail не ловит — на systemd-дистрибутивах нужен backend = systemd, иначе fail2ban читает несуществующий /var/log/auth.log.
- Порт нестандартный — если SSH переехал на 2222, укажите port = 2222 в секции [sshd].
На VPS в MAATRIX есть аварийный доступ через панель, так что даже случайный самобан не оставит вас без сервера — снимете блокировку и вернётесь.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать защищённый VPSОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Нужен ли fail2ban, если вход только по ключу?
Да, как второй слой: он режет шум в логах и нагрузку от ботов, даже если пароль угадать нельзя. Плюс защищает другие сервисы.
Чем банит fail2ban — iptables или nftables?
Зависит от системы. По умолчанию action использует доступный бэкенд (nftables на новых Debian/Ubuntu). Менять обычно не нужно.
Как забанить навсегда?
Установите bantime = -1 в нужном jail. Но лучше нарастающие баны — постоянные списки со временем распухают.