Linux: Datenverkehr nach Land blockieren (GeoIP, nftables) | INTROSERV
EUR
european

EUR

usa

USD

German De
Ex. VAT Ex. VAT 0%

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)

Info

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

Warning

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.

Info

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

Warning

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

Warning

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

Tip

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.

Info

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"

Warning

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:

  1. 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

  2. Prüfen Sie, ob der Parameter crashkernel in der Bootloader-Konfiguration gesetzt ist:

    cat /proc/cmdline | grep crashkernel

    Sie sollten etwas wie crashkernel=256M sehen. 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 - 256M ist ein sicherer Standardwert für Server mit 4 GB oder mehr.

  3. Prüfen Sie, ob der Dienst kdump aktiv ist:

    sudo systemctl status kdump

Info

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 Sie linux-headers-$(uname -r).
  • iptables: command not found (Debian 13): Installieren Sie iptables mit sudo apt install iptables.
  • nftables.service is not active: Führen Sie sudo systemctl enable --now nftables aus.
  • Leere /etc/sysconfig/nftables.conf unter 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

Info

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

Warning

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

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA