특정 국가에서 반복적인 공격이 발생한다면 GeoIP 데이터베이스를 이용해 해당 국가 전체를 차단할 수 있습니다. 로그 분석으로 공격 국가를 파악하고, Nginx/Apache에서 GeoIP 기반 차단을 설정하는 방법을 알아봅니다.
``bash whois 203.0.113.42 | grep -i country `
출력:
` Country: CN `
`bash sudo apt install geoip-bin geoip-database geoiplookup 203.0.113.42 `
출력:
` GeoIP Country Edition: CN, China `
의심 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건 공격 → 차단 고려
`bash sudo apt install libnginx-mod-http-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 `
/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 `
`bash sudo apt install libapache2-mod-geoip sudo a2enmod geoip `
/etc/apache2/mods-available/geoip.conf:
`apache `
.htaccess 또는 VirtualHost:
`apache `
`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 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; } } `
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 우회, 정상 사용자 차단 가능성을 고려하여 신중하게 적용해야 합니다.