• 모닥위키모닥위키
  • 모닥위키
위키
  • 인기글
  • 목록
  • 시리즈
  • 임의열람
    AAAdddvvveeerrrtttiiissseeemmmeeennntttAdvertisement

    © 2025 modak.wiki All rights reserved.

    IP Geolocation by DB-IP

      지역기반 IP 정보로 Nginx 필터 설정하기

      DB-IP 제공 데이터베이스 활용 국가별 IP 필터링을 적용한 작업기록입니다.

      컴퓨터/IT작업기록
      lu

      luasenvy (luasenvy)

      CC BY-SA 4.0 국제규약

      개요

      최근 Nginx 접속 시도 로그를 보면 난생처음 보는 국가에서 온갖 공격을 시도하고 있기 때문에 조금이나마 서버에 도움이 되기를 바라는 마음에서 진행하였다. 그렇게 큰 웹 서비스를 준비하는 것도 아니기 때문에 어느 정도 정확성만 보장된다면 충분히 활용할 수 있다고 판단하였다.

      국내에서도 갖가지 방법의 공격들이 들어오기는 하지만 해외 IP가 극단적으로 비중이 높았기 때문에 지역기반 IP(Geo IP) 차단을 활용하기로 하였다. 어차피 콘텐츠도 그렇고 한글과 영어가 전부라 서비스 지역을 제한하여도 크게 문제가 없다고 판단했다.

      Geo IP로 차단하려면 IP와 지역이 매핑된 데이터베이스가 필요하다. 이 데이터베이스는 온라인상에서 다양한 방식으로 제공된다. 과거에는 .dat 파일을 사용하는 레거시 방식과 최근 .mmdb를 사용하는 방식까지 다양하다. mmdb는 maxmind 사에서 제공하는 데이터베이스 포맷이다.

      이런 Geo IP 데이터베이스는 대부분 상용 소프트웨어로 비용이 들어간다. 무료 버전이라 해도 업데이트 주기가 길거나 정확도가 떨어지는 등의 문제를 안고 있다. 무료로 사용할 수 있는 방법을 뒤지다 보면 maxmind 사에서 제공하는 Lite 버전을 많이 만나볼 수 있는데 회원이 되어야만 활용할 수 있다. 다만 우리가 생각하는 가입 절차가 아닌 복잡한 계정 신청 절차를 밟아야 하기 때문에 생각보다 진입장벽이 있는 편이다. 대신 이 방법을 사용할 경우 maxmind에서 제공하는 패키지인 geoipupdate를 활용할 수 있어 리눅스 환경에서 편리하게 mmdb 파일을 주기적으로 갱신하고 적용할 수 있는 강점이 있다.

      이외의 방법으로 self-hosted가 가능한 mmdb-server를 운용하는 방법이 있다. 그러나 생각보다 귀찮고 라이선스도 AGPL-3.0을 따르고 있었다. 이는 네트워크 통신만으로도 연동된 소스코드의 공개 의무가 발생할 수 있다. 생성된 mmdb 파일만 활용한다면 문제가 없을 수 있겠지만 라이선스라는 것이 상황에 따라 귀걸이도 코걸이도 될 수 있어서 찝찝함에 사용을 포기하였다.

      그 다음으로 찾은 것이 DB-IP에서 제공하는 Lite버전의 데이터베이스이다. 라이선스도 CC-BY 4.0을 채택하고 있어 부담없이 사용할 수 있어 보였고 업데이트도 주기적으로 관리되는 것으로 보여 신뢰할 수 있을 것으로 판단했다.

      다운로드 및 Nginx 설정

      DB-IP에서 제공하는 Lite 버전의 mmdb를 얻기 위하여 홈페이지으로 접속하여 Database -> Lite Edition -> IP TO COUNTRY LITE 메뉴로 이동하면 다운로드 받을 수 있는 링크를 확인할 수 있다.

      /path/to/nginx.conf
      http {
      
        # ...
        
        geoip2 /path/to/geoip.mmdb {
          auto_reload 24h;
          $geoip2_data_country_iso_code country iso_code;
        }
      
        map $geoip2_data_country_iso_code $allowed_country {
            default no;
        
            KR yes;
        }
      
        # ...
      
      }
      

      다운로드한 mmdb 파일을 적당한 위치로 옮기고 경로 설정과 iso_code에 맞는 허용 국가 목록을 작성한다. 설정은 map 변수를 초기화하는 디렉티브 이기 때문에 'http 디렉티브 하위'에서 작성되어야 한다.

      설정에서 $geoip2_data_country_iso_code는 값을 저장할 변수를 의미하고 country iso_code는 json의 데이터 접근 방식에서 .을 띄어쓰기로 대체한다고 이해하면 된다. 이를 확인하려면 mmdb-bin을 설치하여 더 직관적으로 확인할 수 있다.

      CLI
      sudo apt install mmdb-bin -y
      mmdblookup --file /path/to/geoip.mmdb --ip 8.8.8.8
      

      이 명령을 통하여 확인해 보면 내부의 쿼리 결과를 볼 수 있는데 country속성 하위로 iso_code 값이 존재하는 것을 확인할 수 있다. 만약 mmdb의 데이터 구조가 이와 다르다면 직접 확인하여 올바른 속성 경로를 입력해야 한다. default no;로 인하여 기본적으로 모두 차단하는 화이트리스트 방식이다. 블랙리스트 방식으로 적용하고 싶다면 반대로 적용하면 된다.

      /path/to/nginx.conf
      server {
      
        # ...
      
        if ($allowed_country = no) {
          return 403;
        }
      
        # ...
      
      }
      

      설정을 통하여 map 변수가 초기화된 이후에 변수를 활용할 수 있는데 if 디렉티브를 활용하여 허용되지 않은 요청들을 403 forbidden으로 차단할 수 있다. 이렇게 차단된 IP들을 로그에 남긴 후 fail2ban 패키지를 함께 연동한다면 효과적으로 차단 IP를 관리할 수 있다.

      라이선스 준수

      출처표시

      출처표시

      DB-IP에서는 제공한 mmdb 데이터 베이스에서 추출한 데이터를 표시되는 곳에 출처 표시를 하면 된다고 가이드 한다. 서비스에 적용한 방법은 데이터를 활용해 화면에 표시하는 것이 아니라 Nginx에서 필터링만 하는 것이지만 가장 보수적으로 적용하는 것이 좋겠다고 판단하였다. 홈페이지에서 권장하는 출처 표시를 모든 페이지에서 볼 수 있도록 사이드바 최하단에 추가하여 CC-BY 4.0 라이선스를 준수하였다.

      확인

      외부국가 접근

      외부국가 접근

      우측 상단의 확장 프로그램 상태를 보면 알 수 있듯이 Express VPN을 활성화하여 허용하지 않은 국가를 선택한 후 접속을 시도해 보면 차단되는 것을 확인할 수 있다.

      초판: 2025. 10. 11. 17:20:30

      수정판: 2025. 10. 11. 21:53:33

      © 2025 이 문서는 "CC BY-SA 4.0 국제규약" 라이선스로 배포 되었습니다. 모든 권리는 저자에게 있습니다.

      지역기반 IP 정보로 Nginx 필터 설정하기

      개요
      다운로드 및 Nginx 설정
      라이선스 준수
      확인