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:
- Registrieren Sie sich unter maxmind.com/en/geolite2/signup
- Generieren Sie einen Lizenzschlüssel in Ihrem Konto
- 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
-
GeoIP2-Modul
Vollständige Direktivenreferenz
-
ModSecurity WAF
Vollständige Webanwendungsfirewall
-
Rate-Limitierung
Schutz vor Missbrauch