2026年11月12日
2026年11月12日
Nginx GeoIP2: Zugriff nach Ländern beschränken (GeoLite2, WordPress)
Dieser Artikel ist eine lokalisierte Fassung des japanischen Originals. Japanisches Original lesen
Um den Zugriff auf Nginx nach Ländern zu beschränken, verwenden Sie das GeoIP2-Modul (ngx_http_geoip2_module) und die MaxMind-Datenbank GeoLite2: Ein geoip2-Block schreibt den Ländercode in eine Variable, und eine map entscheidet über Erlauben oder Sperren. So geht es im November 2026. Die Anleitungen älterer Artikel, die eine GeoLite-.dat-Datei per wget laden, funktionieren nicht mehr, weil diese Daten nicht mehr verteilt werden.
Zuerst das Wichtigste in Kürze.
- Das alte
ngx_http_geoip_module(GeoIP Legacy) lässt sich für neue Setups nicht mehr verwenden, da MaxMind das alte Datenformat nicht mehr ausliefert. Wechseln Sie zu GeoIP2 (Format.mmdb). - GeoLite2 ist kostenlos, erfordert aber ein MaxMind-Konto und einen Lizenzschlüssel. Download und Aktualisierung übernimmt
geoipupdate. - In Nginx erzeugen Sie mit einem
geoip2-Block eine Variable wie$geoip2_country_code, bilden mitmapdie Werte 0 / 1 für Sperren / Erlauben (entsprechenddeny/allow) und liefern in derlocationperreturn 403eine Sperre aus. - Wenn Ihre Website hinter einem CDN wie Cloudflare liegt, müssen Sie zuerst mit
real_ip_headerdie echte IP des Besuchers wiederherstellen. Sonst werden alle Zugriffe dem Land des CDN zugeordnet. - Eine Länderbeschränkung ist nur eine unterstützende Maßnahme, die sich mit VPN oder Relays umgehen lässt. Sinnvoll ist sie vor allem für Login und Admin-Bereich, nicht für die gesamte öffentliche Website.
Unterschied zwischen altem geoip und GeoIP2
| Merkmal | ngx_http_geoip_module (alt) | ngx_http_geoip2_module (GeoIP2) |
|---|---|---|
| Datenformat | GeoIP Legacy (.dat) |
GeoIP2 (.mmdb) |
| Kostenlose Daten | Beendet (Verteilung 2019 eingestellt) | GeoLite2 (Konto und Lizenzschlüssel erforderlich) |
| Benötigte Bibliothek | libGeoIP | libmaxminddb |
| Bezug des Moduls | Teil von Nginx (--with-http_geoip_module) |
Modul von Drittanbietern leev/ngx_http_geoip2_module. Für Debian / Ubuntu gibt es ein Paket |
| Variablen | Feste Namen wie $geoip_country_code |
Namen vergeben Sie selbst im geoip2-Block |
Wenn Ihre bestehende Konfiguration noch geoip_country verwendet, wird die Datenbank nicht mehr aktualisiert und die Zuordnung veraltet. Nutzen Sie die Gelegenheit, auf GeoIP2 umzusteigen.
Schritt 1: Bei MaxMind registrieren und einen Lizenzschlüssel erstellen
- Legen Sie auf der Seite MaxMind GeoLite2 ein kostenloses Konto an.
- Erstellen Sie nach dem Login im Kontobereich einen License Key (der Schlüssel wird nur bei der Erstellung angezeigt, notieren Sie ihn also).
- Als Datenbank genügt
GeoLite2-Country, wenn Sie nur Länder brauchen; für Städte nehmen SieGeoLite2-City. Für eine Länderbeschränkung reicht Country.
Die Nutzungsbedingungen (GeoLite2 End User License Agreement) enthalten Regeln zur Weitergabe und Anzeige der Daten. Wenn Sie die Daten nur intern auf Ihrem Server zur Prüfung nutzen, ist das in der Regel unproblematisch; lesen Sie die Bedingungen aber bei der Registrierung durch.
Schritt 2: Datenbank mit geoipupdate laden und aktualisieren
GeoLite2 wird regelmäßig aktualisiert. Laden Sie die Dateien daher nicht von Hand herunter, sondern nutzen Sie geoipupdate (Dokumentation zu geoipupdate).
# Debian / Ubuntu
sudo apt install geoipupdate
# RHEL-Familie (AlmaLinux / Rocky Linux) über EPEL
sudo dnf install geoipupdate
Tragen Sie Konto-ID und Lizenzschlüssel in die Konfigurationsdatei /etc/GeoIP.conf ein.
AccountID 123456
LicenseKey Ihr ausgestellter Schlüssel
EditionIDs GeoLite2-Country
# Speicherort ist der Standard der Distribution (Debian / Ubuntu: /var/lib/GeoIP, sonst meist /usr/share/GeoIP).
# Zum Ändern: DatabaseDirectory /var/lib/GeoIP
sudo geoipupdate -v
ls -l /var/lib/GeoIP/ # Erfolgreich, wenn GeoLite2-Country.mmdb vorhanden ist
Das Paket geoipupdate bringt in der Regel einen systemd-Timer oder einen Cron-Eintrag für regelmäßige Läufe mit (Prüfung mit systemctl list-timers | grep geoip). Falls nicht, richten Sie einen Cron-Job etwa einmal pro Woche ein.
Schritt 3: Das GeoIP2-Modul in Nginx installieren
Debian / Ubuntu (Nginx aus apt)
sudo apt install libnginx-mod-http-geoip2
ls /etc/nginx/modules-enabled/ # 50-mod-http-geoip2.conf wird angelegt
nginx -t
Nginx aus den nginx.org-Paketen oder selbst gebaut
Installieren Sie libmaxminddb und bauen Sie das dynamische Modul aus dem Quellcode in derselben Version wie Ihr laufender Nginx.
sudo apt install libmaxminddb-dev # RHEL-Familie: libmaxminddb-devel
cd /usr/local/src
git clone https://github.com/leev/ngx_http_geoip2_module
curl -LO https://nginx.org/download/nginx-1.26.3.tar.gz # Version an nginx -v anpassen
tar xzf nginx-1.26.3.tar.gz && cd nginx-1.26.3
./configure --with-compat --add-dynamic-module=../ngx_http_geoip2_module
make modules
sudo cp objs/ngx_http_geoip2_module.so /etc/nginx/modules/
Laden Sie das Modul am Anfang der nginx.conf (bei Paketversionen geschieht das automatisch).
load_module modules/ngx_http_geoip2_module.so;
Schritt 4: Ländercode als Variable ablegen und über Erlauben oder Sperren entscheiden
Schreiben Sie dies in den http-Block. Der geoip2-Block legt den Ländercode in einer Variablen ab, und die map setzt erlaubte Länder auf 1 und alle anderen auf 0.
http {
geoip2 /var/lib/GeoIP/GeoLite2-Country.mmdb {
auto_reload 60m;
$geoip2_country_code country iso_code;
}
# Länder, die den Admin-Bereich nutzen dürfen (2-stelliger Code nach ISO 3166-1)
map $geoip2_country_code $admin_allowed {
default 0;
JP 1;
"" 1; # Nicht ermittelbar (z. B. private IPs) wird erlaubt. Zum Sperren 0 setzen
}
}
auto_reload legt das Intervall fest, in dem die von geoipupdate ersetzte Datenbank ohne Neustart neu eingelesen wird.
Schritt 5: Nur Login und Admin-Bereich von WordPress beschränken
Dieses Beispiel lässt die öffentlichen Seiten unbeschränkt und filtert nur wp-login.php und /wp-admin/ nach Land. Schreiben Sie es in den server-Block.
server {
# ... bestehende Konfiguration ...
location = /wp-login.php {
if ($admin_allowed = 0) { return 403; }
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location ^~ /wp-admin/ {
if ($admin_allowed = 0) { return 403; }
# Wenn ein externes Plugin admin-ajax.php nutzt, in einer eigenen location erlauben
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
}
Die Kombination aus if und return ist eine Form, die Nginx sicher verarbeitet. /wp-admin/admin-ajax.php wird mitunter von Funktionen öffentlicher Seiten (Formulare, Endlos-Scrollen usw.) ohne Login aufgerufen. Entscheiden Sie deshalb je nach Funktionsumfang Ihrer Website, ob Sie es von der Beschränkung ausnehmen.
Übernehmen und prüfen:
sudo nginx -t && sudo systemctl reload nginx
# Aus Ihrem eigenen Land: 200 oder 302 wird zurückgegeben
curl -sI https://example.com/wp-login.php | head -1
# Zuordnung prüfen (Beispiel: Ländercode ins Log schreiben)
# log_format geo '$remote_addr $geoip2_country_code "$request" $status';
Um zu testen, wie die Seite aus dem Ausland aussieht, rufen Sie wp-login.php über ein VPN mit Standort im Ausland oder einen Monitoring-Dienst im Ausland auf und prüfen, dass 403 zurückkommt.
Wenn ein CDN (z. B. Cloudflare) davorsteht
Hinter einem CDN ist $remote_addr die IP des CDN, sodass alle Besucher dem Land des CDN zugeordnet werden. Stellen Sie zuerst mit ngx_http_realip_module die echte IP des Besuchers wieder her (realip-Modul).
# Beispiel Cloudflare. Die IP-Liste regelmäßig anhand der offiziellen Cloudflare-IP-Ranges aktualisieren
set_real_ip_from 173.245.48.0/20;
# ... alle Cloudflare-Bereiche auflisten ...
real_ip_header CF-Connecting-IP;
geoip2 verwendet standardmäßig $remote_addr, die Zuordnung erfolgt also anhand der echten IP, nachdem realip sie ersetzt hat. Cloudflare selbst bietet ebenfalls eine länderbasierte Zugriffskontrolle (benutzerdefinierte WAF-Regeln). Wenn Sie Cloudflare nutzen, ist die Beschränkung dort einfacher einzurichten als in Nginx. Siehe auch Cloudflare für WordPress einrichten.
Grenzen der Länderbeschränkung
- Die GeoIP-Zuordnung ist eine Schätzung auf Grundlage der Registrierungsdaten von IP-Adressen und lässt sich mit VPN, Proxys und Relays über Cloud-Server im Ausland umgehen.
- In Mobilfunknetzen oder Firmennetzen kann ein anderes Land als der tatsächliche Standort ermittelt werden. Auch kann es passieren, dass Administratoren auf Auslandsreisen ausgesperrt werden.
- Setzen Sie die Länderbeschränkung daher nur als unterstützende Maßnahme gegen Brute-Force-Login-Versuche ein, zusammen mit Zwei-Faktor-Authentifizierung, Begrenzung der Login-Versuche und dem Schutz von wp-admin per Basic-Authentifizierung.
Häufig gestellte Fragen
Was ist der Unterschied zwischen dem geoip- und dem geoip2-Modul von Nginx?
Das alte geoip-Modul liest Daten im Format GeoIP Legacy (.dat), das MaxMind nicht mehr verteilt. Das geoip2-Modul (ngx_http_geoip2_module) liest das aktuelle Format .mmdb und kann die kostenlosen GeoLite2-Daten nutzen. Neue Konfigurationen sollten geoip2 verwenden.
Ist GeoLite2 kostenlos? Muss ich mich registrieren?
Es ist kostenlos, aber ein MaxMind-Konto und ein Lizenzschlüssel sind erforderlich. Download und regelmäßige Aktualisierung übernimmt geoipupdate. Die alte Methode, direkt ohne Schlüssel herunterzuladen, funktioniert nicht mehr.
Verhindert eine Länderbeschränkung unberechtigte Logins in WordPress?
Sie verringert Brute-Force-Versuche, lässt sich aber mit VPN oder Relays über Server im Ausland umgehen, sodass man nicht von echtem Schutz sprechen kann. Kombinieren Sie sie mit Begrenzung der Login-Versuche, Zwei-Faktor-Authentifizierung, Basic-Authentifizierung und Ähnlichem.
Hinter Cloudflare haben alle Besucher dasselbe Land
Das liegt daran, dass hinter einem CDN die Quelle der Verbindung die IP des CDN ist. Stellen Sie mit set_real_ip_from und real_ip_header CF-Connecting-IP die echte IP wieder her, bevor Sie prüfen. Alternativ können Sie nach Ländern auch mit der Cloudflare-WAF beschränken.
Kann ich mit GeoLite2-City bis auf Städte beschränken?
Städte- und Regionscodes lassen sich ebenfalls in Variablen ablegen, aber die Genauigkeit auf Stadtebene ist geringer als auf Länderebene, und Fehlzuordnungen sperren leicht legitime Nutzer aus. Für die Zugriffskontrolle bleiben Sie besser auf Länderebene.
Fazit
- Die Länderbeschränkung in Nginx erfolgt heute mit GeoIP2 (ngx_http_geoip2_module + GeoLite2
.mmdb), die Daten aktualisieren Sie mitgeoipupdate. - Mit
geoip2legen Sie den Ländercode in einer Variablen ab, mitmapentscheiden Sie über Erlauben oder Sperren, und in denlocation-Blöcken fürwp-login.phpund/wp-admin/liefern Siereturn 403aus. - Hinter einem CDN stellen Sie zuerst die echte IP wieder her. Die Länderbeschränkung dient nur als Ergänzung zu Zwei-Faktor-Authentifizierung und ähnlichen Maßnahmen.
Ähnliche Artikel
- So beschränken Sie den Zugriff auf die WordPress REST API
- Mit htpasswd ein Apache-Basic-Auth-Passwort erstellen | wp-admin schützen
- Cloudflare für WordPress einrichten: der komplette Leitfaden
Quellen: ngx_http_geoip2_module (GitHub), MaxMind GeoLite2 Free Geolocation Data, MaxMind – Updating Databases (geoipupdate), Nginx ngx_http_realip_module
Änderungsverlauf: 2026-11-09 vollständig überarbeitet (die Anleitung mit dem nicht mehr verteilten alten GeoLite wurde durch GeoIP2 und geoipupdate ersetzt, ein Beispiel für die Beschränkung des WordPress-Admin-Bereichs und Hinweise zu CDNs wurden ergänzt). Dieser Artikel wird von WordPress Hakase (Lightscend Inc.) betrieben.
Fragen zu WordPress? Der Betreiber dieser Seite sitzt in Japan und antwortet auf Japanisch. Kontakt (Japanisch)