쓰레기장""

nginx 에서 특정 국가를 차단하는 방법

No.190 2015. 6. 19. 14:37

XE로 프로젝트를 하나 끝내고 서버에서 돌리고 있는데 갑자기 서버가 멈췄습니다.


접속 기록을 보니 마더러시아에서 지속적으로 페이지 로딩을 하고 있었다. 그에 따라 쿼리를 날리다 보니 mysql 이 죽고, 같은 서버에 있던 php도 죽고, 마지막 nginx 도 죽는 사태가 지속되었다.


웹포트인 80포트를 죽인다음 기다린 결과 잠잠해졌지만 언제 또올지 모를 불곰국을 대비하여 nginx geo 셋팅을 해주었다. 


- 서버는  ubuntu 14.10 / nginx 1.8.0 에서 진행하였습니다. 






1. 먼저 서버의 nginx에서 http_geoip_module를 지원하는지 확인 하기 위해 nginx -V 를 입력.

  $ nginx -V



중간쯤 with-http_geoip_module 모듈을 지원한다고 나온다. (만일 나오지 않는다면 nginx의 하위버전을 사용중인것이다. 해당 모듈은 nginx 0.8.1 버전부터 지원한것으로 요즘 nginx는 1.8.0이다. 업데이트를 하시면됩니다.)



2. 필요한 프로그램을 설치 합니다. 

$ sudo apt-get install nginx-core sendmail-base sendmail-cf geoip-database libgeoip1



3. 나라별 IP가 담긴 파일을 다운로드 해줘야 합니다. ( ubuntu에 제공하는 파일이 있으나 최신 파일이 아니므로 다운받아 줍니다.)

$ mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat_bak

$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz

$ gunzip GeoIP.dat.gz


4. nginx 의 conf파일에 설정을 추가해줍니다.

$ sudo vi /etc/nginx/nginx.conf


geoip_country /usr/share/GeoIP/GeoIP.dat;

map $geoip_country_code $allow_visit {

   default yes;

   RU no;

   CN no;

}



nginx.conf 파일의 아무곳에나 넣어주셔도 됩니다.


위의 설정에서 보시면 RU와 CN을 no; 로 설정했는데 러시아와 중국의 접속일 경우 $allow_visit의 변수에 yes라는 값이 들어갑니다. (중국의 경우도 가끔씩 들어와서 함께 차단!)




5. 이제 해당 도메인이 셋팅되어 있는 /sites-enabled/***.conf 파일에 (혹은 설정파일이 nginx.conf에 있다면 해당하는 파일에 해주시면 됩니다.) 아래의 설정값을 추가해주면 해당 도메인일 때만 해당 국가에서 접속시 403 에러 페이지로 가게 됩니다. 

if ($allow_visit = no) {

    return 403;

}


6. 크롬이나 파이어폭스의 확장 프로그램 중 vpn프로그램(zanmate 혹은 dotvpn등등 )을 설치하여  해당 국가로 vpn을 설정한후 해당 사이트로 이동하면 403 페이지로 이동하는것을 확인할수 있습니다. 




- 역시 nginx는 정말 잘 만든거 같다. 필요한 요소는 정말 찾아보면 다 있는듯..


- KO로 막아봤으나 그냥 들어간다. 내부 아이피로 접속하게끔 해놔서 필터링이 안되는 경우가 있나 보다.