Tworzysz serwis WWW i chciałbyś mieć możliwość sprawdzenia z jakiego kraju jest użytkownik, lub przykład bardziej dotyczący administratorów, chciałbyś sprawdzić z jakiego kraju są adresy IP pojawiające się w logach. Rozwiązaniem na to jest wykorzystanie geolokalizacji, czyli bazy danych która zawiera informację o puli IP oraz kraju z nią powiązaną. W Internecie znajdziesz kilka takich baz, my skupimy się na jednej która w wersji darmowej do wykorzystania w projektach (GPL/LGPL) daje nam dokładność rzędu 99.5%, jest to baza firmy MaxMind.
Kolejnym argumentem przemawiającym na korzyść tej bazy jest API, które jest dostępne na wiele platform:
- C
 - Perl
 - PHP
 - Apache (mod_geoip)
 - Java
 - Python
 - C#
 - Ruby
 - MS COM
 - VB.NET
 - Pascal
 - Javascript
 
Od czego zacząć? W zależności od języka w jakim będziemy chcieli obsługiwać bazę musimy pobrać konkretny zestaw bibliotek lub modułów dla API, w przykładzie wykorzystam bazę w skrypcie PHP.
Pobieramy bazę Geo:
$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
Jeśli będziemy chcieli odczytać również miasto to musimy pobrać dodatkową bazę GeoLiteCity:
$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
Musimy jeszcze wypakować bazy i przenieść do odpowiedniej lokalizacji:
$ gzip -d GeoIP.dat.gz
$ gzip -d GeoLiteCity.dat.gz
# mkdir /usr/share/GeoIP
# mv GeoIP.dat /usr/share/GeoIP/GeoIP.dat
# mv GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.datAlternatywnym sposobem jest instalacja bazy danych GeoIP z repozytorium:
# apt-get install geoip-database
Ale należy wtedy mieć na uwadze to, że taka baza nie musi być aktualna, MaxMind podaje, że aktualizuję bazę raz w miesiącu, więc pobranie jej bezpośrednio ze strony daje większą gwarancję, że baza będzie świeża.
W przypadku kiedy baza będzie pracowała pod obsługą PHP, musimy zainstalować moduł php5-geoip (Ubuntu 10.04):
# apt-get install php5-geoip
Istnieje co prawda, możliwość wykorzystania bazy bez instalowania modułu, jest rozszerzenie PEAR do tego, ale jest w fazie BETA i za bardzo chyba nikt nie chce go rozwijać, dla zainteresowanych link.
Posiadając moduł do PHP i bazę w odpowiedniej lokalizacji, możemy napisać skrypt który zamieni podany adres IP na kraj oraz miasto, ja użyję print_r dla pokazania jakie informacje możemy uzyskać:
| 
					 0 1 2 3 4 5 6 7  | 
						<?php   $ip = $argv[1];   print_r(geoip_country_name_by_name($ip));   echo "n";   print_r(geoip_record_by_name($ip)); ?>  | 
					
- geoip_country_name_by_name - wymaga bazy GeoIP.dat
 - geoip_record_by_name - wymaga dodatkowej bazy GeoCity.dat
 
$ php ip.php www.varlog.pl
Poland
Array
(
[continent_code] => EU
[country_code] => PL
[country_code3] => POL
[country_name] => Poland
[region] => 29
[city] => Myszków
[postal_code] =>
[latitude] => 50.583301544189
[longitude] => 19.35000038147
[dma_code] => 0
[area_code] => 0
)
Dokładny opis wszystkich pozostałych funkcji modułu geoip, można znaleźć w dokumentacji.
