So blockieren Sie Datenverkehr nach Land auf einer Linux-Firewall mit GeoIP-Regeln
Schwierigkeitsgrad: Profi
Geschätzte Dauer: ca. 35 Minuten
Ziel: GeoIP-Firewallregeln auf einem Linux-Server konfigurieren, um den Zugriff nach Ländern einzuschränken - mit iptables und dem Modul xtables-geoip oder mit nftables und IP-Sets - und Aktualisierungen automatisieren, damit die Listen aktuell bleiben.
Einführung
Wenn Ihre Dienste auf eine bestimmte Region ausgerichtet sind, gibt es keinen Grund, Datenverkehr aus dem Rest der Welt anzunehmen. Mit dem Geo-Blocking auf der Linux-Firewall verwerfen Sie Pakete nach Herkunftsland, bevor sie Ihre Anwendung erreichen - das reduziert das Rauschen durch Brute-Force-Angriffe und verkleinert die Angriffsfläche. In dieser Anleitung sperren Sie den Datenverkehr nach Land auf einer Linux-Firewall mit GeoIP-Firewallregeln: zuerst mit iptables und xtables-addons, danach mit nftables und CIDR-basierten IP-Sets, einschließlich automatischer Datenbankaktualisierungen, damit Ihre IP-Sperre nach Ländern korrekt bleibt.
Voraussetzungen
Stellen Sie vor Beginn sicher, dass die folgenden Bedingungen erfüllt sind:
- Betriebssystem: Ubuntu 22.04/24.04 LTS, Debian 12/13, AlmaLinux/RHEL 9/10
- Zugriff: sudo- oder root-Zugriff auf den Server
- Firewall: iptables 1.8+ mit xtables-addons oder nftables 1.0+
- Erforderliche Pakete:
curl,iptables,linux-headers-$(uname -r)(Debian/Ubuntu); aktiviertes EPEL-Repository (RHEL/AlmaLinux 9)
Unter Debian 12+, Ubuntu 22.04+ und RHEL/AlmaLinux 9+ ist der Befehl iptables ein Wrapper um das nftables-Backend (iptables-nft). Die Übereinstimmungsprüfung -m geoip funktioniert mit diesem Backend einwandfrei.
- Netzwerk: ein klares Verständnis davon, aus welchen Ländern Ihre Dienste Datenverkehr annehmen müssen
- Erforderliche Kenntnisse: sicherer Umgang mit der Linux-Befehlszeile, grundlegende Firewall-Konzepte und das Bearbeiten von Dateien
- Absicherung: eine funktionierende Out-of-Band-Konsole (IPMI/KVM) oder der Rettungsmodus des Anbieters für den Fall, dass eine Regel Sie aussperrt
Länderbasierte Firewallregeln über eine SSH-Sitzung anzuwenden ist grundsätzlich riskant. Sperren Sie versehentlich Ihr eigenes Land, verlieren Sie den Zugriff. Halten Sie stets einen Out-of-Band-Zugang bereit und testen Sie Regeln, bevor Sie sie dauerhaft machen.
Schritt 1: Erlaubte und gesperrte Länder festlegen
Legen Sie Ihre Richtlinie fest, bevor Sie die Firewall anfassen. Es gibt zwei Ansätze:
- Allowlist (empfohlen): Nur die benötigten Länder zulassen, alles andere verwerfen. Das ist strenger und sicherer.
- Blocklist: Alles zulassen, bestimmte Länder verwerfen. Einfacher, lässt aber mehr Angriffsfläche offen.
In dieser Anleitung verwenden wir den Allowlist-Ansatz - er entspricht dem Prinzip der minimalen Rechte. Angenommen, Ihre Dienste bedienen nur Benutzer aus den USA, Deutschland und Polen. Die zweistelligen ISO-Ländercodes lauten: US, DE, PL.
Ländercodes folgen dem Standard ISO 3166-1 alpha-2. Die vollständige Liste finden Sie unter https://www.iso.org/obp/ui/#search/code/. Seien Sie präzise - ein Tippfehler sperrt unbemerkt legitimen Datenverkehr.
Schritt 2: GeoIP mit iptables einrichten (xtables-addons)
Diese Methode nutzt das Modul xt_geoip aus xtables-addons, das iptables um die Übereinstimmungsprüfung -m geoip erweitert. Es ist eine der bewährtesten Methoden, um IP-Bereiche nach Land unter Linux zu sperren.
2.1 xtables-addons und Abhängigkeiten installieren
Debian/Ubuntu:
sudo apt install -y linux-headers-$(uname -r) sudo apt update && sudo apt install -y \ xtables-addons-common libtext-csv-xs-perl unzip iptables curl
xtables-addons ist in den Repositories von AlmaLinux 10 nicht verfügbar. Verwenden Sie stattdessen die nftables-Methode (Schritt 3) oder kompilieren Sie xtables-addons aus dem Quellcode.
Prüfen Sie nach der Installation, ob das Modul verfügbar ist:
modinfo xt_geoip
Die erwartete Ausgabe enthält eine Zeile wie:
filename: /lib/modules/.../xt_geoip.ko description: Xtables: country matching via GeoIP
Gibt modinfo einen Fehler zurück, wurde das Modul nicht korrekt installiert. Prüfen Sie, ob Ihre Kernel-Header zur laufenden Kernel-Version passen.
2.2 GeoIP-Datenbank herunterladen und erstellen
Das Modul xt_geoip benötigt eine lokale Datenbank mit Zuordnungen von Ländern zu IP-Adressen. Diese werden als CSV-Dateien geliefert und müssen in ein Binärformat umgewandelt werden.
Legen Sie das Arbeitsverzeichnis und das Datenbankverzeichnis an:
sudo mkdir -p /usr/share/xt_geoip
Laden Sie die aktuellen GeoIP-CSV-Daten herunter. Die Quelle stellt die Daten über die xtables-addons-Werkzeuge bereit:
cd /tmp /usr/libexec/xtables-addons/xt_geoip_dl
Wandeln Sie die heruntergeladene CSV in das Binärformat um:
/usr/libexec/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
Erwartete Ausgabe - eine Liste der verarbeiteten Ländercodes:
4540 IPv4 ranges for ZA 1071 IPv6 ranges for ZA 147 IPv4 ranges for ZW 94 IPv6 ranges for ZW ...
2.3 iptables-Regeln mit GeoIP-Abgleich anwenden
Erstellen Sie nun die eigentlichen GeoIP-Firewallregeln. Das folgende Skript lässt Datenverkehr aus Ihren gewählten Ländern zu und verwirft alles andere in der Chain INPUT.
Sichern Sie zuerst Ihre aktuellen Regeln:
sudo iptables-save > /tmp/iptables-backup-$(date +%Y%m%d).rules
Wenden Sie die Länder-Allowlist an:
# Allow loopback sudo iptables -A INPUT -i lo -j ACCEPT # Allow established and related connections sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Allow traffic from US, DE, PL only sudo iptables -A INPUT -m geoip --src-cc US,DE,PL -j ACCEPT # Log dropped packets sudo iptables -A INPUT -j LOG --log-prefix "GEOIP-DROP: " --log-level 4 # Drop everything else sudo iptables -A INPUT -j DROP
Die abschließende DROP-Regel blockiert den gesamten Datenverkehr, der nicht zur Allowlist passt. Stellen Sie sicher, dass das Land Ihrer SSH-Quelle enthalten ist, sonst werden Sie sofort ausgesperrt. Wenn Sie unsicher sind, fügen Sie vor dem DROP eine temporäre ACCEPT-Regel für Ihre IP hinzu: sudo iptables -I INPUT -s <YOUR_IP_ADDRESS> -j ACCEPT.
Prüfen Sie, ob die Regeln aktiv sind:
sudo iptables -L INPUT -v --line-numbers
Erwartete Ausgabe:
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere /* loopback */ 2 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED 3 ACCEPT all -- anywhere anywhere -m geoip --source-country US,DE,PL 4 LOG all -- anywhere anywhere LOG level warning prefix "GEOIP-DROP: " 5 DROP all -- anywhere anywhere
2.4 iptables-Regeln über Neustarts hinweg speichern
Mit iptables angewendete Regeln gehen beim Neustart verloren. Speichern Sie sie:
Debian/Ubuntu:
sudo apt install iptables-persistent -y sudo netfilter-persistent save
AlmaLinux/RHEL:
sudo service iptables save
Schritt 3: GeoIP mit nftables einrichten (IP-Sets)
Verwendet Ihr System nftables (Standard unter Debian 11+, Ubuntu 22.04+ und RHEL 9+), erreichen Sie dasselbe Ergebnis mit IP-Sets, die mit CIDR-Blöcken auf Länderebene befüllt werden. Dieser Ansatz benötigt keine Kernel-Module über das hinaus, was nftables bereits mitbringt.
3.1 IP-Bereiche der Länder beschaffen
Laden Sie CIDR-Listen für die Länder herunter, die Sie zulassen möchten. Mehrere öffentliche Quellen stellen diese bereit, zum Beispiel ipdeny.com:
sudo mkdir -p /etc/nftables/geoip cd /etc/nftables/geoip # Download CIDR blocks for US, DE, PL for CC in us de pl; do sudo curl -sS -o /etc/nftables/geoip/${CC}.zone \ "https://www.ipdeny.com/ipblocks/data/aggregated/${CC}-aggregated.zone"; done
Prüfen Sie, ob die Dateien CIDR-Bereiche enthalten:
head -5 /etc/nftables/geoip/us.zone
Erwartete Ausgabe (CIDR-Bereiche, einer pro Zeile):
1.178.0.0/23 1.178.4.0/22 1.178.8.0/21 ...
3.2 nftables-Konfiguration erstellen und laden
Erstellen Sie ein Skript, das die CIDR-Dateien liest und ein nftables-Set erzeugt. Speichern Sie es als /etc/nftables/geoip-update.sh:
sudo nano /etc/nftables/geoip-update.sh
Fügen Sie Folgendes ein:
#!/bin/bash # Generate nftables set from country CIDR files set -euo pipefail GEOIP_DIR="/etc/nftables/geoip" OUTPUT="/etc/nftables/geoip-sets.nft" echo "define ALLOWED_COUNTRIES = {" > "$OUTPUT" for zone_file in "$GEOIP_DIR"/*.zone; do while IFS= read -r cidr; do && continue echo " ${cidr}," >> "$OUTPUT" done < "$zone_file" done echo "}" >> "$OUTPUT" echo "GeoIP set generated: $(wc -l < "$OUTPUT") lines"
Machen Sie es ausführbar:
sudo chmod +x /etc/nftables/geoip-update.sh
Führen Sie das Skript aus:
sudo /etc/nftables/geoip-update.sh
Verweisen Sie nun in Ihrer nftables-Konfiguration auf dieses Set:
# Debian/Ubuntu: sudo nano /etc/nftables.conf # AlmaLinux/RHEL: sudo nano /etc/sysconfig/nftables.conf
Fügen Sie das Include hinzu und verwenden Sie das Set in Ihrer Input-Chain:
#!/usr/sbin/nft -f flush ruleset include "/etc/nftables/geoip-sets.nft" table inet filter { chain input { type filter hook input priority 0; policy drop; ct state invalid drop iif lo accept ct state established,related accept # Allow ICMP ip protocol icmp accept ip6 nexthdr icmpv6 accept # GeoIP: allow only listed countries ip saddr $ALLOWED_COUNTRIES accept # Log dropped packets log prefix "geoip-drop: " level info # Everything else is dropped by policy } chain forward { type filter hook forward priority 0; policy drop; } chain output { type filter hook output priority 0; policy accept; } }
Prüfen Sie die Syntax, bevor Sie die Konfiguration anwenden:
sudo nft -c -f /etc/nftables.conf
Erscheinen keine Fehler, wenden Sie die Konfiguration an und prüfen Sie sie:
sudo nft -f /etc/nftables.conf sudo systemctl enable --now nftables sudo nft list ruleset | head -20
Bei sehr großen IP-Sets (über 100.000 Einträge) kommt nftables deutlich besser zurecht als iptables. Der Set-basierte Abgleich in nftables nutzt intern Hash-Maps, sodass die Suchleistung unabhängig von der Set-Größe konstant bleibt.
Schritt 4: GeoIP-Datenbank-Updates automatisieren
Die Zuordnung von IP-Adressen zu Ländern ändert sich ständig. Eine Datenbank vom letzten Monat hat Lücken. Planen Sie automatische Aktualisierungen mit cron.
4.1 Update-Skript erstellen
Erstellen Sie /usr/local/sbin/geoip-refresh.sh:
sudo nano /usr/local/sbin/geoip-refresh.sh
Für iptables (xtables-addons):
#!/bin/bash set -euo pipefail cd /tmp /usr/libexec/xtables-addons/xt_geoip_dl /usr/libexec/xtables-addons/xt_geoip_build \ -D /usr/share/xt_geoip *.csv rm -f /tmp/*.csv /tmp/*.zip logger "GeoIP database updated successfully"
Für nftables:
#!/bin/bash set -euo pipefail GEOIP_DIR="/etc/nftables/geoip" for CC in us de pl; do curl -sS -o "${GEOIP_DIR}/${CC}.zone" \ "https://www.ipdeny.com/ipblocks/data/aggregated/${CC}-aggregated.zone" done /etc/nftables/geoip-update.sh systemctl reload nftables logger "GeoIP nftables sets updated and reloaded"
Machen Sie es ausführbar:
sudo chmod +x /usr/local/sbin/geoip-refresh.sh
4.2 Mit cron planen
Stellen Sie vor dem Einplanen der cron-Aufgabe sicher, dass der Dienst nftables aktiviert ist und läuft (bei Verwendung der nftables-Methode):
sudo systemctl enable --now nftables
Führen Sie das Update wöchentlich aus:
sudo crontab -e
Fügen Sie hinzu:
0 3 * * 0 /usr/local/sbin/geoip-refresh.sh >> /var/log/geoip-update.log 2>&1
Das läuft jeden Sonntag um 3:00 Uhr. Prüfen Sie nach dem ersten geplanten Lauf, ob es funktioniert hat:
cat /var/log/geoip-update.log
Schritt 5: Überprüfung und Tests
5.1 Test aus einem erlaubten Land
Verbinden Sie sich von einem Rechner in einem Ihrer erlaubten Länder per SSH oder senden Sie eine HTTP-Anfrage:
curl -v http://<YOUR_SERVER_IP>
Die Verbindung sollte normal zustande kommen.
5.2 Ein gesperrtes Land simulieren
Verwenden Sie curl mit einer bekannten IP aus einem gesperrten Land über einen Proxy, oder testen Sie lokal, indem Sie Ihr eigenes Land vorübergehend aus der Allowlist entfernen und von einem zweiten Terminal aus eine Verbindung versuchen.
Mit Online-Diensten wie https://ipinfo.io können Sie prüfen, in welchem Land eine bestimmte IP registriert ist. Verwenden Sie curl https://ipinfo.io/<YOUR_IP_ADDRESS> zur Bestätigung.
5.3 Firewall-Zähler prüfen
iptables:
sudo iptables -L INPUT -v -n
Beobachten Sie die Paketzähler an der DROP-Regel - sie sollten ansteigen, sobald gesperrter Datenverkehr eintrifft.
nftables:
sudo nft list chain inet filter input
5.4 Systemprotokolle überwachen
Prüfen Sie im Systemprotokoll auf verworfene Pakete:
sudo journalctl -k --since "1 hour ago" | grep -i "geoip-drop"
Beobachten Sie eine große Menge an Kernel-Log-Meldungen über verworfene Pakete und reagiert Ihr System nicht mehr, kann eine Log-Flut die Ursache sein. Im schlimmsten Fall kann dies einen Kernel-Panic auslösen. Haben Sie den Parameter crashkernel und den Dienst kdump konfiguriert, erzeugt ein Kernel-Panic einen Crash-Dump (vmcore) in /var/crash, den Sie später analysieren können. Ohne kdump erhalten Sie nur einen Neustart und keine Diagnosedaten. Eine kurze Übersicht finden Sie im folgenden Abschnitt.
Schritt 6: Schutz vor Kernel-Panic bei Firewall-Änderungen
Aggressive Firewall-Änderungen auf einem ausgelasteten Produktionsserver - insbesondere solche, die plötzliche Datenverkehrsspitzen oder Log-Fluten auslösen - können in seltenen Fällen zu einem Kernel-Panic führen. Wenn das passiert und Sie nicht vorbereitet sind, erhalten Sie nichts: nur einen Neustart und keine Daten darüber, was schiefgelaufen ist.
Kdump ist der Standardmechanismus unter Linux, um bei einem Kernel-Panic einen Crash-Dump zu erfassen. Er nutzt kexec, um einen zweiten Capture-Kernel zu starten, der das Speicherabbild (vmcore) auf die Festplatte schreibt, bevor das System neu startet.
So stellen Sie sicher, dass Diagnosedaten verfügbar sind:
- Prüfen Sie, ob kdump installiert und aktiviert ist. Unter RHEL/AlmaLinux ist es in der Regel vorinstalliert. Unter Debian/Ubuntu:
sudo apt install kdump-tools kexec-tools -y
- Prüfen Sie, ob der Parameter
crashkernelin der Bootloader-Konfiguration gesetzt ist:
Sie sollten etwas wiecat /proc/cmdline | grep crashkernel
crashkernel=256Msehen. Fehlt er, müssen Sie den Parameter crashkernel in GRUB konfigurieren und neu starten. Die genaue Größe des für kdump unter Linux reservierten Speichers hängt vom gesamten Arbeitsspeicher ab -256Mist ein sicherer Standardwert für Server mit 4 GB oder mehr. - Prüfen Sie, ob der Dienst kdump aktiv ist:
sudo systemctl status kdump
Tritt tatsächlich ein Kernel-Panic auf, startet das System per kexec den Capture-Kernel, schreibt den vmcore nach /var/crash und startet anschließend normal neu. Danach können Sie mit dem Werkzeug crash eine vmcore-Analyse unter Linux durchführen, um die Ursache zu ermitteln. Das ist ein Standardbestandteil der Fehlerbehebung bei Kernel-Panics unter Linux auf Produktivsystemen. Eine vollständige Anleitung, wie Sie kdump unter Linux aktivieren, sowie zur kexec-kdump-Konfiguration unter Linux finden Sie in einer eigenen kdump-Anleitung.
Fehlerbehebung
- Per SSH ausgesperrt: Verwenden Sie die Out-of-Band-Konsole bzw. den Rettungsmodus.
modinfo xt_geoip: not found: Installieren Sielinux-headers-$(uname -r).iptables: command not found(Debian 13): Installieren Sie iptables mitsudo apt install iptables.nftables.serviceis not active: Führen Siesudo systemctl enable --now nftablesaus.- Leere
/etc/sysconfig/nftables.confunter AlmaLinux: Verwenden Sie diesen Pfad statt/etc/nftables.conf, um Regeln zu konfigurieren.
Rollback
So machen Sie die länderbasierte Sperre rückgängig und stellen den offenen Zugriff wieder her:
iptables - aus dem Backup wiederherstellen:
sudo iptables-restore < /tmp/iptables-backup-*.rules
Haben Sie die GeoIP-Regeln auf einem Server ohne vorherige Firewall-Konfiguration angewendet, ist die Backup-Datei leer. Verwenden Sie in diesem Fall die unten stehenden Befehle zum Leeren und Setzen der Policy statt iptables-restore.
Oder leeren Sie alle Regeln:
sudo iptables -F INPUT sudo iptables -P INPUT ACCEPT
Das Leeren mit der Policy ACCEPT entfernt jeden Firewall-Schutz. Wenden Sie unmittelbar danach Ihr Standard-Sicherheitsregelwerk an.
nftables - Standardzustand wiederherstellen:
sudo nft flush ruleset
Stellen Sie anschließend Ihre nftables-Basiskonfiguration (ohne GeoIP) wieder her:
sudo nft -f /etc/nftables.conf.backup
So entfernen Sie die GeoIP-Komponenten vollständig:
sudo rm -rf /etc/nftables/geoip sudo rm -f /etc/nftables/geoip-sets.nft /etc/nftables/geoip-update.sh sudo crontab -l | grep -v geoip-refresh | sudo crontab -
xtables-addons entfernen (falls installiert):
Debian/Ubuntu:
sudo apt remove xtables-addons-common -y
AlmaLinux/RHEL:
sudo dnf remove xtables-addons -y
Fazit
Ihr Server nutzt nun GeoIP-Firewallregeln, um Datenverkehr nach Land unter Linux zu sperren - entweder über iptables mit xt_geoip oder über nftables mit CIDR-basierten IP-Sets. Die Datenbank wird automatisch aktualisiert, Sie haben einen Rollback-Plan, und mit kdump zur Erfassung von Crash-Dumps bei einem Kernel-Panic ist Ihre Produktionsumgebung sowohl gegen alltägliche Bedrohungen als auch gegen Worst-Case-Szenarien abgesichert.
Dokumentversion: 1.0
Zuletzt aktualisiert: Mai 2026
Verantwortlich: Team für technische Dokumentation