fail2ban против брутфорса SSH
Как только сервер выходит в интернет, боты начинают долбить порт 22 тысячами паролей в сутки. fail2ban читает логи, ловит неудачные попытки и банит IP на файрволе. Настроим надёжную защиту.
Принцип работы
['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\napt install -y fail2ban\nsystemctl 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]\nbantime = 1h\nfindtime = 10m\nmaxretry = 5\nignoreip = 127.0.0.1/8 203.0.113.5\n\n[sshd]\nenabled = true\nport = ssh\nbackend = systemd', 'Разбор: maxretry — сколько промахов допускается, findtime — за какое окно они считаются, bantime — на сколько банить. ignoreip — белый список (обязательно впишите свой офисный/домашний IP, чтобы не забанить себя).', 'Для повторных нарушителей включите нарастающие баны — каждый следующий бан того же IP становится длиннее предыдущего:', 'bantime.increment = true\nbantime.factor = 2\nbantime.maxtime = 168h', 'fail2ban умеет защищать не только SSH. Тем же механизмом ловят перебор паролей на веб-панелях, попытки эксплойтов в логах nginx или флуд на почтовый сервер. Достаточно включить соответствующий jail (nginx-http-auth, postfix-sasl и другие) — фильтры для популярных сервисов идут в комплекте, лежат в /etc/fail2ban/filter.d/.']
Применение и мониторинг
['После правки перечитайте конфиг и проверьте статус:', 'fail2ban-client reload\nfail2ban-client status\nfail2ban-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 за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать защищённый VPSЧастые вопросы
Нужен ли fail2ban, если вход только по ключу?
Да, как второй слой: он режет шум в логах и нагрузку от ботов, даже если пароль угадать нельзя. Плюс защищает другие сервисы.
Чем банит fail2ban — iptables или nftables?
Зависит от системы. По умолчанию action использует доступный бэкенд (nftables на новых Debian/Ubuntu). Менять обычно не нужно.
Как забанить навсегда?
Установите bantime = -1 в нужном jail. Но лучше нарастающие баны — постоянные списки со временем распухают.