Moduł Geo::IP2Location
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaSpis treści
Co to jest
Opisywany moduł służy szybkiemu odnalezieniu informacji o użytkowniku legitymującym się konkretnym numerem IP. Możemy dzięki niemu uzyskać takie dane jak:
- Kraj,
- Region,
- Miasto,
- Szerokość
- i długość geograficzną,
- Kod pocztowy,
- Strefę czasową,
- Nazwę dostawcy internetu (ISP),
- Nazwę domeny,
- Rodzaj połączenia z internetem.
Instalacja
Zanim zaczniesz:
- Pobierz bazę, która najbardziej odpowiada Twoim potrzebom (bezpłatnie jedynie wersje demo obejmująca adresy
do 99.255.255.255 włącznie, a więc nieco ponad 61% przestrzeni adresowej IPv4 (za rachunkami
4228250623 - 1641556125 = 2586694498, 2586694498/4228250623=0,61176470569871420793497273257541):
- DB1 IP-Kraj
- DB2 + ISP
- DB3 IP-Kraj-Region-Miasto
- DB4 + ISP
- DB5 IP-Kraj-Region-Miasto- -Współrzędne geograficzne
- DB6 + ISP
- DB7 IP-Kraj-Region-Miasto-ISP- -Domena
- DB8 + Współrzędne geograficzne
- DB9 IP-Kraj-Region-Miasto- -Współrzędne geograficzne-Kod pocztowy
- DB10 + ISP-Domena
- DB11 IP-Kraj-Region-Miasto- -Współrzędne geograficzne-Kod pocztowy-Strefa czasowa
- DB12 + ISP-Domena
- DB13 IP-Kraj-Region-Miasto- -Współrzędne geograficzne-Strefa czasowa-Szybkość łącza
- DB14 Zawiera wszystko co zostało wymienione powyżej (na potrzeby tego dokumentu pobrałem właśnie ją)
- Rozpakuj pobrane archiwum (Uwaga! DB14 będzie potrzebowała ok. 140 MB wolnego miejsca na dysku)
Instalacja Geo::IP2Location z CPAN
>perl -MCPAN "install Geo::IP2Location"; po powyższym (a może to trochę potrwać) wykonujemy w celu sprawdzenia poprawności instalacji: >perl -e "use Geo::IP2Location"; jeśli w tym miejscu nie pojawiły się żadne ostrzeżenia to możemy mieć nadzieję, że instalacja przebiegła pomyślnie. Jednakże jak to w życiu bywa... Okazuje się, że obecnie udostępniane bazy są kompatybilne wyłącznie z wersją 2.10 modułu (na CPAN jest 2.00) zatem konieczne okazuje się pobranie go ze strony projektu IP2Location pod adresem. Następnie przechodzimy w archiwum do ścieżki "\lib\Geo" i zastępujemy obecnym tam "IP2Location.pm" plik o takiej samej nazwie, w miejscu gdzie zainstalował się on z CPAN. Teraz dysponujemy już w pełni skonfigurowanym środowiskiem pracy.
Instalacja Geo::IP2Location ze źródeł
Jeśli instalacja ma się odbywać pod systemem UNIX'owym to najwygodniej jest pobrać archiwum ze źródłami (link był już powyżej) i wykonać po jego rozpakowaniu, będąc w miejscu gdzie go rozpakowaliśmy, ciąg instrukcji: perl Makefile.PL make make test make install W wypadku systemów z rodziny Windows, możemy użyć narzędzia nmake, które pobierzemy np. z tej lokalizacji. Gdybyśmy byli jednak posiadaczami strawberry-perl (jak np. ja) to skazani jesteśmy na rozwiązanie CPAN + podmiana pliku jak zostało to opisane w ostatnim paragrafie. (Jeśli jednak potrafisz na takiej konfiguracji zainstalować moduł w tradycyjny sposób, a więc ze źródeł proszę o kontakt)
Metody
- Metody klasy:
- open(nazwapliku) Tworzy nowy obiekt Geo::IP2Location z bazy znajdującej się w pliku o nazwie "nazwapliku".
- Metody instancji:
- get_database_version() Zwraca wersję bazy danych, której używamy.
- get_module_version() Zwraca numer wersji modułu, która jest używana.
- get_country_short(adres_ip) Zwraca kod kraju (krótka nazwa jak na tablicach rejestracyjnych), z którego pochodzi użytkownik z danym adresem IP (w formacie ISO 3166-1-alpha-2).
- get_country_long(adres_ip) Zwraca nazwę kraju.
- get_region(adres_ip) Zwraca nazwę regionu.
- get_city(adres_ip) Zwraca nazwę miasta.
- get_latitude(adres_ip) Zwraca szerokość geograficzną miasta.
- get_longitude(adres_ip) Zwraca długość geograficzną.
- get_isp(adres_ip) Zwraca nazwę dostawcy internetu użytkownika (ISP).
- get_zipcode(adres_ip) Zwraca kod pocztowy.
- get_timezone(adres_ip) Zwraca strefę czasową.
- get_netspeed(adres_ip) Zwraca typ połączenia użytkownika (DIAL, DSL lub COMP).
- get_domain(adres_ip) Zwraca adres domenowy. (Naturalnie wszędzie zwracane są zmienne skalarne - liczby i napisy)
- get_all(adres_ip) Zwraca tablicę zawerającą w kolejnośći, kod kraju, nazwę kraju, regionu, miasta, współrzędne geograficzne i adres domeny.
- Dwa sposoby adresowania
Każdą z metod, której argumentem jest adres IP możemy "zasilać" adresami IPv4 lub IPv6 jak w poniższym
przykładzie:
$obj->get_all("20.11.187.239"); $obj->get_all("2001:1000:0000:0000:0000:0000:0000:0000");
Dlaczego wybrałem ten moduł
Poniższa sekcja będzie poświęcona przykładowemu użyciu modułu. Pokażę pojedynczą sesję z Geo::IP2Location, która mam nadzieję wyjaśni również szczegółowo dlaczego sięgnąłem właśnie po niego.
Problem:
Tak wygląda przykładowy wydruk System Log'a, na moim routerze ADSL, który pozwala naszej rodzinie na korzystanie z
internetu na więcej niż jednym komputerze.
Ostatnio pojawia się coraz to więcej prób włamań blokowanych przez wbudowany weń firewall.
Tak np. wygląda on dla ostatnich 8 godzin połączenia z siecią:
Postaram się w końcu dowiedzieć skąd pochodzą.
Przygotowanie danych
Zaznaczyłem i zapisałem w pliku tekstowym - n.txt tabelki, które zwraca mój router (niestety
tabelki są wewnątrz ramek, do których w inny sposób nie jestem się w stanie dostać).
Pojedyncze wiersze są tam postaci:
9th day 00:10:44 user alert klogd: Intrusion -> IN=ppp41 OUT= MAC= SRC=87.205.170.68 DST=87.205.51.247 LEN=64
TOS=0x00 PREC=0x00 TTL=44 ID=27534 DF PROTO=TCP SPT=55698 DPT=445 WINDOW=2304 RES=0x00 SYN URGP=0
9th day 00:00:51 user alert klogd: Intrusion -> IN=ppp41 OUT= MAC= SRC=83.23.9.140 DST=87.205.51.247 LEN=48
TOS=0x00 PREC=0x00 TTL=120 ID=16911 DF PROTO=TCP SPT=2806 DPT=25104 WINDOW=65535 RES=0x00 SYN URGP=0
Jak widać potrzebne mi będą tylko adresy zapisane po słowie kluczowym "SRC=".
W tym celu napisałem prosty "jednolinijkowiec" (tutaj dla czytelności go "złamię"), który zwróci mi właśnie te adresy:
perl -e "open F, '<n.txt'; @text=<F>; foreach (@text) {
if( ~m/SRC=(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})/ { print $1.\"\n\"; }}
Wynik jego działania zapisałem tutaj.
Rozwiązanie
Mając do dyspozycji plik z wierszami (poprzedni punkt), w których znajduje się pojedynczy adres IP niemal natychmiast
napisałem program wykorzystujący bazy IP2Location:
use strict;
use Geo::IP2Location;
open F, '<adresy.txt';
my @text=<F>;
my $obj = Geo::IP2Location->open(
"IP-COUNTRY-REGION-CITY-LATITUDE-LONGITUDE-ZIPCODE-TIMEZONE-ISP-DOMAIN-NETSPEED-SAMPLE.BIN");
foreach (@text) {
print $obj->get_country_long($_).", ";
print $obj->get_city($_).", ";
print $obj->get_region($_).", ";
print $obj->get_isp($_).", ";
print $obj->get_domain($_).", ";
print $obj->get_zipcode($_)."\n";
}
Rozwiązanie, które ukazało się moim oczom (dostępne również w txt):
Wcale mnie nie zaskoczyło gdyż wg mojego stanu wiedzy na dzisiaj spodziewałem się dokładnie takowego.
Epilog
Świetnym pomysłem było by przedstawienie powyższych wyników w trybie graficznym, bo nie oszukujmy się konsola może nie być przyjazna dla innych członków rodziny, którzy chcieliby na bieżąco monitorować to wszelkie "zło". IP2Location udostępnia na swojej stronie kolekcję gifów z flagami państw ( do pobrania), które idealnie nadają się do zintegrowania z wynikami działania ich modułu. Nazwy GIFów są kodami kraju, które zwraca jedna z opisanych tu funkcji.
Dodatkowe informacje
- Dokumentacja w CPAN (2.00)
- Strona modułu na IP2Location
- Inny program testujący poprawność naszej instalacji
Kontakt i informacje o autorze opracowania
Autor: Tomasz Wojtowicz
Email: wojtowiczt@wp.pl
Numer GG: 3680301