Apache 해외 IP 차단


Apache 해외 IP 차단
아파치 웹 서버에서 특정 국가만 접속을 허용하는 등 해외 접속 차단 하도록 설정 하는 방법, 반대로 특정 국가만 접속을 차단 하는 방법 알려드립니다. 아파치의 mod_maxminddb 모듈과 GeoIP 데이터 파일을 이용한 설정 예제를 설명드립니다.

Apache 해외 IP 차단

환경

이전 버전에서는 GeoIP 데이터베이스를 이용하여 해외 접속을 차단하기 위해서는 mod_geoip의 아파치 모듈을 사용하였습니다. 하지만 현재는 MaxMind DB 버전이 업그레이드 되었고 아파치 모듈이 mod_maxminddb 으로 변경되었습니다.

이 글에서 설명하는 방법을 적용하기 위해서는 아파치 2.2 이상과 libmaxminddb 라이브러리 등이 필요합니다. 그리고 직접 mod_maxminddb 아파치 모듈을 빌드 할 것이기에 관련 패키지가 필요합니다.

우분투 환경일 경우 아래의 명령어로 mod_maxminddb 모듈 컴파일에 필요한 패키지를 설치 할 수 있습니다.

$ sudo apt install apache2-dev libmaxminddb-dev

mod_maxminddb 설치

아래의 페이지에 방문한 다음 최신 버전의 mod_maxminddb 소스코드 파일을 받아 주시기 바랍니다.
파일명은 mod_maxminddb-*.tar.gz 와 같은 형태로 구성됩니다.

https://github.com/maxmind/mod_maxminddb/releases

다운 받은 소스코드를 압축해제하고 다음 명령어로 모듈을 컴파일 하고 설치합니다.

$ ./configure --with-apxs=/usr/bin/apxs
$ make
$ sudo make install

모듈이 설치된 후에는 다음 명령어를 사용하여, 모듈을 활성화 합니다.

$ sudo a2enmod maxminddb

GeoIP 데이터 다운로드

MaxMind의 국가 정보와 도시 정보가 있는 DB 파일을 다운로드 받습니다.
다운로드는 아래의 페이지에서 받으 실 수 있으며, MaxMind DB binary 파일로 받아 주셔야 합니다.

https://dev.maxmind.com/geoip/geoip2/geolite2/

GeoLite2-City.tar.gz 파일과 GeoLite2-Country.tar.gz 파일을 받고 압축을 해제합니다.

압축을 해제하면 mmdb 파일이 생성되는데 다음과 같은 위치에 저장된 것으로 가정하여 설정 방법을 설명드리도록 하겠습니다.

  • GeoLite2 City : /usr/local/share/GeoIP/GeoLite2-City.mmdb
  • GeoLite2 Country : /usr/local/share/GeoIP/GeoLite2-Country.mmdb

mod_maxminddb 설정

mod_maxminddb 모듈 설정은 Apache 서버의 설정파일에 적용 할 수 있을 뿐만 아니라, .htaccess 파일에도 적용이 가능합니다. 그리고 <Location>과 <Directory> 블럭에도 적용이 가능합니다.

설정과 관련한 주요 지시어는 아래와 같습니다.

  • MaxMindDBEnable : MaxMind DB 설정을 활성화 합니다.
  • MaxMindDBFile : MaxMind DB 파일의 위치를 설정합니다.
  • MaxMindDBEnv : DB 파일로 부터 조회된 결과를 변수에 저장합니다.

해외 접속 차단

해외 접속을 차단하도록 설정하는 것과 동일한 의미로 특정한 국가에서만 접속 될 수 있도록 설정해 보도록 하겠습니다.

  <Directory />
    AllowOverride All
    Options All -Indexes
    Require all granted

    MaxMindDBEnable On
 
    MaxMindDBFile COUNTRY_DB /usr/local/share/GeoIP/GeoLite2-Country.mmdb
    MaxMindDBFile CITY_DB    /usr/local/share/GeoIP/GeoLite2-City.mmdb
 
    MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code
    SetEnvIf MM_COUNTRY_CODE ^(KR) AllowCountry
 
    Deny from all
    Allow from env=AllowCountry
  </Directory>

위의 설정은 특정 국가인 한국(KR) 만 접속을 허용하고, 다른 나머지 국가는 모두 차단하도록 설정 하는 내용입니다. 만약 허용하고자 하는 국가가 여러개 일 경우에는 아래와 같이 조건을 추가 할 수도 있습니다.

SetEnvIf MM_COUNTRY_CODE ^(KR|US) AllowCountry

특정 국가 접속 차단

위의 설정과 반대로 특정 국가만 접속을 차단하기 위해서는 아래와 같이 설정 할 수 있습니다.

  <Directory />
    AllowOverride All
    Options All -Indexes
    Require all granted

    MaxMindDBEnable On

    MaxMindDBFile COUNTRY_DB /usr/local/share/GeoIP/GeoLite2-Country.mmdb
    MaxMindDBFile CITY_DB    /usr/local/share/GeoIP/GeoLite2-City.mmdb

    MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code
 
    SetEnvIf MM_COUNTRY_CODE ^(KR) BlockCountry
    Deny from env=BlockCountry
  </Directory>

위의 내용은 한국(KR) 국가만 접속을 차단 하는 예제입니다. 위의 설명드린 예제와 동일하게 여러개의 국가들을 차단 할 경우 다음과 같이 조건을 추가하여 차단할 수도 있습니다.

SetEnvIf MM_COUNTRY_CODE ^(KR|US) BlockCountry

앞서 설명드린 방법들을 사용하면 다양한 조건에서 접속 차단 설정을 할 수있습니다.

프록시 서버 설정에서도 접속 차단 설정을 할 수 있는데 프록시 서버 구축과 관련해서는 아래의 글을 참고해 주시기 바랍니다.

우분투 프록시 서버 구축

( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)