← Alle Beiträge

GeoIP-Blocking unter Debian 13 & Ubuntu

26.10.2026 #ubuntu #debian #linux #ip

GeoIP-Blocking (Deutschland) unter Debian 13 & Ubuntu mit nftables

Diese Anleitung beschreibt, wie Sie mithilfe von nftables den Zugriff auf Ihren Debian 13 (Trixie) oder Ubuntu Server so einschränken, dass bestimmte Dienste (oder der gesamte Server) ausschließlich aus dem deutschen IP-Adressraum erreichbar sind.

Da moderne Linux-Distributionen standardmäßig nftables nutzen, verwenden wir native Sets. Diese verarbeiten tausende IP-Bereiche extrem schnell und ressourcenschonend.


1. Voraussetzungen installieren

Stellen Sie sicher, dass Ihr System auf dem neuesten Stand ist und die benötigten Werkzeuge nftables und curl installiert sind:

sudo apt update
sudo apt install nftables curl -y

2. Nftables-Konfiguration für das IP-Set vorbereiten

Wir legen eine separate Konfigurationsdatei an, in der das IP-Set definiert wird. Das automatisierte Skript wird später die heruntergeladenen IP-Adressen in diese Datei schreiben.

Erstellen Sie das Verzeichnis und die Datei für die deutschen IP-Zonen:

sudo mkdir -p /etc/nftables
sudo nano /etc/nftables/de_ips.nft

Fügen Sie dort folgendes Grundgerüst ein (dies definiert eine Tabelle namens security und ein Set für IPv4-Bereiche):

table inet security {
    set de_ips {
        type ipv4_addr
        flags interval
        elements = {
            # Hier landen die IP-Bereiche automatisch via Skript
        }
    }
}

Speichern und schließen Sie die Datei mit STRG+O, Enter und STRG+X.


3. Hauptkonfiguration von nftables anpassen

Damit die Regeln aktiv werden und auch nach einem Server-Neustart automatisch geladen werden, binden wir unsere neue Datei in die Hauptkonfiguration ein.

Öffnen Sie die zentrale Konfigurationsdatei:

sudo nano /etc/nftables.conf

Fügen Sie am Ende der Datei folgende Zeilen hinzu, um die Tabelle zu laden und den Traffic zu filtern.

Option A: Nur bestimmten Dienst (z. B. SSH / Port 22) schützen

Empfohlen, um sich nicht versehentlich komplett auszusperren.

# IP-Set laden
include "/etc/nftables/de_ips.nft"

table inet security {
    chain input_filter {
        type filter hook input priority filter; policy accept;

        # Erlaube bereits bestehende und verwandte Verbindungen (wichtig!)
        ct state established,related accept

        # Erlaube lokalen Traffic (Loopback-Interface)
        iifname "lo" accept

        # Erlaube SSH (Port 22) NUR aus Deutschland, blockiere den Rest aus dem Ausland
        tcp dport 22 ip saddr @de_ips accept
        tcp dport 22 drop
    }
}

Option B: Den GESAMTEN Server für das Ausland sperren

Achtung: Stellen Sie sicher, dass Sie sich während der Einrichtung innerhalb Deutschlands befinden, da Sie sonst sofort die Verbindung verlieren!

# IP-Set laden
include "/etc/nftables/de_ips.nft"

table inet security {
    chain input_filter {
        type filter hook input priority filter; policy drop;

        # Erlaube bereits bestehende und verwandte Verbindungen
        ct state established,related accept

        # Erlaube lokalen Traffic
        iifname "lo" accept

        # Erlaube jeglichen eingehenden Traffic aus Deutschland
        ip saddr @de_ips accept
    }
}

Speichern und schließen Sie die Datei.


4. Automatisches Update-Skript einrichten

Da sich weltweite IP-Zuweisungen dynamisch ändern, erstellen wir ein Bash-Skript, welches die aktuellen Listen von IPDeny herunterlädt und das nftables-Set befüllt.

Erstellen Sie die Skriptdatei:

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

Fügen Sie diesen Inhalt ein:

#!/bin/bash
# Pfade definieren
TMP_FILE="/tmp/de_zone.txt"
NFT_FILE="/etc/nftables/de_ips.nft"

echo "Lade deutsche IP-Bereiche herunter..."
curl -s -o $TMP_FILE "http://www.ipdeny.com/ipblocks/data/aggregated/de-zone.zone"

# Überprüfen, ob der Download erfolgreich war und die Datei nicht leer ist
if [ -s $TMP_FILE ]; then
    echo "Aktualisiere nftables GeoIP-Set..."
    
    # Struktur der de_ips.nft Datei neu aufbauen
    echo "table inet security {" > $NFT_FILE
    echo "    set de_ips {" >> $NFT_FILE
    echo "        type ipv4_addr" >> $NFT_FILE
    echo "        flags interval" >> $NFT_FILE
    echo "        elements = {" >> $NFT_FILE
    
    # Jede IP-Range mit einem Komma versehen und in die Datei schreiben
    sed 's/$/,/' $TMP_FILE >> $NFT_FILE
    
    echo "        }" >> $NFT_FILE
    echo "    }" >> $NFT_FILE
    echo "}" >> $NFT_FILE
    
    # Nftables Regeln live neu laden, um die Änderungen direkt anzuwenden
    nft -f /etc/nftables.conf
    echo "Erfolgreich aktualisiert und Firewall live neu geladen!"
else
    echo "Fehler: Download fehlgeschlagen oder Datei ist leer."
fi

# Temporäre Datei aufräumen
rm -f $TMP_FILE

Machen Sie das Skript ausführbar:

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

5. Skript das erste Mal ausführen & Dienst aktivieren

Führen Sie das Skript nun einmal manuell aus, um die IP-Adressen zu laden und das Set zu befüllen:

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

Aktivieren Sie anschließend den nftables-Systemdienst, damit die Firewall bei jedem Systemstart automatisch mit den konfigurierten Regeln hochfährt:

sudo systemctl enable --now nftables

Sie können den aktuellen Status der Firewall und des geladenen IP-Sets jederzeit mit folgendem Befehl überprüfen:

sudo nft list set inet security de_ips

6. Automatische wöchentliche Aktualisierung (Cronjob)

Damit die Liste der deutschen IP-Adressen dauerhaft aktuell bleibt, richten wir einen wöchentlichen Cronjob ein.

Öffnen Sie die Crontab des Root-Benutzers:

sudo crontab -e

Fügen Sie ganz unten folgende Zeile hinzu, um das Skript jeden Sonntag um 03:00 Uhr nachts vollautomatisch im Hintergrund auszuführen:

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

Hinweis: Wenn Sie zusätzlich IPv6-Adressen blockieren möchten, muss das Skript sowie die nftables-Konfiguration um ein analoges Set vom Typ ipv6_addr und die entsprechende Zonen-Datei (z. B. de-ipv6.zone) erweitert werden.