Bloqueio de Países com GeoIP2
Controle o acesso por país com o banco de dados de geolocalização preciso da MaxMind.
-
Bloquear Atores Maliciosos
Impedir ataques de países de alto risco antes que cheguem ao seu aplicativo
-
Pronto para Conformidade
Impor restrições geográficas para GDPR, licenciamento ou requisitos legais
-
Zero Sobrecarga
Consulta de banco de dados em memória—sem chamadas de API externas ou latência
-
Dados Precisos
Bancos de dados GeoIP2 da MaxMind com 99,8% de precisão por país
Pré-requisitos
Você precisará de uma conta gratuita da MaxMind para baixar os bancos de dados GeoIP2:
- Inscreva-se em maxmind.com/en/geolite2/signup
- Gere uma chave de licença em sua conta
- Salve-a para a configuração de atualização automática
Configuração Rápida
Passo 1: Instalar o Módulo GeoIP2
# Instalar repositório GetPageSpeed
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
# Instalar módulo GeoIP2 e atualizador automático de banco de dados
dnf -y install nginx-module-geoip2 geoipupdate
Habilite em /etc/nginx/nginx.conf:
load_module modules/ngx_http_geoip2_module.so;
Passo 2: Configurar Atualizações de Banco de Dados
Edite /etc/GeoIP.conf:
AccountID YOUR_ACCOUNT_ID
LicenseKey YOUR_LICENSE_KEY
EditionIDs GeoLite2-Country GeoLite2-City
Baixe os bancos de dados:
geoipupdate
Habilite atualizações automáticas semanais:
systemctl enable --now geoipupdate.timer
Passo 3: Configurar NGINX
Adicione ao seu bloco http em /etc/nginx/nginx.conf:
# Carregar bancos de dados GeoIP2
geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
auto_reload 60m;
$geoip2_country_code country iso_code;
$geoip2_country_name country names en;
}
Passo 4: Bloquear Países
# Bloquear Rússia, China, Coreia do Norte
map $geoip2_country_code $blocked_country {
default 0;
RU 1;
CN 1;
KP 1;
}
server {
# ... sua configuração de servidor ...
if ($blocked_country) {
return 403;
}
}
# Permitir apenas EUA, Reino Unido, Canadá, Austrália
map $geoip2_country_code $allowed_country {
default 0;
US 1;
GB 1;
CA 1;
AU 1;
}
server {
# ... sua configuração de servidor ...
if ($allowed_country = 0) {
return 403;
}
}
map $geoip2_country_code $blocked_country {
default 0;
RU 1;
CN 1;
}
server {
error_page 403 /geo-blocked.html;
location = /geo-blocked.html {
internal;
root /var/www/error-pages;
}
if ($blocked_country) {
return 403;
}
}
Recarregue o NGINX:
nginx -t && systemctl reload nginx
Testando
# Testar com um IP conhecido
curl -H 'X-Forwarded-For: 8.8.8.8' https://example.com
# Deve funcionar (Google DNS - EUA)
curl -H 'X-Forwarded-For: 77.88.8.8' https://example.com
# Deve ser bloqueado (DNS Yandex - Rússia, se RU estiver bloqueado)
Testando Localmente
IPs locais/privados retornam códigos de país vazios. Teste com IPs públicos reais.
Uso Avançado
Usar IP Real do Cliente Atrás de Proxy/CDN
geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
$geoip2_country_code source=$http_x_forwarded_for country iso_code;
}
Regras Diferentes para Diferentes Caminhos
# Bloquear em todos os lugares, exceto na API
location / {
if ($blocked_country) {
return 403;
}
# ... configuração normal ...
}
location /api/ {
# API acessível de qualquer lugar
# ... configuração da api ...
}
Registrar Informações do País
log_format geo '$remote_addr - $geoip2_country_code - $request';
access_log /var/log/nginx/geo.log geo;
Limitar Taxa por País
# Limites mais rigorosos para países de alto risco
map $geoip2_country_code $limit_key {
default $binary_remote_addr;
RU $binary_remote_addr$geoip2_country_code;
CN $binary_remote_addr$geoip2_country_code;
}
limit_req_zone $limit_key zone=geo_limit:10m rate=10r/s;
Códigos de País Comuns
| Código | País | Código | País |
|---|---|---|---|
| US | Estados Unidos | DE | Alemanha |
| GB | Reino Unido | FR | França |
| CA | Canadá | AU | Austrália |
| CN | China | RU | Rússia |
| IN | Índia | BR | Brasil |
| JP | Japão | KR | Coreia do Sul |
| KP | Coreia do Norte | IR | Irã |
Lista completa: ISO 3166-1 alpha-2
Solução de Problemas
País sempre vazio
- Verifique se o caminho do banco de dados existe:
ls -la /usr/share/GeoIP/ - Verifique se o módulo está carregado:
nginx -V 2>&1 | grep geoip2 - Verifique se o IP não é privado/localhost
País errado detectado
- Atualize o banco de dados:
geoipupdate - Verifique se está atrás de CDN/proxy (use
X-Forwarded-For) - Precisão da MaxMind: ~99,8% para países
Banco de dados não atualizando
- Verifique o timer:
systemctl status geoipupdate.timer - Verifique as credenciais em
/etc/GeoIP.conf - Execute manualmente:
geoipupdate -v
Relacionados
-
Módulo GeoIP2
Referência completa da diretiva
-
ModSecurity WAF
Firewall completo para aplicações web
-
Limitação de Taxa
Proteja contra abusos