Nginx GeoIP2를 이용하여 불량한 접속국가 막는 방법

0 Shares
0
0
0

Nginx에서 국가별 IP를 식별하여, 원하지 않는 국가에서의 접속을 차단할수 있습니다.
물론 우회접속을 하면 어쩔수 없지만, 로그에 국가코드를 남긴다던지, 도시정보를 얻는다던지, 웹으로의 불량접속국을 어느정도 걸러냄으로서 조금 원할한 사이트관리가 되지 않을까 싶습니다.

기존에 MaxMind에서 제공했던 GeoIP.dat는 19년도를 기준으로 더 이상 지원하지 않으니, maxmind에서 새로 계정을 생성하던, 기존의 계정으로 라이센스키를 받고, nginx에서 새로운 모듈을 컴파일하여 사용해야 합니다.

설치준비

컴파일을 위해 먼저 아래 라이브러리를 설치합니다.
[설치환경 : Ubuntu 18.04, Nginx 1.16.1] ,
2020년12월 Ubuntu 20.04 & nginx 1.18.0 작동확인

apt-get install build-essential 
apt-get install libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev

MaxMind 저장소 추가 및 설치

add-apt-repository ppa:maxmind/ppa
apt update
apt install geoipupdate libmaxminddb0 libmaxminddb-dev mmdb-bin

MaxMind 가입후 계정ID / 라이센스키 삽입

라이센스는 안내에 나와있는거처럼 25개까지 라이센스 생성이 가능하고, 한번 생성한 키는 다시 열람이 안되니 생성후 GeoIP.conf 파일을 저장해놓아야 합니다. 파일 내용은 아래와 같습니다. (/etc/GeoIP.conf)

# GeoIP.conf file for `geoipupdate` program, for versions >= 3.1.1.
# Used to update GeoIP databases from https://www.maxmind.com.
# For more information about this config file, visit the docs at
# https://dev.maxmind.com/geoip/geoipupdate/.

# `AccountID` is from your MaxMind account.
AccountID yourID

# `LicenseKey` is from your MaxMind account
LicenseKey YourLicensekey

# `EditionIDs` is from your MaxMind account.
EditionIDs GeoLite2-ASN GeoLite2-City GeoLite2-Country

GeoIP2를 최신 데이터로 업데이트 합니다.

geoipupdate

크론탭에 GeoIP2 데이터베이스 자동 업데이트 등록

crontab -e
# 매주 월요일 오전3시 업데이트 실행
0 3 * * Mon /usr/bin/geoipupdate

Nginx GeoIP2 모듈추가

cd /tmp
git clone https://github.com/leev/ngx_http_geoip2_module.git

아래 깃 링크에 가면 자세한 설치방법과 사용예시가 있습니다.
https://github.com/leev/ngx_http_geoip2_module

Nginx 컴파일 하기

현재 자신이 사용하는 Nginx 버전을 확인하고 다운로드 받습니다.

wget http://nginx.org/download/nginx-VERSION.tar.gz
tar zxvf nginx-VERSION.tar.gz
cd nginx-VERSION
./configure --with-compat --add-dynamic-module=../ngx_http_geoip2_module
make modules

Nginx GeoIP2 모듈복사

cp objs/ngx_http_geoip2_module.so /usr/lib/nginx/modules/
echo "load_module modules/ngx_http_geoip2_module.so;" > /etc/nginx/modules-available/mod-http-geoip2.conf
ln -s /etc/nginx/modules-available/mod-http-geoip2.conf /etc/nginx/modules-enabled/60-mod-http-geoip2.conf

좀더 간편하게 바로 복사해서 사용할수 있습니다.

mkdir -p /etc/nginx/modules

cp -vi objs/ngx_http_geoip2_module.so /etc/nginx/modules/

Nginx 국가별 룰 환경설정 적용 및 테스트

nginx.conf파일의 http블록 안에 삽입, 기본적으로 fastcgi 파라미터가 옛날 버전으로 설정되어 있어, 필요에 따라 변수를 조정해줄 필요가 있습니다.

geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
    auto_reload 60m;
    $geoip2_metadata_country_build metadata build_epoch;
    $geoip2_data_country_code country iso_code;
    $geoip2_data_country_name country names en;
}
geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
    auto_reload 60m;
    $geoip2_metadata_city_build metadata build_epoch;
    $geoip2_data_city_name city names en;
}
fastcgi_param COUNTRY_CODE $geoip2_data_country_code;
fastcgi_param COUNTRY_NAME $geoip2_data_country_name;
fastcgi_param CITY_NAME    $geoip2_data_city_name;

국가차단 기본 설정, 테스트를 위해 한국 차단, 기본은 전체 접근 허용 (http 블록안에 넣기)

map $geoip2_data_country_code $domain_allowed_country {
    default yes;
    KR no;
}

가상호스트에 허용국가가 아닐경우 444리턴(응답없음)

location / {
    if ($domain_allowed_country = no) {
        return 444;
    }
}

우분투 20.04 & 워드프레스 사용시 에러가 발생할경우 로케이션빼고 넣어주면 됩니다.

if ($domain_allowed_country = no) {
        return 444;
    }

또는 원하는 도메인으로 리다이렉트

location / {
    if ($geoip2_data_country_code = KR) {
        return 301 https://domain.com$request_uri;
    }
}
Last updated on: 2020-12-25, am 12:41
Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

You May Also Like