GeoIP-Datenbanken

GeoIP-Datenbanken ordnen IP-Adressen einer geografischen Lage und einer Netzverantwortung (Autonomous System) zu. Typische Einsatzzwecke sind Zugriffsbeschränkung nach Ländern in Firewall, Webserver und Fail2ban, Grobklassifizierung in Logs und Reports sowie Lokalisierung in Webanwendungen. Für jede produktive Anwendung sollte klar sein, dass die Angaben probabilistisch sind: seriöse Anbieter geben selbst für das reine Ländermapping Genauigkeiten von 99-99.8% an, bei Stadt-/Region-Angaben deutlich weniger.

Begriffe

ASN

Autonomous System Number. Eindeutige Nummer, die eine Gruppe von IP-Präfixen unter einheitlicher Routing-Verantwortung beschreibt (RFC 1930). GeoIP-ASN-Datenbanken liefern zu einer IP-Adresse die ASN und den Namen der verantwortlichen Organisation.

GeoIP2

Kommerzielle Produktlinie von MaxMind. Höhere Genauigkeit und zusätzliche Felder (z.B. ISP, Nutzertyp).

GeoLite2

Freie Produktlinie von MaxMind. Monatliche Updates, funktionaler Subset von GeoIP2, seit 2019-12 nur noch mit Account und Lizenzschlüssel beziehbar.

ISO 3166-1 alpha-2

Zweistellige Länder-Codes (z.B. CH, DE, US). Standard-Rückgabewert aller GeoIP-Datenbanken. Siehe https://en.wikipedia.org/wiki/ISO_3166-1.

MMDB

Binäres Datenbankformat von MaxMind (Suffix .mmdb). Spezifikation offen, Bibliothek libmaxminddb. Bevorzugtes Format für Laufzeit-Lookups in Webservern und Firewalls, weil die Datei direkt per mmap gelesen und keine Datenbank-Engine benötigt wird.

Datenquellen im Vergleich

MaxMind (GeoLite2 / GeoIP2)

https://www.maxmind.com/. De-facto-Standard. GeoLite2 ist kostenlos, aber ab 2019-12 nur nach Registrierung und mit Lizenzschlüssel beziehbar; GeoIP2 ist kommerziell und genauer. MaxMind liefert seit 2019 wegen US-Exportkontrollen keine Daten mehr in bestimmte sanktionierte Länder aus.

db-ip.com

https://db-ip.com/. Freie Variante ohne Account, monatlich aktualisiert, etwas ungenauer als MaxMind, aber praktisch für Stellen, an denen eine Registrierung stört. Unterstützt das MMDB-Format.

IP2Location LITE

https://lite.ip2location.com/. Ebenfalls frei, benötigt Registrierung. Bietet MMDB und CSV.

ipinfo.io

https://ipinfo.io/. Kommerziell mit Free-Tier, REST-API plus Database-Downloads.

Für einfache Länder-Sperren in Firewall oder Fail2ban genügen in der Regel db-ip oder GeoLite2-Country. Sobald ISP- oder Nutzertypen-Felder benötigt werden (z.B. Unterscheidung Hosting-Provider von Endkunden-Zugängen), führt kein Weg an den kommerziellen Produkten vorbei.

dbip

Die freie Variante wird monatlich aktualisiert, kommt ohne Account aus, ist aber etwas ungenauer als MaxMind.

timestamp=$(date "+%Y-%m")

# dbip Country Database in CSV format:
wget https://download.db-ip.com/free/dbip-country-lite-$timestamp.csv.gz --output-document - \
    | gzip --decompress --stdout > dbip-country-lite.csv

# dbip City Database in GeoIP2 binary format:
wget https://download.db-ip.com/free/dbip-city-lite-$timestamp.mmdb.gz

Maxmind

Um die „GeoLite2“-GeoIP-Datenbank von Maxmind zu nutzen, benötigt man bei ihnen einen Online-Account. Wie folgt vorgehen:

  • MaxMind-Account erstellen.

  • Nach der Account-Erstellung erhält man nach ein paar Stunden eine Bestätigungs-E-Mail mit den Anmeldedaten.

  • Anmelden > „My license key“ > „Generate a new license key“

  • Beschreibung des Lizenzschlüssels eingeben, z.B. „iptables“ oder „Matomo“, und „No“ bei „Will this key be used for GeoIP Update?“ wählen.

Edition-IDs:

  • GeoLite2-ASN

  • GeoLite2-ASN-CSV

  • GeoLite2-City

  • GeoLite2-City-CSV

  • GeoLite2-Country

  • GeoLite2-Country-CSV

Die Datenbanken sollten typischerweise 1x pro Woche aktualisiert werden.

Download per wget (empfohlen)

Das Einschliessen der Download-URL in Double-Quotes ist wegen & erforderlich. Das Skript ist auch gleichzeitig für Cron, Systemd-Timer etc. nutzbar:

update-maxmind.sh
#!/usr/bin/env bash

MM_LIC=mylic
MM_DB=GeoLite2-Country

cd /tmp
wget "https://download.maxmind.com/app/geoip_download?edition_id=$MM_DB&suffix=tar.gz&license_key=$MM_LIC" --output-document=$MM_DB.tar.gz
tar xzf $MM_DB.tar.gz
\cp GeoLite2-Country_*/GeoLite2-Country.mmdb /usr/share/GeoIP/
rm -rf /tmp/GeoLite2-Country*
Download per Maxmind-Tools

Wer die Datenbanken nur im GeoIP2-Binary-Format (.mmdb) benötigt, kann für die einfache Pflege die Maxmind-Tools herunterladen (das Tool zieht keine CSV-Dateien):

# https://github.com/maxmind/geoipupdate
VER=7.0.1
dnf --assumeyes install "https://github.com/maxmind/geoipupdate/releases/download/v${VER}/geoipupdate_${VER}_linux_amd64.rpm"
/etc/GeoIP.conf
AccountID 999999
LicenseKey mylic

# example editions:
EditionIDs GeoLite2-ASN GeoLite2-Country GeoLite2-City

Download der binären Datenbanken nach /usr/share/GeoIP/:

geoipupdate

Tipp

The MaxMind DB file's search tree is corrupt

Datenbank erneut ziehen. mod_maxminddb liest die mmdb-Dateien dynamisch ein, ein Restart des Apache ist also nicht nötig.

Maxmind Legacy

Die alten „legacy“ GeoLite-Datenbanken im binären GeoIP-Format (nicht MMDB) sind seit 2019-04-02 nicht mehr von MaxMind beziehbar. Wer noch solche Systeme pflegt, findet über Archivierungs-Spiegel mitunter ältere Stände, z.B.:

wget https://legacy-geoip-csv.ufficyo.com/Legacy-MaxMind-GeoIP-database.tar.gz

Da die Daten dort beliebig alt sind, wird der Umstieg auf GeoLite2 + MMDB dringend empfohlen.

Einsatz in Serverdiensten

Apache HTTP Server

Über das Modul mod_maxminddb (EPEL-Paket mod_maxminddb). Die MMDB wird einmal pro VirtualHost deklariert, Felder werden dann als Umgebungsvariablen gesetzt (z.B. MMDB_COUNTRY_CODE) und stehen Skripten und Mod-Rewrite zur Verfügung.

Nginx

Über das Drittmodul ngx_http_geoip2_module. Auf RHEL und Debian ist es nicht in den offiziellen Nginx-Paketen enthalten - entweder selbst bauen oder auf ein Distributions-Paket aus EPEL/Debian-Repos ausweichen.

iptables / nftables

Über xtables-addons (EPEL-Paket xtables-addons). Die Bibliothek nutzt eine eigene kompakte Datenbank unter /usr/share/xt_geoip/. Updates liefert das mitgelieferte Skript xt_geoip_dl gefolgt von xt_geoip_build. Eine Regel sieht dann beispielsweise so aus: iptables -A INPUT -m geoip ! --src-cc CH,DE,AT -j DROP.

Fail2ban

Kein direkter GeoIP-Support im Kern. Für Logging oder Reports lassen sich in eigenen Actions via mmdblookup bzw. geoiplookup Länder zu gebannten IPs ermitteln; für Länder-Blocks aus Fail2ban heraus werden die IPs typischerweise in ein ipset geschrieben, das selbst aus einer GeoIP-Datenbank gefüllt wurde.

Matomo

Setzt auf libmaxminddb (Matomo-Plugin „GeoIP2“) und benötigt eine GeoLite2-City-Datenbank.

Datenschutz

IP-Adressen gelten gemäss DSGVO und Schweizer DSG in Verbindung mit weiteren Identifikatoren als Personendaten. Für Logging und Reports bedeutet das: eine IP-zu-Geo-Zuordnung ersetzt nicht die Anonymisierung. Wer Besucher-Logs mit Geo-Informationen anreichern will, sollte entweder nur aggregiert auswerten, die IP nach dem Lookup kürzen (IPv4 /24, IPv6 /48) oder eine klare Aufbewahrungsfrist definieren. Die Linuxfabrik setzt in Matomo-Installationen standardmässig anonymize_ip_mask_length = 2 und speichert Logs zeitlich begrenzt.

Country Codes

Siehe https://en.wikipedia.org/wiki/ISO_3166-1 (Alpha-2 Code).