
GeoIP-Blocking unter Debian 13 & Ubuntu
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 -y2. 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.nftFü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.confFü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.shFü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_FILEMachen Sie das Skript ausführbar:
sudo chmod +x /usr/local/bin/update-geoip.sh5. 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.shAktivieren Sie anschließend den nftables-Systemdienst, damit die Firewall bei jedem Systemstart automatisch mit den konfigurierten Regeln hochfährt:
sudo systemctl enable --now nftablesSie 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_ips6. 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 -eFü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>&1Hinweis: 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.