Nginx geoip 적용하기

정명진·2024년 1월 14일
0

요즘 web server 세팅에 대해 공부중이다.

기존에는 spring boot에서 filter를 걸어 해외 ip 차단을 했었는데, geoip를 nginx에도 적용이 가능하다고 하다.

그래서 nginx에 geoip를 적용해 해외 ip 접속을 차단하는걸 적용해보자.

우선 geoip는 csv인데 dat 파일로 변환하기 위한 작업이 필요하다.

# module nginx
sudo apt install libnginx-mod-http-geoip geoip-database


cd /etc/nginx

mkdir geo

cd geo

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

cd geolite2legacy

해당 폴더에 이동하면 다음과 같은 파일이 있다.

geolite2legacy.py

우리는 이 파일을 통해 dat 파일로 변환이 가능하다.

이제 변환기 준비는 완료했으니 GeoLite의 Country, City 데이터베이스 파일이 필요하다. 해당 파일을 다운로드 하려면

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

해당 사이트에서 회원가입후 라이센스 키 발급이 필요하다.

라이센스 키를 발급받았다고 가정하고 Country, City 파일을 다운로드 받자.

wget "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City-CSV&license_key=${your_key}&suffix=zip" -O ./GeoLite2-City-CSV.zip

wget "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country-CSV&license_key=${your_key}&suffix=zip" -O ./GeoLite2-Country-CSV.zip

이제 변환기를 통해 dat 파일로 변환해주자.

python3 geolite2legacy.py -i ./GeoLite2-Country-CSV.zip -f geoname2fips.csv -o /etc/nginx/geo/GeoIP.dat

python3 geolite2legacy.py -i ./GeoLite2-City-CSV.zip -f geoname2fips.csv -o /etc/nginx/geo/GeoLiteCity.dat

이제 nginx 설정 파일에 dat 파일 경로를 설정해줘야 한다. 본인은 nginx 버전이 1.1.4 이기 때문에 nginx.conf에 설정을 진행하겠다.

cd /etc/nginx

vi nginx.conf

# http 바디에 다음을 추가해주자.

http{
	geoip_country /etc/nginx/geo/GeoIP.dat;
	geoip_city /etc/nginx/geo/GeoLiteCity.dat;

	map $geoip_country_code $country_access {
   		"KR" 0;
		default 1;

	}
}

그리고 설정에 문제가 없는지 테스트를 해주자

nginx -t

문제가 없으면 geo ip를 적용할 도메인에 설정을 해주면 된다.

cd /etc/nginx/sites-available

vi ${your_domain}

# server 부분에 다음을 추가해주자

if ($country_access = '1') {   
	return 403;
    }
    
# 문제 없는지 테스트후 nginx 새 설정 적용

nginx -t

nginx -s reload

즉 접속 ip가 한국이 아니면 403 Forbidden을 반환하겠다는 뜻이다.

그리고 나서 해외 ip test 사이트나 크롬 vpn을 적용해 테스트해보면 정상적으로 차단이 되는지 확인이 가능하다.

18.135.29.249 - - [14/Jan/2024:17:44:33 +0900] "GET /favicon.ico HTTP/1.1" 403 208 "${my_domain}" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/61.0.3163.100 Chrome/61.0.3163.100 Safari/537.36 PingdomPageSpeed/1.0 (pingbot/2.0; +http://www.pingdom.com/)"
profile
개발자로 입사했지만 정체성을 잃어가는중... 다시 준비 시작이다..

0개의 댓글