Geo::IP - IP-Adressen oder Hostnamen regional zuordnen
Veröffentlicht von Thomas Fahle am (Permalink)
Geo::IP von Boris Zentner ermöglicht die regionale Zuordnung von IP-Adressen oder Hostnamen.
Geo::IP bietet eine kleine, aber häufig ausreichende, Auswahl an Geoinformationen der Geolocation Datenbank vom MaxMind. Wer mehr möchte, muss auf die kommerzielle Version upgraden.
Nachfolgend ein Beispiel zur Ermittlung des Herkunftslandes und ein Beispiel zur Ermittlung detaillierter Ortsinformationen.
Beispiel Länderinfo (Herkunftsland)
Geo::IP liefert Länderinformationen gemäß ISO 3166 zurück. Für weitere Details verweise ich auf den Beitrag Locale::Country - ISO 3166 - Norm für Kodierung von geographischen Einheiten.
#!/usr/bin/perl use strict; use warnings; use Geo::IP; my $ip = '81.169.145.71'; my $host = 'perl-howto.de'; # Download: http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz # Nutzt GeoIP.dat in /usr/local/share/GeoIP/ my $gi = Geo::IP->new(GEOIP_STANDARD) or die $!; # Datenbankinfos ausgeben my $db_info = $gi->database_info() or die $!; print "Datenbankinfo: $db_info\n"; # Methoden bei bekannter IP my $country = $gi->country_code_by_addr( $ip ) or die $!; my $country3 = $gi->country_code3_by_addr( $ip ) or die $!; my $countryname = $gi->country_name_by_addr( $ip ) or die $!; print "\n"; print "Info fuer $ip\n"; print "Country: $country\n"; print "Country3: $country3\n"; print "Country Name: $countryname\n"; # Methoden bei bekanntem Host $country = $gi->country_code_by_name( $host ) or die $!; $country3 = $gi->country_code3_by_name( $host ) or die $!; $countryname = $gi->country_name_by_name( $host ) or die $!; print "\n"; print "Info fuer $host\n"; print "Country: $country\n"; print "Country3: $country3\n"; print "Country Name: $countryname\n";
Das Programm erzeugt folgende Ausgabe
Datenbankinfo: GEO-106FREE 20090201 Build 1 Copyright (c) 2007 MaxMind LLC All Rights Reserved Info fuer 81.169.145.71 Country: DE Country3: DEU Country Name: Germany Info fuer perl-howto.de Country: DE Country3: DEU Country Name: Germany
Beispiel Ortsinfo
Hierzu wird zusätzlich die Datenbank GeoLiteCity.dat benötigt (Download).
#!/usr/bin/perl use strict; use warnings; use Geo::IP; my $ip = '81.169.145.71'; # perl-howto.de my $host = 'google.de'; # Download --> http://geolite.maxmind.com/download/geoip/database/ my $gi = Geo::IP->open( "/usr/local/share/GeoIP/GeoLiteCity.dat", GEOIP_STANDARD ) or die $!; my $db_info = $gi->database_info(); print "Datenbankinfo: $db_info\n"; my $record = $gi->record_by_addr($ip) or die $!; display( $ip, $record ); $record = $gi->record_by_name($host) or die $!; display( $host, $record ); ########################################################### sub display { my $info = shift @_; my $record = shift @_; print "Info fuer $info\n"; print "Country Code: ", $record->country_code, "\n"; print "Country Code3: ", $record->country_code3, "\n"; print "Country Name: ", $record->country_name, "\n"; print "Region: ", $record->region, "\n"; print "Region (Name): ", $record->region_name, "\n"; print "City: ", $record->city, "\n"; print "PLZ: ", $record->postal_code, "\n"; print "Latitude: ", $record->latitude, "\n"; print "Longitude: ", $record->longitude, "\n"; print "TimeZone: ", $record->time_zone, "\n"; print "Area Code: ", $record->area_code, "\n"; print "Continent Code: ", $record->continent_code, "\n"; print "Continent Name: ", continentcode2continent( $record->continent_code ), "\n"; print "Metro Code: ", $record->metro_code, "\n"; print "\n"; } ########################################################### sub continentcode2continent { my $code = shift @_; #Possible continent codes are AF, AS, EU, NA, OC, SA #for Africa, Asia, Europe, North America, Oceania and South America. my %continent = ( 'AF' => 'Africa', 'AS' => 'Asia', 'EU' => 'Europe', 'NA' => 'North America', 'OC' => 'Oceania', 'SA' => 'South America', ); if ( exists $continent{$code} ) { return $continent{$code}; } else { warn "Unknown Continent for <$code>\n"; return; } } ###########################################################
Das Programm erzeugt folgende Ausgabe
Datenbankinfo: GEO-533LITE 20090201 Build 1 Copyright (c) 2007 MaxMind LLC All Rights Reserved Info fuer 81.169.145.71 Country Code: DE Country Code3: DEU Country Name: Germany Region: 16 Region (Name): Berlin City: Berlin PLZ: Latitude: 52.5167 Longitude: 13.4000 TimeZone: Europe/Berlin Area Code: 0 Continent Code: EU Continent Name: Europe Metro Code: 0 Info fuer google.de Country Code: US Country Code3: USA Country Name: United States Region: CA Region (Name): California City: Mountain View PLZ: 94043 Latitude: 37.4192 Longitude: -122.0574 TimeZone: America/Chicago Area Code: 650 Continent Code: NA Continent Name: North America Metro Code: 807
Hier lässt sich erkennen, das die Städte-Datenbank für Nordamerika besser gefüllt ist als für Europa.
Ubuntu Installationstipps
Zunächst sollten die Bibliotheken für Geo::IP installiert werden:
sudo apt-get install libgeoip1 libgeoip-dev
Die Datenbank GeoIP.dat befindet sich nun in /usr/share/GeoIP/.
Geo::IP erwartet die Datenbanken aber in /usr/local/share/GeoIP/.
Also installiere ich die Datenbank und die monatlich kostenlos zum Download zur Verfügung gestellten Updates nach /usr/local/share/GeoIP/, da Geo::IP die Datenbanken dort erwartet.
Siehe auch:
- Geo::IP
- Geo-IP-PurePerl
- IP::Country::MaxMind, eine Alternative
- MaxMind
- Free monthly updates to the database
- MaxMind GeoLite City
- MaxMind GeoLite Country
- Wikipedia: Geotargeting
- HowToForge: Exim4 und GeoIP
- Linux-Magazin: Spam kartieren - Perl-Skript zeichnet Spam-Karten nach Webserver-Logs
- Geo-Location Information
- Locale::Country - ISO 3166 - Norm für Kodierung von geographischen Einheiten