Geolokalizacja, czyli sprawdzamy skąd pochodzi dany IP

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.dat

Alternatywnym 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ć:

  • 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.