Защита от брутфорса с fail2ban: установка и jail для SSH
Запустить на сервере одной командой (сначала проверьте содержимое скрипта ниже):
curl -sSL https://cp.lv/scripts/nastrojka-fail2ban.sh | sudo bash…или через wget:
wget -qO- https://cp.lv/scripts/nastrojka-fail2ban.sh | sudo bashСодержимое скрипта nastrojka-fail2ban.sh:
#!/usr/bin/env bash
# Установка fail2ban и jail для SSH (Ubuntu/Debian)
set -euo pipefail
# 1. Установка
sudo apt update && sudo apt install -y fail2ban
# 2. Локальная конфигурация (кавычки 'EOF' — секции пишутся дословно)
sudo tee /etc/fail2ban/jail.local > /dev/null << 'EOF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 1w
[sshd]
enabled = true
port = ssh
backend = systemd
maxretry = 4
bantime = 2h
EOF
# 3. Применение и проверка
sudo systemctl enable --now fail2ban
sudo systemctl restart fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd
echo "Готово: fail2ban защищает SSH от брутфорса."
fail2ban защищает сервер от перебора паролей: он читает логи, находит повторяющиеся неудачные входы и блокирует IP через firewall. Настройка сводится к установке пакета и созданию файла jail.local с включённым jail для SSH. Ниже — рабочая конфигурация.
Как это работает
fail2ban мониторит лог-файлы (например, попытки входа по SSH), сопоставляет строки с фильтрами (regex) и при превышении лимита неудач добавляет правило в iptables/nftables, блокируя нарушителя на заданное время.
Шаг 1. Установка
apt update
apt install -y fail2ban
systemctl enable --now fail2ban
На CentOS/AlmaLinux: dnf install -y fail2ban.
Шаг 2. Локальная конфигурация
Никогда не редактируйте jail.conf напрямую — он перезаписывается при обновлениях. Откройте /etc/fail2ban/jail.local в редакторе (sudo nano /etc/fail2ban/jail.local) и вставьте содержимое:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
port = ssh
maxretry = 4
bantime = 2h
Либо создайте файл целиком одной командой — скопируйте и вставьте в консоль (кавычки 'EOF' записывают секции дословно):
sudo tee /etc/fail2ban/jail.local > /dev/null << 'EOF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
port = ssh
maxretry = 4
bantime = 2h
EOF
Разбор параметров:
maxretry— сколько неудач до бана;findtime— окно времени, в котором считаются неудачи;bantime— как долго держать бан (-1— навсегда);ignoreip— белый список (добавьте свой домашний IP, чтобы не заблокировать себя).
Если SSH работает на нестандартном порту, укажите его номер вместо ssh:
[sshd]
enabled = true
port = 2222
Шаг 3. Применение
systemctl restart fail2ban
fail2ban-client status
Вывод покажет список активных jail. Детали по SSH:
fail2ban-client status sshd
Здесь видно число найденных попыток и текущие забаненные IP.
Прогрессивный бан за повторные атаки
Чтобы упорные нарушители банились всё дольше, включите рекурсивный режим в [DEFAULT]:
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 1w
Каждый повторный бан того же IP увеличивается вдвое, но не дольше недели.
Управление банами
Разбанить конкретный IP:
fail2ban-client set sshd unbanip 203.0.113.10
Забанить вручную:
fail2ban-client set sshd banip 203.0.113.10
Посмотреть журнал работы самого fail2ban:
tail -f /var/log/fail2ban.log
Проверка на systemd-логах
На современных дистрибутивах SSH пишет в journald, а не в /var/log/auth.log. Убедитесь, что backend читает journald — добавьте в [sshd]:
backend = systemd
Проверьте, что фильтр находит записи:
fail2ban-regex "systemd-journal[sshd]" /etc/fail2ban/filter.d/sshd.conf
Jail recidive: бан для рецидивистов
Отдельный jail recidive следит за самим логом fail2ban и надолго банит IP, которые попадаются снова и снова. Добавьте в jail.local:
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
bantime = 1w
findtime = 1d
maxretry = 5
Теперь адрес, забаненный 5 раз за сутки, отправляется в бан на неделю.
Оповещения на почту
fail2ban может присылать письмо при каждом бане. В [DEFAULT] укажите:
destemail = [email protected]
sender = [email protected]
action = %(action_mwl)s
action_mwl отправляет письмо с логами и whois нарушителя. Для отправки почты на сервере должен быть настроен MTA (например, postfix).
Защита веб-сервера
Помимо SSH, fail2ban защищает nginx. Пример jail против перебора на аутентификации:
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
Готовые фильтры лежат в /etc/fail2ban/filter.d/ — их можно подключать так же через jail.local.
Проверка эффективности
Сколько всего адресов забанено за всё время:
grep "Ban" /var/log/fail2ban.log | wc -l
Топ забаненных IP:
grep "Ban " /var/log/fail2ban.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head
Такой отчёт наглядно показывает, что защита реально отбивает атаки.
Частые вопросы
Не заблокирую ли я сам себя?
Добавьте свой постоянный IP в ignoreip. Если бана не избежать, разбаньте через консоль VPS (KVM), а не по SSH.
Работает ли fail2ban с nftables?
Да, укажите banaction = nftables-multiport в [DEFAULT], если сервер использует nftables.
Можно ли защитить не только SSH?
Да, есть готовые jail для nginx, postfix, dovecot и других — включаются так же в jail.local.
Как проверить, что jail реально работает?
Посмотрите fail2ban-client status sshd и /var/log/fail2ban.log — там видны найденные и забаненные адреса.
Сколько ресурсов потребляет? Минимум — это лёгкий демон на Python, читающий логи. Заметной нагрузки на VPS нет.
fail2ban — базовая защита любого сервера. Для проектов, где безопасность критична, берите VPS для VPN и безопасности или аренду VPS. Настройку доверьте Администрированию серверов.
