NGINX GeoIP2 모듈을 이용하여 국가별 접속 차단하는 방법
NGINX GeoIP2 모듈을 이용하여 국가에 대해 접근을 차단할 수 있습니다. 몇몇 국가에서는 악의적인 사이버 공격이나 해킹시도가 빈번하게 일어납니다. 해당 국가들을 차단하기 위해 NGINX에서 포스트와 같은 GeoIP2 모듈을 사용하여 접근을 차단할 수 있습니다.
목차
1. GeoIP2란?
2. GeoIP2 설치 및 기본 구성
3. NGINX GeoIP2 모듈 설치 및 구성
4. 결론
1.GeoIP2란?
MaxMind에서 제공하는 DB 를 통해서 웹에 접근하는 IP의 국가별로 확인할 수 있는 오픈 소스 솔루션 입니다.
이전에 사용했었던 GeoIP는 현재 지원 중단되어 GeoIP2를 사용해야 최신 업데이트를 사용할 수 있습니다.
2. GeoIP2 설치 및 기본 구성
GeoIP2의 기본구성을 진행하기 전에 https://www.maxmind.com/en/home 해당 사이트에 가입하고 GeoIP2에서 사용할 License Key 와 Account ID 필요합니다.(최초 확인 이후 재 확인 불가)
GeoIP2를 사용 및 최신 데이터베이스 업데이트 위해 아래와 같은 패키지를 설치합니다.
$ add-apt-repository ppa:maxmind/ppa
$ apt update
$ apt install geoipupdate libmaxminddb0 libmaxminddb-dev mmdb-bin -y
geoipupdate : GeoIP 및 GeoLite 데이터베이스 업데이트 도구입니다. GeoIP2 및 GeoIP 레거시 바이너리 데이터베이스의 자동 업데이트를 수행합니다.
libmaxminddb0, libmaxminddb-dev, mmdb-bin : MaxMind DB 파일을 읽기 위한 C 라이브러리입니다. 주로 MaxMind의 GeoIP2 데이터베이스와 같은 IP 주소 관련 데이터를 빠르게 조회하기 위해 사용됩니다.
텍스트 에디터를 통해 License Key 와 Account ID를 넣습니다.
$ vim /etc/GeoIP.conf

명령어를 통해 갱신합니다.
$ geoipupdate
갱신을 하게되면 아래와 같은 mmdb 파일이 생기게 됩니다.

3. NGINX GeoIP2 모듈 설치 및 구성
먼저 구성전에 GeoIP2 모듈을 설치합니다.
(NGINX Plus에서 진행하였기 때문에 package 설치가 가능합니다. 오픈소스 버전은 컴파일로 설치하여 진행하여야합니다. https://github.com/leev/ngx_http_geoip2_module.git)
$ apt-get install nginx-plus-module-geoip2
해당 패키지를 설치 후 구성을 진행합니다.
/etc/nginx/nginx.conf를 수정합니다.
패키지 설치한 모듈을 사용하기 위해서 모듈을 불러옵니다.
load_module modules/ngx_http_geoip2_module.so;
user nginx;
worker_processes 4;
error_log /var/log/nginx/error/error.log notice;
pid /var/run/nginx.pid;
...
모듈을 불러온 후 구성을 진행합니다.
# /etc/nginx/conf.d/default.conf
1 geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
2 auto_reload 60m;
3 $geoip2_data_country_name country names en;
4 $geoip2_data_country_code country iso_code;
5 }
6
7 map $geoip2_data_country_code $country_allow{
8 default no;
9 KR yes;
10 }
11 server {
12 ...
13 location / {
14 if ($country_allow = no){
15 return 403;
16 }
17 ...
1 : 국외 차단에 사용할 데이터베이스를 지정합니다.
2 : 60분 마다 데이터베이스를 자동으로 로드합니다.
3 : 변수에 요청한 클라이언트의 국가 이름을 영어로 저장합니다.
4 : 국가를 고유하게 식별하는 2자리 문자열을 저장합니다.
7 : 국가 코드에 따라 값이 바뀌는 변수를 지정합니다.
8~9 한국을 제외한 모든 국가를 접근 제한합니다.
14~16 변수의 값이 no일 때 403 http code를 반환합니다.
먼저 VPN을 사용하지 않고 진행합니다.
아래처럼 200OK가 나오게 되고 접근이 가능합니다.
$ curl test.com:8081 -i
HTTP/1.1 200 OK
Server: nginx/1.25.5
Date: Tue, 08 Oct 2024 08:24:54 GMT
Content-Type: text/html
Content-Length: 615
Connection: keep-alive
Last-Modified: Wed, 24 Jul 2024 12:40:13 GMT
ETag: "66a0f62d-267"
Accept-Ranges: bytes
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
vpn을 이용하여 ip의 국가를 미국으로 설정한 후 요청합니다.
아래와 같이 지정한 http status 코드와 접근이 제한된 것을 볼 수 있습니다.
(IP는 블라인드 하였습니다.)

차단 되는 것을 볼 수 있습니다.
차단 되는 것과 어느 국가에서 접속 시도를 했는지 확인할 수 있도록 로그포멧을 수정합니다.
# /etc/nginx/nginx.conf
1 log_format geo '$remote_addr - - $status $geoip2_data_country_code" "$country_allow"';
2
3 geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
4 auto_reload 60m;
5 $geoip2_data_country_code country iso_code;
6 $geoip2_data_country_name country names en;
7 }
8
9 map $geoip2_data_country_code $country_allow {
10 default no;
11 KR yes;
12 }
13
14 server {
15 listen 8081 default_server;
16 server_name localhost;
17
18 access_log /var/log/nginx/geo.access.log geo;
4 : 확인 할 IP와 http status code와 “$geoip2_data_country_code” “$country_allow“‘; 를 추가하여 국가 코드와 접속 가능 여부를 로그에서 확인 할 수 있습니다.
21 : geo 로그 포멧을 사용하는 access_log를 지정합니다.
아래와 같이 로그 포멧을 변경한 후 확인하게 되면 아래와 같이
[IP] – – [http status code] – [접속한 IP 국가 iso_코드] [접속 허용 여부]로 확인할 수 있습니다.

4. 결론
NGINX의 GeoIP2 모듈을 활용하면 특정 국가로부터의 접근을 효과적으로 차단할 수 있습니다. 이는 악의적인 사이버 공격이나 해킹 시도가 빈번한 국가들을 대상으로 하여, 서버의 보안을 강화하는 데 큰 도움이 됩니다. GeoIP2 모듈을 통해 IP 주소에 기반한 국가 정보를 활용하여 불필요한 요청을 사전 차단함으로써, 웹 애플리케이션의 안정성과 신뢰성을 높일 수 있습니다. 따라서 이러한 접근 제한은 사이버 보안을 강화하는 중요한 전략이 될 수 있습니다.
NGINX Plus를 직접 사용해 보시려면 30일 무료 평가판을 신청하거나 NGINX STORE에 연락하여 논의하십시오.
댓글을 달려면 로그인해야 합니다.