Pular para conteúdo

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:

  1. Inscreva-se em maxmind.com/en/geolite2/signup
  2. Gere uma chave de licença em sua conta
  3. 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