OldKid
Ich bin ein mittlerweile 55 Jahre altes Kind, deswegen OldKid.  Meine Hobbys sind:  Klar an erster Stelle unser Jack Russell Eddie The Jacky, daneben eigentlich alles, was mit den Themen: Computer, Datenschutz, Fediverse, Apple und Linux zu tun hat.

IPv64.net-Blockliste mit ipset und UFW (Zero-Downtime)

Diese Anleitung richtet einen automatisierten Download der IPv64.net Blockliste ein. Die IPs werden nach IPv4 und IPv6 getrennt, ressourcenschonend per ipset in den Kernel geladen und von UFW blockiert, bevor sie Dienste oder Logfiles erreichen.

Schritt 1: Benötigte Pakete installieren

Wir benötigen ipset für die Verwaltung der IPs im Arbeitsspeicher und curl für den Download. Das fehleranfällige Paket netfilter-persistent wird bewusst weggelassen.

Bash

sudo apt update
sudo apt install ipset curl -y

Schritt 2: Das Update-Skript erstellen

Dieses Skript lädt die Liste, filtert Kommentare, trennt nach Protokoll, ignoriert Duplikate (-!) und tauscht die Listen ohne Unterbrechung aus (swap). Am Ende speichert es den Stand für den nächsten Server-Neustart.

1. Datei erstellen:

Bash

sudo nano /usr/local/bin/update-blocklist.sh

2. Folgenden Code einfügen:

Bash

#!/bin/bash

LIST_URL="https://ipv64.net/blocklists/ipv64_blocklist_all.txt"

# Namen der Sets für IPv4 und IPv6
IPSET_V4="ipv64_blocklist_v4"
IPSET_V6="ipv64_blocklist_v6"
TMP_V4="${IPSET_V4}_tmp"
TMP_V6="${IPSET_V6}_tmp"

# Haupt-Sets erstellen (falls sie noch nicht existieren)
ipset create $IPSET_V4 hash:net family inet -exist
ipset create $IPSET_V6 hash:net family inet6 -exist

# Temporäre Sets erstellen und leeren
ipset create $TMP_V4 hash:net family inet -exist
ipset flush $TMP_V4
ipset create $TMP_V6 hash:net family inet6 -exist
ipset flush $TMP_V6

# Liste herunterladen, nach V4/V6 trennen und Duplikate ignorieren (-!)
curl -sL "$LIST_URL" | grep -v "^#" | grep -v "^$" | awk -v tmpv4="$TMP_V4" -v tmpv6="$TMP_V6" '
{
    if ($1 ~ /:/) {
        print "add " tmpv6 " " $1
    } else if ($1 ~ /\./) {
        print "add " tmpv4 " " $1
    }
}' | ipset restore -!

# Temporäre Sets mit den aktiven Sets tauschen (Zero-Downtime)
ipset swap $TMP_V4 $IPSET_V4
ipset swap $TMP_V6 $IPSET_V6

# Temporäre Sets löschen
ipset destroy $TMP_V4
ipset destroy $TMP_V6

# Aktuellen Stand für den nächsten Server-Neustart speichern
ipset save > /etc/ufw/ipset.rules

3. Ausführbar machen:

Bash

sudo chmod +x /usr/local/bin/update-blocklist.sh

Schritt 3: UFW-Autostart konfigurieren

Damit UFW beim Booten nicht abstürzt, muss es die gespeicherten IP-Listen einlesen, bevor die Firewall-Regeln angewendet werden.

1. Init-Datei erstellen:

Bash

sudo nano /etc/ufw/before.init

2. Folgenden Code einfügen:

Bash

#!/bin/sh
set -e

case "$1" in
start)
    # Lade die gespeicherten ipset-Listen fehlerfrei (-!)
    if [ -f /etc/ufw/ipset.rules ]; then
        ipset restore -! < /etc/ufw/ipset.rules
    fi
    ;;
stop)
    ;;
status)
    ;;
esac

3. Ausführbar machen:

Bash

sudo chmod +x /etc/ufw/before.init

Schritt 4: Die UFW-Regeln (inkl. Whitelist) eintragen

Die Block-Regeln müssen in die before.rules-Dateien eingetragen werden. Sollen bestimmte IPs von der Sperre ausgenommen werden (Whitelist), müssen diese zwingend über der DROP-Regel stehen.

Für IPv4:

  1. Datei öffnen: sudo nano /etc/ufw/before.rules
  2. Unter # End required lines einfügen:

Plaintext

# --- IPV64 BLOCKLIST START ---
# Whitelist-Beispiel (falls nötig, Raute entfernen und IP anpassen):
# -A ufw-before-input -s 203.0.113.50 -j ACCEPT

# Blockiere alle IPv4 aus der Blockliste
-A ufw-before-input -m set --match-set ipv64_blocklist_v4 src -j DROP
# --- IPV64 BLOCKLIST ENDE ---

Für IPv6:

  1. Datei öffnen: sudo nano /etc/ufw/before6.rules
  2. Unter # End required lines einfügen:

Plaintext

# --- IPV64 BLOCKLIST START ---
# Whitelist-Beispiel (falls nötig, Raute entfernen und IP anpassen):
# -A ufw6-before-input -s 2001:db8::1 -j ACCEPT

# Blockiere alle IPv6 aus der Blockliste
-A ufw6-before-input -m set --match-set ipv64_blocklist_v6 src -j DROP
# --- IPV64 BLOCKLIST ENDE ---

Schritt 5: Initiale Ausführung & UFW Reload

Skript einmalig manuell starten, um die Listen zu laden und die Sicherungsdatei anzulegen:

Bash

sudo /usr/local/bin/update-blocklist.sh

UFW neu laden, um die Regeln zu aktivieren:

Bash

sudo ufw reload

Schritt 6: Automatisierung per Cronjob

Das Skript soll jede Nacht um 03:00 Uhr automatisch die neueste Liste holen.

  1. Cronjob-Editor öffnen:

Bash

sudo crontab -e
  1. Am Ende einfügen:

Plaintext

0 3 * * * /usr/local/bin/update-blocklist.sh >/dev/null 2>&1

Schritt 7: Überprüfung (Cheatsheet)

  • Geladene IPv4-Einträge zählen: sudo ipset list ipv64_blocklist_v4 | grep "Number of entries"
  • Geladene IPv6-Einträge zählen: sudo ipset list ipv64_blocklist_v6 | grep "Number of entries"
  • Geblockte IPv4-Pakete anzeigen: sudo iptables -L ufw-before-input -v -n | grep ipv64_blocklist
  • Geblockte IPv6-Pakete anzeigen: sudo ip6tables -L ufw6-before-input -v -n | grep ipv64_blocklist

You may also like...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert