Geolokalizacja adresów IP – proste narzędzia skryptowe

Geolokalizacja adresów IP przydaje się w codziennej działalności osób odpowiedzialnych za bezpieczeństwo sieciowe, członków grup reagowania na incydenty bezpieczeństwa oraz specjalistów od analizy materiałów dowodowych w sprawach związanych z oszustwami z wykorzystaniem narzędzi informatycznych.

GEO IPGeolokalizację adresów IP można oczywiście przeprowadzać odpytując on-line odpowiednie, dedykowane  serwisy internetowe, jednak własne narzędzia skryptowe maja nad nimi oczywistą przewagę polegająca na możliwości szybkiego sprawdzenia dużej liczby adresów i to nawet w warunkach braku dostępu do sieci.

Opracowałem w języku Python dwa skrypty do geolokalizacji adresów IP. Pierwszy z nich został wyposażony w graficzny interfejs użytkownika, powstały na bazie biblioteki Tkinter. Drugi skrypt przeznaczony jest do wywoływania z poziomu znakowej konsoli.

Oba skrypty wykorzystują moduł Pygeoip do obsługi zapytań do bazy GeoIP.dat. W tym celu, by narzędzia działały, należy pobrać z Internetu aktualną bazę GeoIP.dat, dostępną pod adresem: http://dev.maxmind.com/geoip/legacy/geolite/ i zapisać ją w katalogu bieżącym skryptu.

Oba skrypty zostały wyposażone w prostą walidację adresów IP, pozwalającą na identyfikowanie błędów formatu, błędów przekroczenia zakresu dopuszczalnych wartości oktetów czy też identyfikację adresów prywatnych (RFC1918).

Tak prezentuje się graficzny interfejs skryptu:

Geolokalizacja adresów IP

Tak wygląda wywołanie skryptu z linii poleceń:

$ skrypty>python ip_geo_cli.py -h
Usage:
        ██╗██████╗        █████╗ ██████╗ ██████╗ ██████╗
        ██║██╔══██╗      ██╔══██╗██╔══██╗██╔══██╗██╔══██╗
        ██║██████╔╝      ███████║██║  ██║██║  ██║██████╔╝
        ██║██╔═══╝       ██╔══██║██║  ██║██║  ██║██╔══██╗
        ██║██║           ██║  ██║██████╔╝██████╔╝██║  ██║
        ╚═╝╚═╝           ╚═╝  ╚═╝╚═════╝ ╚═════╝ ╚═╝  ╚═╝
        ----------------- GEOLOCATION -------------------

Options:
  -h, --help            show this help message and exit
  -i IP_ADDR, --ip=IP_ADDR
                        IP address to geolocate

$ \skrypty>python ip_geo_cli.py -i 200.1.1.0
Geolocation of 200.1.1.0 is Venezuela

Zachęcam do eksperymentów i dalszego rozwoju kodu. Można na przykład wzbogacić skrypty o:

  • możliwości bardziej szczegółowej lokalizacji (do poziomu miasta);
  • możliwości wsadowego przetwarzania dużych list adresów zapisanych w plikach.

Kod źródłowy narzędzia w wersji z graficznym interfejsem użytkownika znajduje się tu:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
import tkMessageBox
from ttk import *
from pygeoip import *
from ScrolledText import *

def ip_validate(ipaddress):
    octets = []
    octets = ipaddress.split('.')
    status = True
    for item in octets:
        if (int(item) < 0 or int(item) > 255):
            tkMessageBox.showinfo("Problem", "This is not a proper IP address")
            status = False
            break
    return status        
# end of ip_validate()

def get_location(ipaddr):
    country = ""
    if not ip_validate(ipaddr):
        return "ERROR"
    try:
        database = GeoIP('GeoIP.dat')
        country = database.country_name_by_addr(ipaddr)
        if country == "":
            tkMessageBox.showinfo("Problem", "Private address space or address not in database")
            country = '-' * 10
    except:
        tkMessageBox.showinfo("Problem", "Problem with opening the GeoIP.dat database")
    return country
# End of function get_location()

