백엔드 서버를 aws ec2에 운영중이었는데
nginx 로그에 무수히 많은 봇들의 악수와 php 취약점 공격 등 다양한 접속이 많았다.
내 프로젝트는 해외 IP로 접속을 할 이유가 없기에 해외 IP를 차단할 필요가 있었다.
참고 링크
Add the GeoIP2 module to NGINX.
Nginx GeoIP2를 이용하여 불량한 접속국가 막는 방법
나는 2
3
두가지를 해보고 정상 동작하는지 확인 후에
최신 IP로 갱신해주는 3
번을 적용하기로 했다.
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
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에러와 함께 요청을 거부했다.
GeoIP2가 제공해주는 csv파일을 dat으로 변환하여 사용하는 방법이다.
maxmind 회원가입 절차가 추가된다.
라이센스키 발급을 위해 maxmind에 회원가입한다.
가입시 입력한 메일로 메일이 하나오는데
using the follwing link:
뒤의 링크를 통해 비밀번호를 변경하고
아래의 Access hyour MaxMind account.
링크를 눌러 계정 인증을 완료한다.
내 계정 -> Manage License Keys
-> Generate new license key
를 클릭해 라이센스키를 발급받는다.
발급한 라이센스키는 재확인이 안되니 따로 메모한다.
이제 라이센스키를 가지고 CSV 방식의 데이터베이스 파일을 받아 dat으로 변환해야한다.
SCV 파일을 dat 파일로 변환하기위해 파이썬 패키지를 설치한다.
$ apt install python-pip
$ pip install pygeoip
$ pip install ipaddr
GeoLite의 데이터베이스를 dat으로 변환해주는 스크립트를 깃허브에서 클론한다.
$ git clone https://github.com/sherpya/geolite2legacy
발급한 라이센스키로 깃허브에서 클론한 폴더 경로에 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 데이터베이스 자동 업데이트를 위해
스크립트 작성 후 크론탭을 이용하여 스크립트를 자동 실행해주면 마무리가 된다.