fail2ban + ipset
Добре 👍 Давай зведемо все в одну чітку інструкцію для Ubuntu Server 24.04, щоб у тебе був порядок із iptables, ip6tables, fail2ban та ipset.
✅ Інтеграція fail2ban + ipset + netfilter-persistent
1. Пакети
Переконайся, що все потрібне встановлено:
apt install ipset iptables-persistent netfilter-persistent2. Створення ipset-наборів
Створюємо їх вручну або в скрипті ініціалізації (важливо, щоб вони існували ДО завантаження правил iptables):
ipset create banned_inet4 hash:ip family inet hashsize 1024 maxelem 65536
ipset create banned_inet6 hash:ip family inet6 hashsize 1024 maxelem 65536"banned_" можна змінювати, а "inet4" і "inet6" краще залишити, це дозволить створити спільний для різних IP-set наборів файл ipset-multi.conf (див. нижче).
Також, створимо набір для ручного запису групи адрес (є такі боти, які чередують IP як 81.30.107.*)
ipset create manual_block hash:net family inet -existДодавати туди так:
ipset add manual_block 81.30.107.0/24Одноразово включаємо цей набір в iptables:
iptables -I INPUT -m set --match-set manual_block src -j DROPІ зберігаємо:
netfilter-persistent saveДивимось:
ipset list -name
manual_block
banned_inet4
banned_inet63. Підтримка IPv6
Якщо сервер підтримує IPv6, то пропиши "allowipv6 = yes" у /etc/fail2ban/fail2ban.conf:
# Option: allowipv6
# Notes.: Allows IPv6 interface:
# Default: auto
# Values: [ auto yes (on, true, 1) no (off, false, 0) ] Default: auto
allowipv6 = yesІнакше буде вилазити попередження: "WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'"
Щоб fail2ban автоматично додавав IP у набори ipset (banned_inet4 / banned_inet6) створимо спільний для них action: /etc/fail2ban/action.d/ipset-multi.conf
nano /etc/fail2ban/action.d/ipset-multi.conf[Definition]
# Додає/видаляє IP у правильний ipset залежно від типу адреси
# При старті jail створюємо набори (якщо їх ще нема)
actionstart = ipset create banned_inet4 hash:ip family inet -exist
ipset create banned_inet6 hash:ip family inet6 -exist
# При зупинці jail не видаляємо набори, тільки очищаємо
actionstop = ipset flush banned_inet4
ipset flush banned_inet6
# Перевірка наявності наборів
actioncheck = ipset list banned_inet4
ipset list banned_inet6
# Додаємо IP у набір IPv4/6
actionban = ipset add banned_<family> <ip> -exist
# Видаляємо IP з набору IPv4/6
actionunban = ipset del banned_<family> <ip> -exist
# fail2ban підставляє замість <family> автоматично: "inet4" для IPv4, "inet6" для IPv6
[Init]
# Ніяких додаткових параметрів не треба
і цей action треба буде прописати у конфіг /etc/fail2ban/jail.local:
[DEFAULT]
...
banaction = ipset-multi
4. netfilter-persistent + ipset
За замовчуванням netfilter-persistent обробляє тільки iptables і ip6tables. Щоб інтегрувати ipset, створюємо плагін:
/usr/share/netfilter-persistent/plugins.d/10-ipset:
#!/bin/sh
set -e
IPSET_SAVE="/etc/iptables/ipsets"
case "$1" in
start)
[ -f "$IPSET_SAVE" ] && ipset restore < "$IPSET_SAVE" || true
;;
save)
ipset save > "$IPSET_SAVE"
;;
flush)
ipset flush
;;
stop)
# нічого не робимо при stop
;;
esacЗробити виконуваним:
chmod +x /usr/share/netfilter-persistent/plugins.d/10-ipsetТепер netfilter-persistent save буде зберігати і ipset.
5. Автозбереження ipset щогодини о :40
Створюємо сервіс /etc/systemd/system/ipset-save.service:
[Unit]
Description=Save current ipset rules to /etc/iptables/ipsets
Documentation=man:ipset(8)
[Service]
Type=oneshot
ExecStart=/bin/sh -c '/sbin/ipset save > /etc/iptables/ipsets'Створюємо таймер /etc/systemd/system/ipset-save.timer:
[Unit]
Description=Run ipset-save.service every hour at minute 40
[Timer]
OnCalendar=*:40
Persistent=true
Unit=ipset-save.service
[Install]
WantedBy=timers.targetУвімкнути:
systemctl daemon-reload
systemctl enable --now ipset-save.timerПеревірка:
systemctl list-timers | grep ipset-save6. Перевірка після перезавантаження
Перезавантажуєш сервер.
Дивишся, чи піднялись ipset-набори:
ipset listДивишся, чи піднялись iptables-правила:
iptables -S ip6tables -SПереконуєшся, що netfilter-persistent активний:
systemctl status netfilter-persistent
📌 Підсумок
fail2banбанить уipset.netfilter-persistentзберігає/відновлює ipset разом з iptables.Таймер
ipset-save.timerраз на годину о :40 хв. додатково зберігає ipset у файл/etc/iptables/ipsets.Після перезавантаження всі правила і бан-листи повертаються автоматично.
DELETE DELETE DELETE DELETE DELETE DELETE
Створюємо сервіс для відновлення ipset при старті системи.
Спочатку збережемо активні набори у файл (наприклад /etc/ipset.conf):
ipset save > /etc/ipset.conf(якщо працюємо через sudo: sudo sh -c 'ipset save > /etc/ipset.conf' )
nano /etc/systemd/system/ipset-restore.service[Unit]
Description=Restore ipset rules
DefaultDependencies=no
Before=netfilter-persistent.service iptables.service ip6tables.service
Conflicts=shutdown.target
[Service]
Type=oneshot
ExecStart=/sbin/ipset restore -exist -file /etc/ipset.conf
ExecReload=/sbin/ipset restore -exist -file /etc/ipset.conf
RemainAfterExit=yes
[Install]
WantedBy=multi-user.targetАктивуємо сервіс
systemctl daemon-reload
systemctl enable ipset-restoreТепер при кожному старті системи ipset автоматично відновлюватиметься ще до запуску iptables/netfilter-persistent.
Створюю три файли:
сервіс (який виконує команду збереження) - ipset-save.service,
таймер (який запускає цей сервіс раз на 30 хв) - ipset-save.timer і
сервіс, який буде перед вимкненням/перезавантаженням зберігати актуальний стан ipset у /etc/ipset.conf. Це дає гарантію, що навіть при форсованому ребуті список не загубиться..
nano /etc/systemd/system/ipset-save.service
[Unit]
Description=Save current ipset rules to /etc/ipset.conf
Documentation=man:ipset(8)
[Service]
Type=oneshot
ExecStart=/bin/sh -c '/sbin/ipset save > /etc/ipset.conf'/etc/systemd/system/ipset-save.timer
nano /etc/systemd/system/ipset-restore.service
[Unit]
Description=Restore ipset rules
DefaultDependencies=no
Before=netfilter-persistent.service iptables.service ip6tables.service
Conflicts=shutdown.target
[Service]
Type=oneshot
ExecStart=/sbin/ipset restore -exist -file /etc/ipset.conf
ExecReload=/sbin/ipset restore -exist -file /etc/ipset.conf
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
nano /etc/systemd/system/ipset-save-shutdown.service
[Unit]
Description=Save ipset rules on shutdown/reboot
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
Conflicts=shutdown.target reboot.target halt.target
[Service]
Type=oneshot
ExecStart=/sbin/ipset save > /etc/ipset.conf
[Install]
WantedBy=halt.target reboot.target shutdown.target
Last updated