def location():
    global _loc, address
    _loc.set("\nGeolocation of %s is %s" % (address.get(), get_location(address.get())))
    output_text.insert(INSERT, _loc.get())
# end of location()

root = Tk()
root.title("*IP*ADDR*GEO* Janusz Nawrat (2015)")
root.resizable(0,0)

address = StringVar()
address.set(r"193.1.1.1")

_loc = StringVar()

main_frame = LabelFrame(root, text=" Check geolocation of IP address ")
main_frame.grid(row=0, column=0, columnspan=2, rowspan=2, padx=5, pady=3)

main_label = Label(main_frame, text="IP address:")
main_label.grid(column=0, row=0, sticky=E)
ip_entry = Entry(main_frame, textvariable=address, width=20)
ip_entry.grid(column=1, row=0, sticky=W, pady=5, padx=10)

output_text = ScrolledText(main_frame, width=45, height=15)
output_text.grid(column=0, row=2, columnspan=2, sticky=N+S+E+W)

check_bt = Button(root, text=" Check ", command=location)
exit_bt = Button(root, text="Exit", command='exit')

check_bt.grid(row=2, column=0, sticky=E+W, padx=5, pady=5)
exit_bt.grid(row=2, column=1, sticky=E+W, padx=5, pady=5)

root.mainloop()

Kod źródłowy programu w wersji CLI znajduje się tu:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from pygeoip import *
from optparse import OptionParser

def ip_validate(ipaddress):
    octets = []
    octets = ipaddress.split('.')
    status = True
    for item in octets:
        if (int(item)  255):
            print "This is not a proper IP address"
            status = False
            break
    return status        
# end of ip_validate()

def get_location(ipaddr):
    country = ""
    if not ip_validate(ipaddr):
        return "ERROR"
    try:
        database = GeoIP('GeoIP.dat')
        country = database.country_name_by_addr(ipaddr)
        if country == "":
            print "Private address space or address not in database"
            country = '-' * 10
    except:
        print "Problem with opening the GeoIP.dat database"
    return country
# end of function get_location()

def location(ip_addr):
    global geoloc
    geoloc = "Geolocation of %s is %s" % (ip_addr, get_location(ip_addr))
    print geoloc
# end of location()

if __name__ == "__main__":
    geoloc = ''
    usage = u"""
    ██╗██████╗      █████╗ ██████╗ ██████╗ ██████╗ 
    ██║██╔══██╗    ██╔══██╗██╔══██╗██╔══██╗██╔══██╗
    ██║██████╔╝    ███████║██║  ██║██║  ██║██████╔╝
    ██║██╔═══╝     ██╔══██║██║  ██║██║  ██║██╔══██╗
    ██║██║         ██║  ██║██████╔╝██████╔╝██║  ██║
    ╚═╝╚═╝         ╚═╝  ╚═╝╚═════╝ ╚═════╝ ╚═╝  ╚═╝
    ----------------- GEOLOCATION -------------------    
    """
    parser = OptionParser(usage=usage)
    
    parser.add_option('-i', '--ip', type='string',
                      help='IP address to geolocate',
                      dest='ip_addr', default="")
                    
    options, args = parser.parse_args()
    
    if options.ip_addr:
        ip_addr = options.ip_addr
        location(ip_addr)

Informacje Janusz Nawrat
Just ordinary man who likes thinking...

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

TOMASZ WEŁNA

artysta grafik | wykładowca

PRACOWNIA OKO

Szkoła Rysunku Malarstwa i Grafiki DR TOMASZA WEŁNY | KRAKÓW | Plac Matejki 10 | tel 691 81 75 74

Piękno neurobiologii

Blog Jerzego Vetulaniego

Teoria muzyki, zasady muzyki, podstawy muzyki

Teoria muzyki, zasady muzyki, podstawy muzyki - czyli to co każdy amator muzyki wiedzieć powinien :)

Personal Development & Inspirations

Przemyślenia i refleksje, którymi warto się podzielić (blog by Janusz Nawrat)

Business IT Cooperation Platform

Biznes i IT - dwa światy, które muszą współdziałać

%d bloggers like this: