본문 바로가기

쓰레기장""

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

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


'쓰레기장""' 카테고리의 다른 글

여러 사이트들의 rss 주소  (1) 2015.07.15
쥬라기 월드  (0) 2015.06.21
인터스텔라가 최고라고?  (0) 2014.11.06
구글 좌표 변환  (0) 2014.09.22
가디언스 오브 갤럭시  (0) 2014.09.10