UFW + fail2ban

Хочеш, поясню як UFW взаємодіє з fail2ban, або якісь конкретні приклади для веб-серверів?

На Ubuntu Server 24.04 рекомендовано дозволити fail2ban працювати напряму з iptables, а не через ufw. Ось чому:


❗ Причини обрати iptables напряму:

  1. Надійність:

    • fail2ban працює через iptables без посередників, що забезпечує прямий, швидкий і контрольований доступ до блокування IP-адрес.

    • Робота через ufw технічно можлива, але це додає проміжний шар, що може призвести до конфліктів, особливо при складних правилах або власних ufw-профілях.

  2. Гнучкість:

    • Через iptables ти можеш детальніше налаштовувати ланцюжки (chains) і вести роздільну статистику по fail2ban.

    • ufw не дає повного доступу до низькорівневих деталей iptables, тому деякі функції fail2ban можуть працювати менш ефективно.

  3. Офіційна документація fail2ban за замовчуванням передбачає використання iptables.


Як воно працює з iptables:

  • При спрацюванні фільтру fail2ban додає DROP/REJECT правила до спеціального ланцюга f2b-* в iptables.

  • Ці правила автоматично видаляються після закінчення bantime.


А що з ufw?

ufw сам по собі — фронтенд до iptables, тож теоретично можна створити jail типу ufw, який викликає ufw deny для IP. Але:

  • Це повільніше, бо ufw щоразу перевизначає весь набір правил.

  • Іноді після перезавантаження ufw — блокування від fail2ban втрачаються.

  • Не всі дистрибутиви підтримують action = ufw стабільно.


Підсумок:

Метод
Рекомендовано?
Причина

iptables напряму

✅ Так

Швидше, стабільніше, офіційно підтримується

через ufw

⚠ Не рекомендовано

Повільніше, можуть бути конфлікти


Чи правильно я зрозумів? Якщо fail2ban щось запише у iptables, а я потім, через ufw відкрию якійсь порт, то це може скинути попередні налаштування в iptables від fail2ban?

Так, ти правильно зрозумів. І ось детальніше пояснення:


❗ Потенційна проблема: ufw перезаписує правила iptables

Коли ти виконуєш команду ufw enable, ufw reload або змінюєш правила (наприклад, ufw allow 80), ufw перегенеровує всю свою таблицю iptables. Внаслідок цього:

  • Правила, які fail2ban записав у iptables, можуть бути втрачені (видалені).

  • Це особливо стосується, якщо fail2ban додав правила після ufw enable, а ти потім змінив ufw.


Чому так відбувається?

ufw не знає про правила, які створили інші сервіси (fail2ban, Docker, iptables вручну). Він просто:

  • Скидає всі наявні правила.

  • Встановлює ті, що описані у своїй конфігурації (/lib/ufw/user.rules, /etc/ufw/ тощо).

fail2ban, у свою чергу, динамічно додає свої правила після запуску, і їх там нема — тож ufw їх не відновить.


Як уникнути цієї проблеми:

  1. Не використовуй ufw, якщо активно користуєшся fail2ban — краще писати правила напряму через iptables або скриптами.

  2. АБО запускай fail2ban після ufw, і більше не чіпай ufw (не викликай ufw reload, ufw allow, тощо).

  3. Якщо дуже хочеш використовувати ufw, то:

    • Додай fail2ban до systemd після ufw:

      sudo systemctl edit fail2ban

      І встав:

      [Unit]
      After=ufw.service
      Requires=ufw.service

Альтернатива:

  • Налаштуй iptables напряму (або nftables, якщо сучасніший підхід).

  • А ufw взагалі відключи:

    sudo ufw disable
    sudo systemctl disable ufw

якщо я відключу ufw, то правила, які ввів через нього в iptables все одно будуть діяти?

Ні, правила, які ти додав через ufw, перестануть діяти після ufw disable, і ось чому:


Що робить ufw disable?

Коли ти виконуєш:

sudo ufw disable

відбувається таке:

  1. ufw скидає всі свої iptables-правила.

  2. Всі дозволи/заборони, які були додані через ufw, вилучаються.

  3. Залишається лише "чиста" таблиця iptables (або те, що інші сервіси встигли туди додати після ufw).


Перевірка:

Перед і після виконання ufw disable ти можеш подивитися правила:

sudo iptables -L -n -v

Після ufw disable ланцюги типу ufw-user-input, ufw-before-inputзникнуть.


Якщо ти хочеш залишити правила назавжди:

  1. Не використовуй ufw, а пиши правила напряму в iptables або nftables.

  2. Або експортуй поточні iptables-правила і імпортуй після перезапуску:

# Зберегти
sudo iptables-save > /etc/iptables/rules.v4

# Встановити iptables-persistent (якщо треба)
sudo apt install iptables-persistent

Висновок:

Дія
Результат

ufw disable

Всі правила ufw видаляються з iptables

ufw enable

ufw знову застосовує свої правила

Правила fail2ban

Залишаються (якщо fail2ban ще активний)


