Хочете, щоб ваш сервер Linux пережив натиск ботів і брутфорсів? Тоді час увімкнути перевірену зв’язку: UFW як простий firewall Linux, Fail2ban для блокування «поганих» IP по логах, і e‑mail сповіщення, щоб оперативно реагувати. У цій інструкції я, Kernelka, покажу, як захистити SSH підключення та зміцнити Nginx крок за кроком — без магії й зайвих рухів. 🛡️

Що будемо робити і що нам потрібно

  • Увімкнемо UFW з безпечною політикою за замовчуванням та дозволимо SSH і Nginx.
  • Встановимо Fail2ban і додамо jail-и для sshd та Nginx.
  • Увімкнемо e‑mail сповіщення про бани з деталями.
  • Розглянемо альтернативи, GUI-інструменти та типові проблеми.

Перед стартом: потрібні права sudo, встановлений Nginx і активоване SSH підключення. Приклади нижче підходять для Debian/Ubuntu; на інших дистрибутивах команди пакетного менеджера відрізнятимуться.

Крок 1. Налаштовуємо UFW (firewall Linux)

UFW — простий інтерфейс до netfilter. Вмикаємо політику «заборонити все вхідне, дозволити вихідне», після чого явно відкриємо потрібні сервіси.

sudo apt update
sudo apt install ufw -y

# Безпечна політика за замовчуванням
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Дозволяємо SSH та Nginx (HTTP/HTTPS)
sudo ufw allow OpenSSH
sudo ufw limit OpenSSH   # обмеження спроб підключення (rate limit)
sudo ufw allow "Nginx Full"

# Увімкнути UFW (уважно, щоб не відрізати доступ)
sudo ufw enable

Перевірка правил

sudo ufw status verbose

Тепер базовий захист для сервер Linux активний: SSH і Nginx працюють, інше — закрито.

Крок 2. Встановлюємо та налаштовуємо Fail2ban

Fail2ban стежить за логами, знаходить підозрілі шаблони та банить IP через запущений firewall. Далі — мінімальний, але дієвий конфіг.

sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban

Створюємо /etc/fail2ban/jail.local

Спочатку відкриємо файл у редакторі, потім вставимо конфіг нижче.

sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1
bantime.increment = true
bantime.factor = 1.5
bantime.maxtime = 24h

# Налаштування сповіщень
destemail = admin@example.com
sender = fail2ban@yourdomain
mta = sendmail
# Відправляти лист з журналом подій
action = %(action_mwl)s

[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log

[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log

[nginx-botsearch]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log

Перезапускаємо сервіс і перевіряємо статус:

sudo systemctl restart fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd
sudo fail2ban-client status nginx-botsearch

Щоб переконатися, що правила коректні, можна прогнати тест на вибірці логів:

sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

Крок 3. Увімкнути e‑mail сповіщення

Fail2ban уміє надсилати листи через локальний MTA. Найпростіше поставити Postfix у режимі «Internet Site» і перевірити доставку.

sudo apt install postfix mailutils -y
# Під час інсталяції оберіть Internet Site і вкажіть свій домен

# Тестовий лист
echo "Fail2ban працює" | mail -s "Fail2ban OK" admin@example.com

Якщо лист дійшов, у jail.local вже вказана дія action = %(action_mwl)s, яка шле повідомлення з вирізками логів і whois. За потреби замініть на %(action_mw)s (без логів) або іншу дію з каталогу /etc/fail2ban/action.d/.

Альтернативні способи та корисні доповнення

  • Замість UFW: firewalld (Fedora, RHEL). Принцип той самий — deny за замовчуванням, allow потрібні сервіси.
  • Посилення SSH: використовуйте ключі та вимкніть паролі.
# Обережно: переконайтеся, що вхід за ключем працює!
sudo nano /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
# За потреби змініть порт: Port 22
sudo systemctl reload ssh
  • Якщо Nginx стоїть за CDN/проксі, ввімкніть real_ip, щоб Fail2ban бачив реальні IP, а не IP балансера.

GUI-спосіб (якщо доречно)

На десктопних системах можна скористатися GUFW — графічною оболонкою до UFW:

sudo apt install gufw -y

Відкрийте GUFW, увімкніть брандмауер, додайте правила для OpenSSH та «WWW Full». Для Fail2ban офіційного GUI майже немає; на серверах зручно працювати в терміналі.

FAQ

Чи не конфліктують UFW і Fail2ban?

Ні. Fail2ban використовує UFW як бекенд для бану IP (або безпосередньо iptables/nftables). Вони доповнюють одне одного.

Як розбанити IP?

sudo fail2ban-client set sshd unbanip 1.2.3.4

Не приходять листи від Fail2ban — що робити?

  • Перевірте MTA: на Ubuntu це postfix. Подивіться /var/log/mail.log.
  • Виконайте тестовий лист через mail.
  • У jail.local переконайтеся, що destemail і action задані, а mta відповідає вашій системі.

Де зберігаються логи?

  • SSH: /var/log/auth.log (Debian/Ubuntu).
  • Nginx: /var/log/nginx/access.log, error.log.
  • Fail2ban: /var/log/fail2ban.log.

Nginx за CDN/проксі — бани не працюють як слід

Сконфігуруйте set_real_ip_from і real_ip_header у Nginx, щоб у логах з’явився реальний IP клієнта. Інакше Fail2ban банитиме IP балансера.

Чи можна додати «білий список»?

Так, змініть ignoreip у [DEFAULT], додавши свої підмережі: напр. ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8.

Порада від Kernelka

Якщо отримуєте багато фальшивих спрацьовувань по Nginx, спершу знизьте чутливість (параметри maxretry/findtime) і перевірте власні health‑check-и. А для критичних вузлів додайте окремий канал сповіщень (наприклад, через webhook) поряд з e‑mail — так ви нічого не пропустите. ✨

Підсумок

  • UFW: deny вхідного трафіку, allow OpenSSH і «Nginx Full», увімкнений rate limit.
  • Fail2ban: активні jail-и для sshd і Nginx, збалансовані bantime/findtime/maxretry.
  • E‑mail: Postfix + action %(action_mwl)s для інформативних сповіщень.
  • Додатково: ключі SSH, вимкнення паролів, реальні IP за проксі, білий список.
  • Моніторинг: регулярно перевіряйте fail2ban-client status та логи.