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. Перевірка після перезавантаження

  1. Перезавантажуєш сервер.

  2. Дивишся, чи піднялись ipset-набори:

    ipset list
  3. Дивишся, чи піднялись iptables-правила:

    iptables -S
    ip6tables -S
  4. Переконуєшся, що 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