[DevOps] Nginx GeoIP 모듈 적용

안녕하세요? 정리하는 개발자 워니즈입니다. 이번시간에는 Nginx의 dynamic module중 하나인 GeoIP 모듈을 적용해보는 시간을 갖도록 하겠습니다. Nginx의 GeoIP모듈을 통해서 국가단위 혹은 아이피 단위에 대한 제어가 가능해져 굉장히 유용한 모듈입니다.

Nginx에 관한 시리즈 포스팅은 아래에서 확인이 가능합니다.

1. Dynamice Module 이란?

Nginx의 module중에서는 default module인 static module과 추가적으로 사용할 수 있는 dynamic module이 있습니다.

$ nginx -V

nginx version: nginx/1.20.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.1.1l  24 Aug 2021
TLS SNI support enabled
configure arguments: --prefix=/home/apps/nginx-1.20.1 --user=root --group=root --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_v2_module --with-pcre=/pkgs/pcre-8.44 --with-openssl=/pkgs/openssl-1.1.1l --with-zlib=/pkgs/zlib-1.2.11

2. GeoIP Module 이란?

Nginx에서 국가별 IP를 식별하여, 원하지 않는 국가에서의 접속을 차단할 수 있습니다.

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

3. GeoIP Module 설치 방법

신규 Module을 추가할 때에는 기존의 module들도 빼놓지 않고, configure에 추가해야 합니다. 이를 위해 nginx -v 명령어를 사용해 기존의 module을 확인하고 추가할 module을 맨 뒤에 입력해야 합니다.

그럼 본격적으로 GeoIP Module을 설치해보도록 하겠습니다.

libmaxminddb 설치

libmaxminddb 라이브러리는 MaxMind의 GeoIP2 데이터베이스를 포함하여 MaxMind DB 파일을 읽기 위한 C 라이브러리를 제공합니다. 이것은 주소와 관련된 데이터 유형에 큰 유연성을 제공하면서 IP 주소의 빠른 조회를 용이하게 하도록 설계된 사용자 지정 이진 형식입니다.

  • 참고 : https://github.com/maxmind/libmaxminddb
  • libmaxminddb install ( maxminddb 를 설치하기 위해서 사전에 libmaxminddb 를 설치해야 한다 )
$ git clone --recursive https://github.com/maxmind/libmaxminddb
$ cd libmaxminddb/
$ ./bootstrap
$ ./configure
$ make
$ make install
  • environment /usr/local/lib ld config add (라이브러리 추가)
$ vi /etc/ld.so.conf

### add
/usr/local/lib
  • ldconfig / library reconnition ( 라이브러리 인식 )
$ ldconfig

GeoIP Database 다운로드

GeoIP의 데이터베이스는 최신파일로 다운로드를 합니다. 갱신되는 파일을 주기적으로 업데이트해 줄 필요가 있으므로 자동으로 업데이트 가능하도록 해야 합니다.

$ wget https://github.com/maxmind/geoipupdate/releases/download/v3.1.1/geoipupdate-3.1.1.tar.gz
$ tar -zxvf geoipupdate-3.1.1.tar.gz
$ cd geoipupdate-3.1.1
$ ./configure
$ make
$ make install
  • GeoIP.conf 설정

GeoIP.conf 파일에 계정 정보와 필요한 에디션을 설치

유료 이용자에게는 GeoIP2와 GeoIP Legacy DB를 지원하고, 무료 이용자에게는 GeoLite2 DB만 지원한다. (유료 이용 라이센스 발급)

$ vi /usr/local/etc/GeoIP.conf

# Paid
AccountID YOUR_ACCOUNT_ID_HERE
LicenseKey YOUR_LICENSE_KEY_HERE
EditionIDs YOUR_EDITION_IDS_HERE


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

# `LicenseKey` is from your MaxMind account
LicenseKey XXXXXX

# `EditionIDs` is from your MaxMind account.
EditionIDs XXXXXX
  • GeoIP 데이터 베이스 업데이트
