Nginx GeoIP 해외 IP 차단하기

aryang·2022년 4월 21일
1

aws

목록 보기
1/1
post-thumbnail
post-custom-banner

1. 발단

백엔드 서버를 aws ec2에 운영중이었는데
nginx 로그에 무수히 많은 봇들의 악수와 php 취약점 공격 등 다양한 접속이 많았다.

내 프로젝트는 해외 IP로 접속을 할 이유가 없기에 해외 IP를 차단할 필요가 있었다.

2. Nginx에 GeoIP 적용하여 해외 IP 차단하기

2.1 GeoIP2 사용

참고 링크
Add the GeoIP2 module to NGINX.
Nginx GeoIP2를 이용하여 불량한 접속국가 막는 방법

  • maxmind 회원가입 절차 필요
  • 모듈 사용을 위한 nginx 컴파일 및 mmdb확장자 사용을 위한 세팅 필요

2.2 GeoIP 예전 데이터 사용

참고 링크
GeoIP Block NGINX Ubuntu 20.04

  • 과정이 가장 간단함
  • IP 수는 한정되어있어 IP 대역이 바뀌는데, 이 방법은 지역IP 업데이트를 해주지 않는 것이 단점임

2.3 GeoIP2 csv를 dat으로 변환하여 사용

참고 링크
maxmind geoip.dat 다운로드 및 자동 업데이트 방법 BY PG

  • 제공해주는 mmdb파일이 아닌 csv파일을 이용하여 dat으로 변환하여 사용하는 방식
  • maxmind 회원가입 절차 필요

🤔 그래서 나는

나는 2 3 두가지를 해보고 정상 동작하는지 확인 후에
최신 IP로 갱신해주는 3번을 적용하기로 했다.

3.1 간단 버전

GeoIP 예전 데이터 사용하는 방법이다.

준비물

Nginx GeoIP모듈과 IP주소와 국가를 매핑해주는 geoip-database를 설치한다.

$ sudo apt install libnginx-mod-http-geoip geoip-database

/usr/share 경로에 GeoIP폴더를 만들고 GeoIP DB를 다운로드 후 압축을 푼다.

$ sudo mkdir /usr/share/GeoIP
$ cd /usr/share/GeoIP
$ sudo wget sudo wget https://centminmod.com/centminmodparts/geoip-legacy/GeoIP.dat.gz
$ sudo gunzip GeoIP.dat.gz

Nginx 설정

GeoIP DB의 경로 설정 파일을 작성하여 저장한다.

$ sudo vim /etc/nginx/conf.d/geoip.conf
# GeoIP database 경로
geoip_country /usr/share/GeoIP/GeoIP.dat;

이제 nginx 설정 파일을 수정하여 GeoIP를 적용하면된다.

$ sudo vi /etc/nginx/nginx.conf

http {로 시작하는 블럭안에 다음 내용을 넣고 저장한다.
나는 한국 IP만 허용하기 위해서 다음처럼 작성했다.

map $geoip_country_code $allowed_country {
	default no;
	KR yes;
}

이제 $allowed_country 값이 no라면 차단을 해야한다.
/etc/nginx/sites-available/defalut 또는 자신이 설정한 nginx의 server 블럭안에 다음 내용을 추가한다.

$ sudo vi /etc/nginx/sites-available/default
    if ($allowed_country = no) {
        return 403;
    }


nginx 설정 파일이 문법 문제가 없는지 확인 후 설정을 리로드해준다.

$ sudo nginx -t
$ sudo service nginx reload

확인

ec2에서 express 서버를 켜고 크롬 vpn 확장프로그램을 사용하여 확인해봤다.
vpn을 끈 상태라면 게시글 요청이 정상적으로 되었지만 vpn을 키고 요청하자 403에러와 함께 요청을 거부했다.

3.2 업데이트 버전

GeoIP2가 제공해주는 csv파일을 dat으로 변환하여 사용하는 방법이다.
maxmind 회원가입 절차가 추가된다.

maxmind 회원가입

https://www.maxmind.com/en/geolite2/signup

라이센스키 발급을 위해 maxmind에 회원가입한다.

가입시 입력한 메일로 메일이 하나오는데
using the follwing link:뒤의 링크를 통해 비밀번호를 변경하고
아래의 Access hyour MaxMind account. 링크를 눌러 계정 인증을 완료한다.

라이센스키 받기


내 계정 -> Manage License Keys -> Generate new license key를 클릭해 라이센스키를 발급받는다.

발급한 라이센스키는 재확인이 안되니 따로 메모한다.
이제 라이센스키를 가지고 CSV 방식의 데이터베이스 파일을 받아 dat으로 변환해야한다.

EC2에서 준비물 설치하기

SCV 파일을 dat 파일로 변환하기위해 파이썬 패키지를 설치한다.

$ apt install python-pip 
$ pip install pygeoip
$ pip install ipaddr

GeoLite의 데이터베이스를 dat으로 변환해주는 스크립트를 깃허브에서 클론한다.

$ git clone https://github.com/sherpya/geolite2legacy

GeoIP SCV 파일 다운 후 DAT로 변환

발급한 라이센스키로 깃허브에서 클론한 폴더 경로에 SCV 파일을 다운받는다.

$ mkdir ./geolite2legacy/maxmind-geo
$ cd ./geolite2legacy/maxmind-geo

라이센스키를 본인의 라이센스키로 수정하여 입력한다.
-O 뒤에 옵션도 빠짐없이 입력해야 한다.

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

다음 명령어로 깃허브에서 받은 파이썬 스크립트를 실행해 dat파일로 변환해준다.

$ cd ../   # py 스크립트가 있는 폴더로 경로이동
$ ./geolite2legacy.py -i ./maxmind-geo/GeoLite2-Country-CSV.zip -f ./geoname2fips.csv -o ./maxmind-geo/GeoIP.dat

GeoIP.dat이 생긴걸 확인할 수 있다.
변환된 GeoIP.dat를 Nginx에 사용할 수 있게 옮겨준다.

mv /home/ubuntu/geolite2legacy/maxmind-geo/GeoIP.dat /etc/nginx

나는 기존에 간단 방식에서 GeoIP 경로를 다르게 해줬기 때문에 다음처럼 했다.

mv /home/ubuntu/geolite2legacy/maxmind-geo/GeoIP.dat /usr/share/GeoIP

확인

간단 방식에서 Nginx의 GeoIP.dat 경로와 설정 세팅을 해두었기에
Nginx 설정 리로드 후 바로 확인해보았다.

GeoIP 자동 업데이트해주기

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

마지막으로 GeoIP 데이터베이스 자동 업데이트를 위해
스크립트 작성 후 크론탭을 이용하여 스크립트를 자동 실행해주면 마무리가 된다.

post-custom-banner

0개의 댓글