Якщо хочеш, я можу показати, як відтворити ufw-аналогічне правило вручну через iptables, без ufw.

покажи на прикладі: спочатку, через ufw я закрив усі порти, потім відкрив порти з tcp для http, https і ssh (2202). Можливо, в майбутньому буду ще використовувати пошту.

Ось готовий Bash-скрипт для налаштування iptables згідно з твоїми вимогами: закрити всі порти, дозволити HTTP, HTTPS, SSH (порт 2202) і з підготовкою до можливого використання поштових сервісів (закоментовано). Коментарі всередині — українською.

#!/bin/bash

# Скрипт очищає існуючі правила та встановлює базовий фаєрвол через iptables
# Протокол: лише TCP
# Дозволяються: loopback, встановлені з'єднання, HTTP, HTTPS, SSH (на порту 2202)
# Поштові порти присутні, але закоментовані

echo "[+] Flushing existing rules..."

# Очищення всіх таблиць і ланцюгів
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X

echo "[+] Setting default policies..."

# За замовчуванням:
iptables -P INPUT DROP     # Блокувати весь вхідний трафік
iptables -P FORWARD DROP   # Блокувати форвардинг
iptables -P OUTPUT ACCEPT  # Дозволити вихідний трафік

echo "[+] Allowing loopback interface..."

# Дозволити локальний трафік (127.0.0.1)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

echo "[+] Allowing established connections..."

# Дозволити вхідні відповіді на вихідні запити
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

echo "[+] Allowing web ports: HTTP (80), HTTPS (443)..."

# Дозволити HTTP (порт 80)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# Дозволити HTTPS (порт 443)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

echo "[+] Allowing SSH on port 2202..."

# Дозволити SSH на нестандартному порту 2202
iptables -A INPUT -p tcp --dport 2202 -j ACCEPT

# === Поштова частина (поки закоментована) ===
# echo "[+] Preparing for mail service (SMTP, IMAP, POP3)..."

# # SMTP (25)
# iptables -A INPUT -p tcp --dport 25 -j ACCEPT

# # SMTPS (465)
# iptables -A INPUT -p tcp --dport 465 -j ACCEPT

# # Submission (587)
# iptables -A INPUT -p tcp --dport 587 -j ACCEPT

# # IMAP (143)
# iptables -A INPUT -p tcp --dport 143 -j ACCEPT

# # IMAPS (993)
# iptables -A INPUT -p tcp --dport 993 -j ACCEPT

# # POP3 (110)
# iptables -A INPUT -p tcp --dport 110 -j ACCEPT

# # POP3S (995)
# iptables -A INPUT -p tcp --dport 995 -j ACCEPT

echo "[+] Done."

echo "[+] Current iptables rules:"
iptables -L -n -v

✅ Як використовувати:

  1. Збережи у файл, наприклад: setup-firewall.sh

  2. Зроби виконуваним:

    chmod +x setup-firewall.sh
  3. Запусти з правами root:

    sudo ./setup-firewall.sh

Хочеш, я можу додати опцію збереження правил через iptables-persistent, якщо ти плануєш автоматичне завантаження після перезавантаження системи.

інакше ці всі налаштування після перезавантаження перестануть діяти?

Так, без збереження — всі ці налаштування, зроблені через iptables, будуть втрачені після перезавантаження.

iptables за замовчуванням працює лише в оперативній пам’яті. Після рестарту система просто завантажить "чисту" конфігурацію (або ту, що задає ufw, якщо він увімкнений).


🔒 Як зберегти налаштування назавжди:

Варіант 1 — через iptables-persistent (рекомендовано)

  1. Встановити пакет:

    sudo apt install iptables-persistent
  2. Після цього збережи правила:

    sudo netfilter-persistent save
  3. Перевір, що вони завантажуються після перезавантаження:

    sudo systemctl status netfilter-persistent

📁 Правила будуть збережені в:

  • /etc/iptables/rules.v4 (для IPv4)

  • /etc/iptables/rules.v6 (для IPv6, якщо потрібно)


Варіант 2 — вручну через скрипт на старті

Можеш просто вкинути свій setup-firewall.sh у автозавантаження:

sudo cp setup-firewall.sh /etc/network/if-pre-up.d/firewall
sudo chmod +x /etc/network/if-pre-up.d/firewall

Це виконає скрипт щоразу, коли мережа піднімається (перед eth0/enp*).


🔧 Порада:

Якщо в тебе IPv6 увімкнено — **не забудь або:

  • закрити його,

  • або налаштувати паралельно ip6tables.**

Якщо треба, покажу приклад для IPv6 або rules.v6.


Тобі зручно, якщо я одразу модифікую той скрипт і додам команду збереження правил через netfilter-persistent?

якщо це просто додається в скрипт, то дай лише ці рядки

Звісно. Просто додай оці два рядки в кінець свого скрипта після усіх iptables -A ...:

# Зберегти правила для автоматичного застосування після перезавантаження
netfilter-persistent save

А якщо хочеш переконатися, що сервіс увімкнено:

systemctl enable netfilter-persistent

