fail2ban: ufw - NO, iptables - YES
https://zomro.com/rus/blog/faq/365-how-to-install-and-configure-fail2ban-in-ubuntu-2004
Хочеш, поясню як 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:systemctl edit fail2banІ встав:
[Unit] After=ufw.service Requires=ufw.service
Альтернатива:
Налаштуй
iptablesнапряму (абоnftables, якщо сучасніший підхід).А
ufwвзагалі відключи:ufw disable systemctl disable ufw
якщо я відключу ufw, то правила, які ввів через нього в iptables все одно будуть діяти?
Ні, правила, які ти додав через ufw, перестануть діяти після ufw disable, і ось чому:
Що робить ufw disable?
ufw disable?Коли ти виконуєш:
ufw disableвідбувається таке:
ufwскидає всі свої iptables-правила.Всі дозволи/заборони, які були додані через
ufw, вилучаються.Залишається лише "чиста" таблиця
iptables(або те, що інші сервіси встигли туди додати післяufw).
Перевірка:
Перед і після виконання ufw disable ти можеш подивитися правила:
iptables -L -n -vПісля ufw disable ланцюги типу ufw-user-input, ufw-before-input — зникнуть.
Якщо ти хочеш залишити правила назавжди:
Не використовуй
ufw, а пиши правила напряму вiptablesабоnftables.Або експортуй поточні iptables-правила і імпортуй після перезапуску:
# Зберегти
iptables-save > /etc/iptables/rules.v4
# Встановити iptables-persistent (якщо треба)
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:./setup-firewall.sh
Хочеш, я можу додати опцію збереження правил через iptables-persistent, якщо ти плануєш автоматичне завантаження після перезавантаження системи.
інакше ці всі налаштування після перезавантаження перестануть діяти?
Так, без збереження — всі ці налаштування, зроблені через iptables, будуть втрачені після перезавантаження.
iptables за замовчуванням працює лише в оперативній пам’яті. Після рестарту система просто завантажить "чисту" конфігурацію (або ту, що задає ufw, якщо він увімкнений).
🔒 Як зберегти налаштування назавжди:
Варіант 1 — через iptables-persistent (рекомендовано)
iptables-persistent (рекомендовано)Встановити пакет:
apt install iptables-persistentПісля цього збережи правила:
netfilter-persistent saveПеревір, що вони завантажуються після перезавантаження:
systemctl status netfilter-persistent
📁 Правила будуть збережені в:
/etc/iptables/rules.v4(для IPv4)/etc/iptables/rules.v6(для IPv6, якщо потрібно)
Варіант 2 — вручну через скрипт на старті
Можеш просто вкинути свій setup-firewall.sh у автозавантаження:
cp setup-firewall.sh /etc/network/if-pre-up.d/firewall
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
Яку дію виконувати для бану
📌 Приклад /etc/fail2ban/jail.local: під SSH на порті 2202
/etc/fail2ban/jail.local: під SSH на порті 2202[DEFAULT]
banaction = ipset-multi
bantime = 2w
findtime = 60
maxretry = 5
backend = auto
ignoreip = 127.0.0.1/8 ::1 193.200.85.55
[sshd]
enabled = true
port = 2202
logpath = %(sshd_log)s
backend = systemd
[apache-aggress]
enabled = true
port = http,https
logpath = /var/log/apache2/*access.log
maxretry = 5
findtime = 2
[apache-wordpress]
enabled = true
port = http,https
logpath = /var/log/apache2/*access.log
maxretry = 1
[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps
filter = dovecot
logpath = /var/log/mail.log
maxretry = 5
findtime = 600
Хочеш — можу одразу згенерувати 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.
📋 Перевірка статусу
Загальний статус:
fail2ban-client statusВиведе список активних jail (правил). Наприклад:
Status
|- Number of jail: 6
`- Jail list: apache-aggress, apache-wordpress, dovecot, postfix, recidive, sshdСтатус конкретного jail, наприклад sshd:
jail, наприклад sshd: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:
fail2ban-client set sshd unbanip 192.0.2.123Заміни
192.0.2.123на фактичну IP-адресу.
🚷 Примусово забанити IP вручну
Іноді треба "вручну покарати":
fail2ban-client set sshd banip 203.0.113.55🔁 Перезавантаження / перевірка конфігурації
Перезапустити fail2ban:
systemctl restart fail2banПеревірити, чи конфіг коректний:
fail2ban-client reload🧩 Корисне: лог-файл fail2ban
fail2banЛог можна переглянути тут:
/var/log/fail2ban.logПриклад:
tail -f /var/log/fail2ban.logГотова ще й bash-функція, яка покаже заблоковані IP, або зробити просте TUI-меню — дай знати.
Last updated