fail2ban + ipset
Добре 👍 Давай зведемо все в одну чітку інструкцію для Ubuntu Server 24.04, щоб у тебе був порядок із iptables
, ip6tables
, fail2ban
та ipset
.
✅ Інтеграція fail2ban + ipset + netfilter-persistent
1. Пакети
Переконайся, що все потрібне встановлено:
apt install ipset iptables-persistent netfilter-persistent
2. Створення 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
Перевірка:
ipset list
3. Fail2ban → ipset
У jail.local
або в action.d
вибрати action ipset
(або iptables-ipset-proto6
для IPv4/IPv6). Приклад jail.local
:
[sshd]
enabled = true
action = ipset[name=sshd, bantime=3600, setname=banned_inet4]
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)
ipset flush
;;
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-save
6. Перевірка після перезавантаження
Перезавантажуєш сервер.
Дивишся, чи піднялись 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