Примітка: netfilter-persistent зберігає правила в /etc/iptables/rules.v4 автоматично.

Якщо треба — можу дати перевірку на наявність пакету та встановлення його в скрипті, але ці рядки — все, що потрібно для збереження.

де fail2ban зберігає свої налаштування і які опції його опції є найвживаніші?

📂 Де fail2ban зберігає свої налаштування

1. Основний конфіг-файл:

/etc/fail2ban/jail.conf

Не редагуй його напряму! Він може бути перезаписаний при оновленні пакету.

2. Правильний спосіб:

/etc/fail2ban/jail.local

Або, ще краще, окремі файли в:

/etc/fail2ban/jail.d/*.conf

Усі *.local і jail.d/*.conf перевизначають відповідні налаштування з jail.conf.

3. Фільтри (regex, що шукають атаки в логах):

/etc/fail2ban/filter.d/

Там, наприклад, sshd.conf, apache-auth.conf, тощо.

4. Дії (як саме блокувати IP):

/etc/fail2ban/action.d/

Там визначено, як використовувати iptables, ufw, sendmail, route, тощо.


⚙️ Найвживаніші опції в fail2ban

Глобальні параметри (в [DEFAULT]):

Параметр
Значення за замовчуванням
Опис

bantime

600 (10 хв)

Як довго тримати IP в бані (можна задати 1h, 1d, -1 для перманентного)

findtime

600

Проміжок часу (в сек), протягом якого шукаються спроби атаки

maxretry

5

Скільки разів можна помилитися до блокування

backend

auto

Чим читати лог-файли: systemd, polling, auto

usedns

warn

Чи виконувати DNS lookup

ignoreip

127.0.0.1/8 ::1

IP-адреси, які ніколи не банити (додай свій IP тут!)

Для кожного "jail" (наприклад [sshd]):

Параметр
Приклад
Опис

enabled

true

Увімкнути правило

port

ssh або 2202

Порт, який моніторити

filter

sshd

Який фільтр використовувати з /etc/fail2ban/filter.d/

logpath

/var/log/auth.log

Який лог читати

action

iptables-multiport або ufw

Яку дію виконувати для бану


📌 Приклад jail.local:

[DEFAULT]
bantime = 30m
findtime = 10m
maxretry = 3
ignoreip = 127.0.0.1/8 ::1 192.168.0.0/16

[sshd]
enabled = true
port = 2202
filter = sshd
logpath = /var/log/auth.log
backend = systemd

Хочеш — можу одразу згенерувати jail.local конкретно під твій нестандартний SSH-порт (2202), з оптимальними налаштуваннями.

Ось готовий файл jail.local, налаштований під SSH на порті 2202, з типовими, але вже посиленими параметрами захисту.


📄 /etc/fail2ban/jail.local

[DEFAULT]
# Як довго банити IP (тут: 30 хвилин)
bantime = 30m

# Проміжок часу, протягом якого шукаємо кілька невдалих спроб (10 хв)
findtime = 10m

# Скільки спроб до бану
maxretry = 3

# IP-адреси, які ніколи не банити (додай свій зовнішній IP!)
ignoreip = 127.0.0.1/8 ::1

[sshd]
enabled = true
port = 2202
filter = sshd
logpath = /var/log/auth.log
backend = systemd

📌 Що ще можна зробити після створення jail.local

  1. Перезапусти fail2ban:

    sudo systemctl restart fail2ban
  2. Перевір активність jail:

    sudo fail2ban-client status
  3. Перевір конкретний jail:

    sudo fail2ban-client status sshd
  4. Додай свій IP до ignoreip, щоб не забанити себе.


🔐 Якщо хочеш, я можу показати, як переглядати заблоковані IP або як вручну розблокувати адресу, якщо вона потрапила під бан.

Добре. Ось основні команди для перегляду, розблокування і роботи з IP, які потрапили під бан у fail2ban.


📋 Перевірка статусу

Загальний статус:

sudo fail2ban-client status

Виведе список активних jail (правил). Наприклад:

Status
|- Number of jail:      1
`- Jail list:           sshd

Статус конкретного jail, наприклад sshd:

sudo fail2ban-client status sshd

Бачиш щось таке:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     6
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   192.0.2.123

🚫 Ручне розблокування IP

Розблокувати IP:

sudo fail2ban-client set sshd unbanip 192.0.2.123

Заміни 192.0.2.123 на фактичну IP-адресу.


🚷 Примусово забанити IP вручну

Іноді треба "вручну покарати":

sudo fail2ban-client set sshd banip 203.0.113.55

🔁 Перезавантаження / перевірка конфігурації

Перезапустити fail2ban:

sudo systemctl restart fail2ban

Перевірити, чи конфіг коректний:

sudo fail2ban-client reload

🧩 Корисне: лог-файл fail2ban

Лог можна переглянути тут:

/var/log/fail2ban.log

Приклад:

sudo tail -f /var/log/fail2ban.log

Готова ще й bash-функція, яка покаже заблоковані IP, або зробити просте TUI-меню — дай знати.

Last updated