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:

Weitere Posts