특정 국가에서 반복적인 공격이 발생한다면 GeoIP 데이터베이스를 이용해 해당 국가 전체를 차단할 수 있습니다. 로그 분석으로 공격 국가를 파악하고, Nginx/Apache에서 GeoIP 기반 차단을 설정하는 방법을 알아봅니다.
whois 203.0.113.42 | grep -i country
출력:
Country: CN
sudo apt install geoip-bin geoip-database
geoiplookup 203.0.113.42
출력:
GeoIP Country Edition: CN, China
의심 IP 목록 추출:
grep -E '(wp-login|xmlrpc|admin)' /var/log/nginx/access.log \
| awk '{print $1}' | sort -u > suspicious_ips.txt
각 IP의 국가 확인:
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건 공격 → 차단 고려
sudo apt install libnginx-mod-http-geoip
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
/etc/nginx/nginx.conf:
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:
server {
if ($blocked_country = 1) {
return 403;
}
}
재시작:
sudo nginx -t
sudo systemctl reload nginx
sudo apt install libapache2-mod-geoip
sudo a2enmod geoip
/etc/apache2/mods-available/geoip.conf:
<IfModule mod_geoip.c>
GeoIPEnable On
GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
</IfModule>
.htaccess 또는 VirtualHost:
<IfModule mod_geoip.c>
SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE RU BlockCountry
Deny from env=BlockCountry
</IfModule>
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
LogFormat "%h [%{GEOIP_COUNTRY_CODE}e] %l %u %t \"%r\" %>s %b" geoip
CustomLog /var/log/apache2/access.log geoip
특정 국가만 허용하고 나머지 모두 차단:
map $geoip_country_code $allowed_country {
default 0;
KR 1; # 한국
US 1; # 미국
JP 1; # 일본
}
server { if ($allowed_country = 0) { return 403; } }
GeoIP는 VPN/프록시 사용자를 막을 수 없습니다. 실제 공격자가 미국 VPN을 쓰면 미국으로 표시됩니다.
중국/러시아에도 정상 사용자가 있을 수 있습니다. 서비스 대상 지역을 고려하세요.
무료 GeoIP 데이터베이스는 정확도가 99%가 아닙니다. 유료 MaxMind GeoIP2가 더 정확합니다.
CDN을 사용한다면 Nginx 설정보다 CloudFlare에서 차단하는 것이 더 효율적입니다.
CloudFlare Dashboard → Firewall Rules:
(ip.geoip.country eq "CN") or (ip.geoip.country eq "RU") → Block
로그 분석으로 공격 IP의 국가 분포를 파악하고, GeoIP 모듈로 특정 국가 트래픽을 차단할 수 있습니다. 하지만 VPN 우회, 정상 사용자 차단 가능성을 고려하여 신중하게 적용해야 합니다.