Zum Inhalt

Länderblockierung mit GeoIP2

Steuern Sie den Zugriff nach Ländern mit der genauen Geolokalisierungsdatenbank von MaxMind.


  • Schutz vor böswilligen Akteuren


    Stoppen Sie Angriffe aus Hochrisikoländern, bevor sie Ihre App erreichen

  • Compliance-fähig


    Durchsetzen geografischer Beschränkungen für GDPR, Lizenzierung oder rechtliche Anforderungen

  • Null Overhead


    In-Memory-Datenbankabfrage – keine externen API-Aufrufe oder Latenz

  • Genauige Daten


    MaxMind GeoIP2-Datenbanken mit 99,8% Genauigkeit für Länder


Voraussetzungen

Sie benötigen ein kostenloses MaxMind-Konto, um GeoIP2-Datenbanken herunterzuladen:

  1. Registrieren Sie sich unter maxmind.com/en/geolite2/signup
  2. Generieren Sie einen Lizenzschlüssel in Ihrem Konto
  3. Speichern Sie ihn für die automatisierte Aktualisierungseinrichtung

Schnelle Einrichtung

Schritt 1: GeoIP2-Modul installieren

# GetPageSpeed-Repository installieren
dnf -y install https://extras.getpagespeed.com/release-latest.rpm

# GeoIP2-Modul und automatischen Datenbankaktualisierer installieren
dnf -y install nginx-module-geoip2 geoipupdate

Aktivieren Sie in /etc/nginx/nginx.conf:

load_module modules/ngx_http_geoip2_module.so;

Schritt 2: Datenbankaktualisierungen konfigurieren

Bearbeiten Sie /etc/GeoIP.conf:

AccountID YOUR_ACCOUNT_ID
LicenseKey YOUR_LICENSE_KEY
EditionIDs GeoLite2-Country GeoLite2-City

Laden Sie die Datenbanken herunter:

geoipupdate

Aktivieren Sie automatische wöchentliche Aktualisierungen:

systemctl enable --now geoipupdate.timer

Schritt 3: NGINX konfigurieren

Fügen Sie Ihrem http-Block in /etc/nginx/nginx.conf hinzu:

# GeoIP2-Datenbanken laden
geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
    auto_reload 60m;
    $geoip2_country_code country iso_code;
    $geoip2_country_name country names en;
}

Schritt 4: Länder blockieren

# Russland, China, Nordkorea blockieren
map $geoip2_country_code $blocked_country {
    default 0;
    RU 1;
    CN 1;
    KP 1;
}

server {
    # ... Ihre Serverkonfiguration ...

    if ($blocked_country) {
        return 403;
    }
}
# Nur die USA, das Vereinigte Königreich, Kanada, Australien zulassen
map $geoip2_country_code $allowed_country {
    default 0;
    US 1;
    GB 1;
    CA 1;
    AU 1;
}

server {
    # ... Ihre Serverkonfiguration ...

    if ($allowed_country = 0) {
        return 403;
    }
}
map $geoip2_country_code $blocked_country {
    default 0;
    RU 1;
    CN 1;
}

server {
    error_page 403 /geo-blocked.html;

    location = /geo-blocked.html {
        internal;
        root /var/www/error-pages;
    }

    if ($blocked_country) {
        return 403;
    }
}

NGINX neu laden:

nginx -t && systemctl reload nginx

Testen

# Mit einer bekannten IP testen
curl -H 'X-Forwarded-For: 8.8.8.8' https://example.com
# Sollte funktionieren (Google DNS - USA)

curl -H 'X-Forwarded-For: 77.88.8.8' https://example.com
# Sollte blockiert werden (Yandex DNS - Russland, wenn RU blockiert ist)

Lokal testen

Lokale/private IPs geben leere Ländercodes zurück. Testen Sie mit echten öffentlichen IPs.


Erweiterte Nutzung

Verwenden Sie die echte Client-IP hinter Proxy/CDN

geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
    $geoip2_country_code source=$http_x_forwarded_for country iso_code;
}

Unterschiedliche Regeln für unterschiedliche Pfade

# Überall blockieren, außer API
location / {
    if ($blocked_country) {
        return 403;
    }
    # ... normale Konfiguration ...
}

location /api/ {
    # API von überall zugänglich
    # ... API-Konfiguration ...
}

Länderdaten protokollieren

log_format geo '$remote_addr - $geoip2_country_code - $request';
access_log /var/log/nginx/geo.log geo;

Rate-Limit nach Land

# Strengere Limits für Hochrisikoländer
map $geoip2_country_code $limit_key {
    default $binary_remote_addr;
    RU $binary_remote_addr$geoip2_country_code;
    CN $binary_remote_addr$geoip2_country_code;
}

limit_req_zone $limit_key zone=geo_limit:10m rate=10r/s;

Häufige Ländercodes

Code Land Code Land
US Vereinigte Staaten DE Deutschland
GB Vereinigtes Königreich FR Frankreich
CA Kanada AU Australien
CN China RU Russland
IN Indien BR Brasilien
JP Japan KR Südkorea
KP Nordkorea IR Iran

Vollständige Liste: ISO 3166-1 alpha-2


Fehlersuche

Land immer leer
  • Überprüfen Sie, ob der Datenbankpfad existiert: ls -la /usr/share/GeoIP/
  • Überprüfen Sie, ob das Modul geladen ist: nginx -V 2>&1 | grep geoip2
  • Überprüfen Sie, ob die IP nicht privat/localhost ist
Falsches Land erkannt
  • Datenbank aktualisieren: geoipupdate
  • Überprüfen, ob hinter CDN/Proxy (verwenden Sie X-Forwarded-For)
  • MaxMind-Genauigkeit: ~99,8% für Länder
Datenbank wird nicht aktualisiert
  • Überprüfen Sie den Timer: systemctl status geoipupdate.timer
  • Überprüfen Sie die Anmeldeinformationen in /etc/GeoIP.conf
  • Manuell ausführen: geoipupdate -v

Verwandt