Кожен публічний VPS щодня зазнає тисяч спроб підбору паролів SSH. Fail2ban аналізує логи і автоматично блокує атакуючі IP-адреси.
Встановлення Fail2ban
sudo apt update
sudo apt install -y fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Налаштування захисту SSH
Створіть локальний конфіг (не редагуйте jail.conf — він перезаписується при оновленнях):
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
ignoreip = 127.0.0.1/8 ВАША_ДОМАШНЯ_IP
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
sudo systemctl restart fail2ban
Що означає кожен параметр
| Параметр | Значення у прикладі | Сенс |
|---|---|---|
| bantime | 3600 (для sshd — 86400) | На скільки секунд блокується IP після перевищення ліміту |
| findtime | 600 | Вікно часу в секундах, за яке рахуються невдалі спроби |
| maxretry | 5 (для sshd — 3) | Скільки невдалих спроб допустимо в межах findtime |
| ignoreip | 127.0.0.1/8 і ваша IP | Адреси, які ніколи не блокуються |
Секція [sshd] перевизначає maxretry і bantime із [DEFAULT] — для SSH їх зазвичай роблять суворішими (менше спроб, довший бан), ніж загальне значення за замовчуванням для решти сервісів.
Типові помилки налаштування
Невірний logpath для дистрибутива
Шлях /var/log/auth.log вірний для Debian і Ubuntu. На CentOS, AlmaLinux та інших RHEL-подібних дистрибутивах журнал автентифікації лежить у /var/log/secure — з невірним шляхом Fail2ban запускається без помилки, але jail ніколи не спрацює, тому що просто не знаходить файл для читання.
# Перевірка, що jail дійсно читає файл логів:
sudo fail2ban-client status sshd
# Рядок "File list" має містити реальний шлях до лога з даними,
# а не шлях до порожнього чи неіснуючого файлу
ignoreip без власної IP
Якщо не додати свою робочу IP в ignoreip, а поріг maxretry стоїть низьким, випадкові одруківки в паролі при звичайному вході можуть забанити вас самих на термін bantime. Особливо небезпечно за динамічної IP вдома — варто перевіряти поточну адресу після кожного перепідключення провайдера.
У системах, де журнал автентифікації ведеться лише через systemd journal без файлу /var/log/auth.log чи /var/log/secure (деякі мінімальні образи і контейнерні середовища), звичайний logpath не спрацює зовсім. Для цього випадку в jail є окремий параметр backend, який читає записи напряму з journal, а не з файлу на диску:
[sshd]
enabled = true
backend = systemd
maxretry = 3
Основні команди
# Статус усіх тюрем
sudo fail2ban-client status
# Статус SSH-тюрми
sudo fail2ban-client status sshd
# Розблокувати IP вручну
sudo fail2ban-client set sshd unbanip 203.0.113.42
# Подивитися заблоковані IP
sudo iptables -L f2b-sshd -n --line-numbers
Захист Nginx від DDoS і сканування
# Додати в jail.local:
[nginx-http-auth]
enabled = true
logpath = /var/log/nginx/error.log
[nginx-botsearch]
enabled = true
logpath = /var/log/nginx/access.log
maxretry = 2
/etc/ssh/sshd_config — це знизить кількість атак на 95%.sudo ufw allow 2222/tcpКоли Fail2ban не врятує
- Розподілений перебір із тисяч різних IP по одній-дві спробі з кожної — поріг
maxretryдля окремої адреси не спрацьовує, тому що жодна IP його не перевищує. - Атака через вразливість у самому застосунку, а не підбір пароля — Fail2ban реагує на патерни в логах невдалої автентифікації, а не на довільні HTTP-запити без відповідної сигнатури фільтра.
- Вхід за скомпрометованим, але дійсним паролем чи ключем з першої спроби — тут нічого блокувати за ознакою повторних невдач, потрібні двофакторна автентифікація і моніторинг підозрілих входів.
Перевірка, що захист працює
- Виконайте
sudo fail2ban-client status sshd— у виводі має бути коректний шлях до лога і зростаючий лічильникCurrently failedпісля невдалих спроб входу. - З іншої IP (не з
ignoreip) навмисно введіть неправильний пароль SSH більшеmaxretryразів поспіль — наступна спроба має бути відхилена файрволом, а не формою входу. - Перевірте бан у списку:
sudo fail2ban-client status sshdмає показати цю IP уBanned IP list. - Розбаньте тестову IP командою
fail2ban-client set sshd unbanipі переконайтеся, що підключення знову проходить — це підтверджує, що бан знімається штатно, а не лише руками через iptables.
Налаштування файрвола, на якому Fail2ban розставляє правила блокування, розбирає стаття UFW для Ubuntu і Debian, а вхід за ключами замість пароля взагалі прибирає потребу в підборі — хардненинг SSH на сервері.
Встановлення
sudo apt update
sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban
Створення конфігу jail.local
Ніколи не редагуйте jail.conf — він перезаписується під час оновлення. Створіть jail.local:
># /etc/fail2ban/jail.local
[DEFAULT]
# Час бану в секундах (3600 = 1 година, -1 = назавжди)
bantime = 3600
# Час пошуку спроб (10 хвилин)
findtime = 600
# Максимум спроб до бану
maxretry = 5
# Виключити свої IP з бану!
ignoreip = 127.0.0.1/8 YOUR.TRUSTED.IP
[sshd]
enabled = true
port = 22
logpath = %(sshd_log)s
maxretry = 3
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
[postfix-sasl]
enabled = true
port = smtp,submission
logpath = /var/log/mail.log
maxretry = 5
sudo systemctl restart fail2ban
Керування та моніторинг
# Загальний статус
sudo fail2ban-client status
# Статус конкретного jail
sudo fail2ban-client status sshd
# Ручний бан IP
sudo fail2ban-client set sshd banip 192.168.1.100
# Розбанити IP
sudo fail2ban-client set sshd unbanip 192.168.1.100
# Переглянути забанені IP в iptables
sudo iptables -L f2b-sshd -n -v
# Логи Fail2Ban
sudo journalctl -u fail2ban -f
Моніторинг атак у реальному часі
# Стежити за банами SSH у реальному часі
sudo tail -f /var/log/auth.log | grep "Failed password"
# Топ атакуючих IP
sudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20