geoip.dat 파일은 국가별로 사용하는 IP 주소를 모아놓은 데이터로 웹서버를 운영할때 특정 국가의 접근을 막거나 허용하는등 국가단위 IP 필터링을 할때 주로 사용하는데요.

GeoIP는 maxmind.com에서 배포하며 리눅스에서는 패키지로 설치해 업데이트를 할 수 있었지만 작년부터 GeoIP2로 이름을 변경하면서 유료 패키지로 전환되고 무료 버전인 GeoLite2는 데이터베이스 형식의 mmdb(MaxMind DB)와 CSV 확장자로 배포하고 있습니다.

아파치와 NGINX의 GeoIP 모듈은 dat 파일만 지원하기 때문에 웹서버에서 사용하려면 dat 파일로 변환을 해야 하는데, 능력있는 해외 개발자들이 만들어 놓은 변환 프로그램이 있기 때문에 이를 활용해 변환하고 자동으로 업데이트 하는 간단한 스크립트를 적용해 자동화 할 수 있습니다.

튜토리얼 환경 : 우분투, nginx

필자는 /root 디렉토리를 기준으로 설정했지만 편의에 따라 디렉토리 위치를 바꾸면 되겠습니다.


내용 보충

maxmind에서 공개적으로 DB 파일을 제공하는 대신 라이센스 키를 이용하는 방식으로 변경되었습니다.

또한 자동화를 위해 maxmind에서 레포지토리와 툴, nginx의 geoip2 모듈을 제공하고 있는데, NGINX를 컴파일해야 하고 mmdb 확장자를 사용하게 됩니다.

하지만 필자와 같이 방식을 바꾸지 않고 dat 파일을 필요로 하는 시스템도 있기 때문에 글의 주제와 일관되게 라이센스 키를 이용해 CSV 방식의 데이터베이스 파일을 받은 다음 dat 파일로 변환하는 방법에 대한 내용을 업데이트합니다.

준비물

apt install python-pip
apt install git
pip install pygeoip
pip install ipaddr

maxmind에서 배포하는 geoip SCV 파일을 dat 파일로 변환하기 위해서 깃허브에서 파이썬 기반의 프로그램을 다운로드 받고 사용하기 위해 위 패키지가 필요합니다.

cd /root
git clone https://github.com/sherpya/geolite2legacy

root 디렉토리로 이동한 다음 CSV 형식의 GeoIP 파일을 변환하기 위해 geolite2legacy를 깃허브에서 다운로드 받습니다.

Maxmind 라이센스 키 발급받기

How To Download And Auto Update Maxmind Geoip.dat 1

maxmind에 로그인한 다음 Account > Manage License Keys 메뉴로 이동 후 Generate new license key 버튼을 클릭합니다.

How To Download And Auto Update Maxmind Geoip.dat 2

라이센스 키 생성 페이지에서 키 설명을 적당히 입력한 다음 첫번째 geoipupdate version 3.1.1 or newer 옵션을 체크 후 Confirm 버튼을 클릭합니다.

라이센스 키가 생성되며 GeoIP.conf 파일이 다운로드 되는데, 웹 페이지에도 나타나지만 파일을 열어보면 AccountID, LicenseKey 를 확인할 수 있으며 이 중에서 우리는 LicenseKey를 필요로 합니다.

GeoIP CSV 파일 다운로드 후 DAT 파일로 변환

mkdir /root/geolite2legacy/maxmind-geo
wget "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country-CSV&license_key=라이센스키&suffix=zip" -O /root/geolite2legacy/maxmind-geo/GeoLite2-Country-CSV.zip

깃허브에서 다운로드 받은 스크립트 경로에 위 명령어로 maxmind에서 GeoLite2 CSV 파일을 다운로드 받습니다.

wget 경로 중간의 라이센스키 부분에 GeoIP.dat 에서 확인한 키를 넣어 명령어를 입력하면 되며 -O 옵션 뒤에 붙는 경로를 원하는 경로로 수정하면 되겠습니다.

/root/geolite2legacy/geolite2legacy.py -i /root/geolite2legacy/maxmind-geo/GeoLite2-Country-CSV.zip -f /root/geolite2legacy/geoname2fips.csv -o /root/geolite2legacy/maxmind-geo/GeoIP.dat

위 명령어를 실행해 깃허브에서 받은 파이썬 스크립트를 이용해 csv 파일을 dat 파일로 변환합니다.

mv /root/geolite2legacy/maxmind-geo/GeoIP.dat /etc/nginx

생성한 dat 파일을 아파치나 NGINX에서 사용할 수 있게 이동하면 끝.

GeoIP 자동 업데이트 및 변환 설정

IP는 유한한 자원이기 때문에 국가에서 사용하는 IP 대역이 유기적으로 변경될 수도 있습니다.

이로 인해 GeoIP 또한 주기적으로 업데이트 해야 하는데, 위 과정을 스크립트로 만들어 크론탭에 등록해 두면 서버가 주기적으로 자동 업데이트를 진행합니다.

#!/bin/bash

wget "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country-CSV&license_key=라이센스키&suffix=zip" -O /root/geolite2legacy/maxmind-geo/GeoLite2-Country-CSV.zip

/root/geolite2legacy/geolite2legacy.py -i /root/geolite2legacy/maxmind-geo/GeoLite2-Country-CSV.zip -f /root/geolite2legacy/geoname2fips.csv -o /root/geolite2legacy/maxmind-geo/GeoIP.dat

sleep 30s

mv /root/geolite2legacy/maxmind-geo/GeoIP.dat /etc/nginx

sleep 10s

service nginx reload

위 과정을 자동화로 하기 위해 쉘 스크립트로 저장합니다. 중간의 sleep은 파일이 변환되는 시간이 있기 때문에 잠시 스크립트를 멈추기 위함입니다.

아파치 관리자는 마지막 명령어를 service apache2 restart로 변경하면 되겠습니다.

5 7 * * 0 /root/batch/geoip_automatic_updates.sh 

스크립트를 주기적으로 실행하기 위해 crontab -e로 크론탭 편집기를 실행한 다음 만들어둔 스크립트를 등록하면 매주 일요일 7시 5분에 스크립트가 실행됩니다.

Write A Comment