개요
- 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)