Moduł Geo::IP2Location

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa

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:

Moduł wykorzystuję plikową bazę danych, w której zapisane są wszystkie powyższe informacje. Można ją pobrać ze strony firmy, która utworzyła ten moduł.

Instalacja

Zanim zaczniesz:

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

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.
Mój log
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ą:
Ostatnie 8 godzin
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):
Rozwiązanie
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

Kontakt i informacje o autorze opracowania

Autor: Tomasz Wojtowicz

Email: wojtowiczt@wp.pl

Numer GG: Słoneczko 3680301

Uniwersytet Gdański - Instytut Informatyki - Strona domowa - Perl - Wyklady
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.