ipset setup

Налаштування ipset

Зараз в мене встановлені iptables, ipset s fail2ban. Все налаштоване, але треба, щоб ipset-набори відновлювалися після перезавантаження. Набори ipset розділені (dirtybots4.set / dirtybots6.set) і лежать в директорії /etc/ipset.d. Як налаштувати відновлення?

Найпростіше зробити так, щоб при кожному старті системи виконувалося відновлення обох наборів з твоїх .set-файлів у /etc/ipset.d/.

Оскільки ipset сам по собі не зберігає набори постійно, треба вручну підвантажувати їх при старті (наприклад через systemd-unit)

Тоді зробимо через systemd unit + timer, щоб:

  1. При старті — відновлювались набори з /etc/ipset.d/*.set.

  2. Кожні 5 хвилин — зберігався актуальний стан у ці файли.


1. Скрипт для відновлення і збереження

Створюємо /usr/local/bin/ipset-maintain.sh:

#!/bin/bash
# Відновлення або збереження ipset-наборів
# Використання:
#   ipset-maintain.sh restore   - відновити з файлів
#   ipset-maintain.sh save      - зберегти в файли

DIR="/etc/ipset.d"

case "$1" in
    restore)
        for f in "$DIR"/*.set; do
            [ -f "$f" ] && /usr/sbin/ipset restore -file "$f"
        done
        ;;
    save)
        for setname in $(/usr/sbin/ipset list -name); do
            /usr/sbin/ipset save "$setname" > "$DIR/$setname.set"
        done
        ;;
    *)
        echo "Usage: $0 {restore|save}"
        exit 1
        ;;
esac

Права на виконання:

chmod +x /usr/local/bin/ipset-maintain.sh

2. Юніт для відновлення при старті

Файл /etc/systemd/system/ipset-restore.service:

[Unit]
Description=Restore ipset sets from saved files
After=network-pre.target
Wants=network-pre.target
Before=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/ipset-maintain.sh restore
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

3. Юніт для збереження

Файл /etc/systemd/system/ipset-save.service:

[Unit]
Description=Save current ipset sets to files
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/ipset-maintain.sh save

4. Таймер для збереження кожні 5 хвилин

Файл /etc/systemd/system/ipset-save.timer:

[Unit]
Description=Periodically save ipset sets

[Timer]
OnBootSec=1min
OnUnitActiveSec=5min
Persistent=true

[Install]
WantedBy=timers.target

5. Активація

systemctl daemon-reload
systemctl enable ipset-restore.service
systemctl enable --now ipset-save.timer

6. Перевірка

  • Відновлення вручну:

systemctl start ipset-restore.service
  • Збереження вручну:

systemctl start ipset-save.service
  • Логи таймера:

journalctl -u ipset-save.service --since "10 min ago"

Якщо захочеш, я можу додати в цей скрипт автоматичне створення відсутніх наборів перед відновленням, щоб ipset restore не падав, якщо файл є, а набір ще не існує. Це особливо корисно, коли набір був видалений або сервер чистий після рестарту. Хочеш, щоб я так дописала?

Last updated