$ /usr/local/bin/geoipupdate
  • Crontab 설정
# 원하는 시간에 업데이트 지정
2 22 * * 4 /usr/local/bin/geoipupdate

GeoIP v2 module 다운로드

  • 참고 : https://github.com/leev/ngx_http_geoip2_module

ngx_http_geoip2_module – 클라이언트 IP(기본값) 또는 특정 변수(IPv4 및 IPv6 모두 지원)를 기반으로 하는 maxmind geoip2 데이터베이스의 값으로 변수를 생성합니다.

이 모듈은 이제 nginx 스트림을 지원하며 http 모듈을 사용할 수 있는 것과 동일한 방식으로 사용할 수 있습니다.

$ git clone https://github.com/leev/ngx_http_geoip2_module.git

# nginx 재컴파일 과정에 포함
# 실제 작업시에는 기존에 있던 모듈도 포함해야 합니다. 
$ ./configure --add-dynamic-module=/path/to/ngx_http_geoip2_module
$ make
$ make install

Nginx Re-compile

NGINX_VERSION=1.20.1
PCRE_VERSION=8.44
OPENSSL_VERSION=1.1.1l
ZLIB_VERSION=1.2.11
NGINX_PATH=/home1/irteam/apps/nginx-${NGINX_VERSION}

$ ./configure --prefix=${NGINX_PATH} \
    --user=irteamsu --group=irteamsu \
    --with-http_ssl_module \
    --with-http_stub_status_module \
    --with-http_realip_module \
    --with-http_v2_module \
    --add-dynamic-module=/pkgs/ngx_http_geoip2_module \
    --with-pcre=/pkgs/pcre-${PCRE_VERSION} \
    --with-openssl=/pkgs/openssl-${OPENSSL_VERSION} \
    --with-zlib=/pkgs/zlib-${ZLIB_VERSION}

$ make
$ make install

#완료 후, nginx binary update
$ cp /home1/irteam/apps/nginx-1.20.1/sbin/nginx /usr/bin

4. GeoIP Module 설정 적용

위의 과정이 모두 완료 되었다면, 실제로 Nginx 설정에 GeoIP Module을 적용하는 내용입니다.

Module 로딩

pid /run/nginx.pid;
worker_processes        4; # number of CPU cores
worker_rlimit_nofile    20000; # sockets, fds per worker process

#load_module을 통해서 geoip2 module을 로드합니다
load_module modules/ngx_http_geoip2_module.so;

events {
    worker_connections  3000;
}

mmdb 매핑

http {
    ...
    geoip2 /usr/local/share/GeoIP/GeoLite2-Country.mmdb {
        auto_reload 5m;
        $geoip2_metadata_country_build metadata build_epoch;
        $geoip2_data_country_code country iso_code;
        $geoip2_data_country_name country names en;
    }

    geoip2 /usr/local/share/GeoIP/GeoLite2-City.mmdb {
        $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;
    ....
}

국가 차단 설정

GeoIP Module을 통해서 국가 단위의 차단을 수행 할 수 있습니다. GeoIP Module을 통과하게 되면, Client IP의 국가 및 도시등의 정보를 수집할 수 있습니다.

map $geoip2_data_country_code $domain_allowed_country {
    default yes;
    KR no;
}
....
location / {
    if ($domain_allowed_country = no) {
        return 444;
    }
}

5. 마치며…

Nginx GeoIP Module을 통해서 국가에 대한 접근을 Nginx Layer에서 확인을 할 수 있게 되었습니다. 아이피를 통한 국가 정보 및 도시 정보까지 추출이 가능하여 국가 단위의 차단도 가능해졌습니다. 국가 정보를 통해서 비지니스에서 활용도 할 수 있게 되었고, 개발팀에게 주요한 정보를 주어 비지니스 상에서도 활용을 할 수도 있게 되었습니다.

6. 참고

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다