개요

  • VIOLENT PYTHON 서적의 내용을 참고해서 정리한 페이지이다.
  • 책의 내용이 오래되어서 현재 동작하지 않는 부분이 있기 때문에 해당 부분은 업데이트했다.
  • 파이썬으로 IP주소를 지구상의 물리적 위치로 표시하는 방법을 정리한다.

STEP 1. IP주소와 물리 주소 매핑 데이터 얻기

  • 먼저 IP주소와 물리 주소를 매핑한 데이터를 얻어야 한다.
  • 맥스 마인드(Max Mind)라는 회사에서 이 데이터를 제공하고 있다.
  • 무료버전과 상용 버전이 있고, 당연히 상용버전이 성능이 좋다. 하지만 무료도 쓸만하다.
  • 참고로 데이터에도 세 종류가 있다. GeoLite2 County, GeoLite2 City, GeoLite3 ASN이 그것이다. 차이점은 여기를 보면 알 수 있다.
  • 2023년 10월 19일 현재, 데이터는 https://www.maxmind.com/ 에 회원가입을 해야 얻을 수 있다.
  • mmdb형식의 City 데이터를 다운로드했다.
  • mmdb형식의 DB정보는 maxminddb라이브러리를 설치하면 값을 볼 수 있다.

STEP 2. PyGeoIP로 IP 주소를 물리적 위치로 표시하기

책에 쓰여있는 코드는 현재는 동작하지 않았기 떄문에(.dat형식의 DB를 얻을 수 없었기 때문에) 다음과 같이 개선하였다.

import os 
import maxminddb
import json 

geo_data_path = os.path.dirname(__file__) + "/GeoLite2-City.mmdb"
gi = maxminddb.open_database(geo_data_path)

def printRecord(tgt):
    rec = gi.get(tgt)
    # print(json.dumps(rec, indent=4)) # for test
    city = '?'
    region = '?'
    region_name = '?'
    if 'city' in rec:
        city = rec['city']['names']['en']
    if 'subdivisions' in rec:
        region = rec['subdivisions'][0]['iso_code']
        region_name = rec['subdivisions'][0]['names']['en']
    county = rec['country']['names']['en']
    long = rec['location']['longitude']
    lat = rec['location']['latitude']
    print(f"[*] Target: {tgt} Geo-located.")
    print(f"[+] {city}, {region} ({region_name}), {county}")
    print(f"[+] Latitude: {lat}, Longitude: {long}")

# tgt = '173.255.226.98'
tgt = '18.138.83.20'
printRecord(tgt)