Locus Pokus

Anhand seiner IP-Adresse den Standort eines Nutzers festzustellen, ist durchaus kein Hexenwerk. Wem es dabei nicht auf hohe Genauigkeit ankommt, der findet alles Nötige kostenlos im Internet.

vorlesen Druckansicht 10 Kommentare lesen
Lesezeit: 4 Min.
Von
  • Michael Riepe

Wer in letzter Zeit Google besucht hat, dem ist vermutlich aufgefallen, dass die Suchmaschine nicht nur seinen Standort bestimmt, sondern ihn auch automatisch als Suchparameter verwendet. So liefert etwa die Suche nach indischen Restaurants vorwiegend solche aus der Umgebung, sofern man dem Suchbegriff nicht einen bestimmten Ort hinzufĂĽgt. Stehen keine anderen Informationen zur VerfĂĽgung, etwa ein im Browser gespeichertes Cookie, kann der Suchdienst den Standort aus der IP-Adresse ableiten. Dazu ist letztendlich nur eine Datenbankabfrage notwendig.

Sucht man nur Informationen zu einer bestimmten Adresse, bieten sich Webdienste wie das Geo IP Tool [a] oder der Geo IP Address Lookup/Locator [b] an. Letzterer lässt sich leicht mit wget abfragen: Das Kommando wget –O <datei> geoip.wtanaka.com/cc/<ip-adresse> schreibt das zugehörige zweistellige Länderkürzel in die angegebene Datei. Das Geo IP Tool liefert unter www.geoiptool.com/de/?IP=<ip-adresse> deutlich mehr Informationen, allerdings im HTML-Format. Leider versagen beide, wenn man eine IPv6-Adresse eingibt.

Für wiederholte Abfragen eignet sich MaxMinds GeoIP [c]. Kern der Software ist die Bibliothek libGeoIP, die unter Version 2.1 der LGPL steht und sich daher auch in kommerzieller Software einsetzen lässt. Sie ist in C geschrieben, es existieren jedoch APIs für eine Reihe anderer Sprachen, darunter C#, Java und Perl. Die beiliegenden Kommandozeilen-Tools geoiplookup für IPv4 und geoiplookup6 für IPv6 erlauben darüber hinaus Abfragen aus Skripts heraus.

Als Datenquelle dienen lokale Dateien, von denen MaxMind einige kostenlos zur Verfügung stellt. Zu Letzteren gehören Tabellen zum Übersetzen von IPv4- und IPv6-Adressen in Länder, Städte und AS-Nummern (Autonomous System), die sowohl im für libGeoIP geeigneten komprimierten Format als auch als CSV-Dateien zum Import in eine SQL-Datenbank erhältlich sind. Bei Bedarf lassen sich die Datenbankdateien durch die besser gepflegten und umfangreicheren kommerziellen Versionen austauschen. Hat man keine allzu hohen Ansprüche an die Genauigkeit, genügen die kostenlosen „Lite“-Varianten jedoch vollkommen.

Mehr Infos

Listing 1: Ländercode-Abfrage

#include <stdio.h>
#include <GeoIP.h>

int
main(int argc, char **argv) {
GeoIP *gi = GeoIP_new(GEOIP_STANDARD);
printf("Database version: %s\n",
GeoIP_database_info(gi));
for (int i = 1; i < argc; ++i) {
printf("Address: %s\n", argv[i]);
printf("Country: %s/%s/%s\n",
GeoIP_country_code_by_addr(gi, argv[i]),
GeoIP_country_code3_by_addr(gi, argv[i]),
GeoIP_country_name_by_addr(gi, argv[i]));
}
GeoIP_delete(gi);
exit(0);
}

Listing 1 illustriert die Verwendung der Bibliothek anhand eines einfachen C-Programms. GeoIP_new öffnet die Datenbank und gibt ein Handle für die folgenden Abfragen zurück; das Flag GEOIP_STANDARD wählt die Standard-Zugriffsmethode aus. Für jedes übergebene Argument gibt das Programm die zwei- und dreibuchstabigen Länderkürzel sowie den Namen des Landes aus. Verwendet man GeoIP_country_code_by_name statt GeoIP_country_code_by_addr, darf das Argument auch ein Domainname sein. GeoIP_country_name_by_ipnum nimmt die Adresse als 32-bittige Zahl im Host-Format entgegen; vom Betriebssystem gelieferte Adressen muss man daher zunächst mit ntohl konvertieren. Daten zu IPv6-Adressen lassen sich ebenfalls abfragen, allerdings muss man dazu etwas umständlich mit gi = GeoIP_open_type (GEOIP_COUNTRY_EDITION_V6, GEOIP_STANDARD) explizit die passende Datenbank öffnen und Funktionen wie GeoIP_country_code_by_name_v6 verwenden.

Mehr Infos

Listing 2: Nutzung der City-API

GeoIP *gi = GeoIP_open_type(GEOIP_CITY_EDITION_REV1,
GEOIP_STANDARD);
for (int i = 1; i < argc; ++i) {
GeoIPRecord *r = GeoIP_record_by_name(gi, argv[i]);
printf("Country: %s/%s/%s\n", r->country_code,
r->country_code3, r->country_name);
printf("City: %s (%.2fN %.2fE), %s\n", r->city,
r->latitude, r->longitude, r->postal_code);
}

Mit der „City-API“ lassen sich zusätzlich der Name und die Koordinaten der Stadt, die Region, der ZIP-Code und der Kontinent erfragen (siehe Listing 2). GeoIP_record_by_name liefert einen Zeiger auf einen Puffer zurück, den der Programmierer nach Gebrauch mit GeoIPRecord_delete wieder freizugeben hat. Allerdings sind nicht immer alle Felder mit Werten belegt. Wer Informationen zu IPv6-Adressen sucht, muss auch hier wieder auf Funktionen wie GeoIP_record_by_name_v6 zurückgreifen und mit GEOIP_CITY_EDITION_REV1_V6 die passende Datenbank öffnen. Die ist leider zurzeit noch rudimentär, doch mit zunehmender Verbreitung von IPv6 sollte sich das ändern.

Alle Links: www.ix.de/ix1203149 (mr)