← 블로그 목록
작성일: 2026-05-30 GeoIP국가 차단Nginx

로그 분석 + GeoIP로 국가별 트래픽 차단하기

특정 국가에서 반복적인 공격이 발생한다면 GeoIP 데이터베이스를 이용해 해당 국가 전체를 차단할 수 있습니다. 로그 분석으로 공격 국가를 파악하고, Nginx/Apache에서 GeoIP 기반 차단을 설정하는 방법을 알아봅니다.


로그에서 공격 IP 국가 확인

whois로 IP 소속 국가 확인

``bash whois 203.0.113.42 | grep -i country `

출력:

` Country: CN `

geoiplookup 명령어 (GeoIP 설치 필요)

`bash sudo apt install geoip-bin geoip-database geoiplookup 203.0.113.42 `

출력:

` GeoIP Country Edition: CN, China `


로그에서 공격 IP 국가 분포 분석

의심 IP 목록 추출:

`bash grep -E '(wp-login|xmlrpc|admin)' /var/log/nginx/access.log \ | awk '{print $1}' | sort -u > suspicious_ips.txt `

각 IP의 국가 확인:

`bash while read ip; do country=$(geoiplookup $ip | awk -F', ' '{print $2}' | head -1) echo "$ip $country" done < suspicious_ips.txt | sort -k2 | uniq -c `

출력 예시:

` 1234 CN China 892 RU Russian Federation 421 BR Brazil 87 US United States `

중국(CN)에서 1,234건 공격 → 차단 고려


Nginx에서 GeoIP 차단

1. GeoIP 모듈 설치

`bash sudo apt install libnginx-mod-http-geoip `

2. GeoIP 데이터베이스 다운로드

`bash sudo mkdir -p /usr/share/GeoIP cd /usr/share/GeoIP sudo wget https://dl.miyuru.lk/geoip/maxmind/country/maxmind.dat.gz sudo gunzip maxmind.dat.gz sudo mv maxmind.dat GeoIP.dat `

3. Nginx 설정

/etc/nginx/nginx.conf:

`nginx http { geoip_country /usr/share/GeoIP/GeoIP.dat;

map $geoip_country_code $blocked_country { default 0; CN 1; # 중국 RU 1; # 러시아 KP 1; # 북한 } } `

/etc/nginx/sites-available/example.com:

`nginx server { if ($blocked_country = 1) { return 403; } } `

재시작:

`bash sudo nginx -t sudo systemctl reload nginx `


Apache에서 GeoIP 차단

1. 모듈 설치

`bash sudo apt install libapache2-mod-geoip sudo a2enmod geoip `

2. 설정

/etc/apache2/mods-available/geoip.conf:

`apache GeoIPEnable On GeoIPDBFile /usr/share/GeoIP/GeoIP.dat `

.htaccess 또는 VirtualHost:

`apache SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry SetEnvIf GEOIP_COUNTRY_CODE RU BlockCountry Deny from env=BlockCountry `


로그에 국가 정보 추가

Nginx

`nginx log_format geoip '$remote_addr [$geoip_country_code] - [$time_local] "$request" $status'; access_log /var/log/nginx/access.log geoip; `

로그 예시:

` 203.0.113.42 [CN] - [10/Oct/2024:14:00:00 +0000] "GET / HTTP/1.1" 403 `

Apache

`apache LogFormat "%h [%{GEOIP_COUNTRY_CODE}e] %l %u %t \"%r\" %>s %b" geoip CustomLog /var/log/apache2/access.log geoip `


화이트리스트 방식 (허용 국가만 접근)

특정 국가만 허용하고 나머지 모두 차단:

`nginx map $geoip_country_code $allowed_country { default 0; KR 1; # 한국 US 1; # 미국 JP 1; # 일본 }

server { if ($allowed_country = 0) { return 403; } } `


주의사항

VPN/프록시 우회

GeoIP는 VPN/프록시 사용자를 막을 수 없습니다. 실제 공격자가 미국 VPN을 쓰면 미국으로 표시됩니다.

정당한 사용자 차단 가능

중국/러시아에도 정상 사용자가 있을 수 있습니다. 서비스 대상 지역을 고려하세요.

GeoIP 데이터 정확도

무료 GeoIP 데이터베이스는 정확도가 99%가 아닙니다. 유료 MaxMind GeoIP2가 더 정확합니다.


CloudFlare Firewall Rules

CDN을 사용한다면 Nginx 설정보다 CloudFlare에서 차단하는 것이 더 효율적입니다.

CloudFlare Dashboard → Firewall Rules:

` (ip.geoip.country eq "CN") or (ip.geoip.country eq "RU") → Block ``


정리

로그 분석으로 공격 IP의 국가 분포를 파악하고, GeoIP 모듈로 특정 국가 트래픽을 차단할 수 있습니다. 하지만 VPN 우회, 정상 사용자 차단 가능성을 고려하여 신중하게 적용해야 합니다.