UFW + fail2ban
Хочеш, поясню як UFW взаємодіє з fail2ban
, або якісь конкретні приклади для веб-серверів?
На Ubuntu Server 24.04 рекомендовано дозволити fail2ban
працювати напряму з iptables
, а не через ufw
. Ось чому:
❗ Причини обрати iptables
напряму:
iptables
напряму:Надійність:
fail2ban
працює черезiptables
без посередників, що забезпечує прямий, швидкий і контрольований доступ до блокування IP-адрес.Робота через
ufw
технічно можлива, але це додає проміжний шар, що може призвести до конфліктів, особливо при складних правилах або власнихufw
-профілях.
Гнучкість:
Через
iptables
ти можеш детальніше налаштовувати ланцюжки (chains
) і вести роздільну статистику поfail2ban
.ufw
не дає повного доступу до низькорівневих деталейiptables
, тому деякі функціїfail2ban
можуть працювати менш ефективно.
Офіційна документація
fail2ban
за замовчуванням передбачає використанняiptables
.
Як воно працює з iptables:
При спрацюванні фільтру
fail2ban
додаєDROP
/REJECT
правила до спеціального ланцюгаf2b-*
вiptables
.Ці правила автоматично видаляються після закінчення
bantime
.
А що з ufw
?
ufw
?ufw
сам по собі — фронтенд до iptables
, тож теоретично можна створити jail типу ufw
, який викликає ufw deny
для IP. Але:
Це повільніше, бо
ufw
щоразу перевизначає весь набір правил.Іноді після перезавантаження
ufw
— блокування відfail2ban
втрачаються.Не всі дистрибутиви підтримують
action = ufw
стабільно.
Підсумок:
iptables
напряму
✅ Так
Швидше, стабільніше, офіційно підтримується
через ufw
⚠ Не рекомендовано
Повільніше, можуть бути конфлікти
Чи правильно я зрозумів? Якщо fail2ban щось запише у iptables, а я потім, через ufw відкрию якійсь порт, то це може скинути попередні налаштування в iptables від fail2ban?
Так, ти правильно зрозумів. І ось детальніше пояснення:
❗ Потенційна проблема: ufw
перезаписує правила iptables
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
їх не відновить.
Як уникнути цієї проблеми:
Не використовуй
ufw
, якщо активно користуєшсяfail2ban
— краще писати правила напряму черезiptables
або скриптами.АБО запускай
fail2ban
післяufw
, і більше не чіпайufw
(не викликайufw reload
,ufw allow
, тощо).Якщо дуже хочеш використовувати
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
?
ufw disable
?Коли ти виконуєш:
sudo ufw disable
відбувається таке:
ufw
скидає всі свої iptables-правила.Всі дозволи/заборони, які були додані через
ufw
, вилучаються.Залишається лише "чиста" таблиця
iptables
(або те, що інші сервіси встигли туди додати післяufw
).
Перевірка:
Перед і після виконання ufw disable
ти можеш подивитися правила:
sudo iptables -L -n -v
Після ufw disable
ланцюги типу ufw-user-input
, ufw-before-input
— зникнуть.
Якщо ти хочеш залишити правила назавжди:
Не використовуй
ufw
, а пиши правила напряму вiptables
абоnftables
.Або експортуй поточні 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
✅ Як використовувати:
Збережи у файл, наприклад:
setup-firewall.sh
Зроби виконуваним:
chmod +x setup-firewall.sh
Запусти з правами
root
:sudo ./setup-firewall.sh
Хочеш, я можу додати опцію збереження правил через iptables-persistent
, якщо ти плануєш автоматичне завантаження після перезавантаження системи.
інакше ці всі налаштування після перезавантаження перестануть діяти?
Так, без збереження — всі ці налаштування, зроблені через iptables
, будуть втрачені після перезавантаження.
iptables
за замовчуванням працює лише в оперативній пам’яті. Після рестарту система просто завантажить "чисту" конфігурацію (або ту, що задає ufw
, якщо він увімкнений).
🔒 Як зберегти налаштування назавжди:
Варіант 1 — через iptables-persistent
(рекомендовано)
iptables-persistent
(рекомендовано)Встановити пакет:
sudo apt install iptables-persistent
Після цього збережи правила:
sudo netfilter-persistent save
Перевір, що вони завантажуються після перезавантаження:
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
зберігає свої налаштування
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
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
:
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
/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
jail.local
Перезапусти
fail2ban
:sudo systemctl restart fail2ban
Перевір активність
jail
:sudo fail2ban-client status
Перевір конкретний
jail
:sudo fail2ban-client status sshd
Додай свій IP до
ignoreip
, щоб не забанити себе.
🔐 Якщо хочеш, я можу показати, як переглядати заблоковані IP або як вручну розблокувати адресу, якщо вона потрапила під бан.
Добре. Ось основні команди для перегляду, розблокування і роботи з IP, які потрапили під бан у fail2ban
.
📋 Перевірка статусу
Загальний статус:
sudo fail2ban-client status
Виведе список активних jail
(правил). Наприклад:
Status
|- Number of jail: 1
`- Jail list: sshd
Статус конкретного jail
, наприклад 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
fail2ban
Лог можна переглянути тут:
/var/log/fail2ban.log
Приклад:
sudo tail -f /var/log/fail2ban.log
Готова ще й bash
-функція, яка покаже заблоковані IP, або зробити просте TUI-меню — дай знати.
Last updated