Infra

Nginx 해외 IP 차단

GOMJ 2024. 1. 21. 21:16

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

 

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

 

우선 geoip는 csv인데 Nginx geoip 모듈에서 사용하려면 dat 파일로 변환하기 위한 작업이 필요하다.

cd /etc/nginx

mkdir geo

cd geo

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

cd geolite2legacy

 

위 커맨드를 따라하면 dat 파일 변환을 위한 변환기를 다운로드 할 수 있다.

 

해당 폴더에 이동하면 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/)"