Aller au contenu

Blocage par Pays avec GeoIP2

Contrôlez l'accès par pays avec la base de données de géolocalisation précise de MaxMind.


  • Bloquer les Mauvais Acteurs


    Arrêtez les attaques en provenance de pays à haut risque avant qu'elles n'atteignent votre application

  • Prêt pour la Conformité


    Appliquez des restrictions géographiques pour le RGPD, les licences ou les exigences légales

  • Aucun Surcharge


    Recherche dans la base de données en mémoire—pas d'appels API externes ni de latence

  • Données Précises


    Bases de données GeoIP2 de MaxMind avec 99,8 % de précision par pays


Prérequis

Vous aurez besoin d'un compte MaxMind gratuit pour télécharger les bases de données GeoIP2 :

  1. Inscrivez-vous sur maxmind.com/en/geolite2/signup
  2. Générez une clé de licence dans votre compte
  3. Conservez-la pour la configuration de mise à jour automatique

Configuration Rapide

Étape 1 : Installer le Module GeoIP2

# Installer le dépôt GetPageSpeed
dnf -y install https://extras.getpagespeed.com/release-latest.rpm

# Installer le module GeoIP2 et le mise à jour automatique de la base de données
dnf -y install nginx-module-geoip2 geoipupdate

Activez dans /etc/nginx/nginx.conf :

load_module modules/ngx_http_geoip2_module.so;

Étape 2 : Configurer les Mises à Jour de la Base de Données

Éditez /etc/GeoIP.conf :

AccountID YOUR_ACCOUNT_ID
LicenseKey YOUR_LICENSE_KEY
EditionIDs GeoLite2-Country GeoLite2-City

Téléchargez les bases de données :

geoipupdate

Activez les mises à jour automatiques hebdomadaires :

systemctl enable --now geoipupdate.timer

Étape 3 : Configurer NGINX

Ajoutez à votre bloc http dans /etc/nginx/nginx.conf :

# Charger les bases de données GeoIP2
geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
    auto_reload 60m;
    $geoip2_country_code country iso_code;
    $geoip2_country_name country names en;
}

Étape 4 : Bloquer des Pays

# Bloquer la Russie, la Chine, la Corée du Nord
map $geoip2_country_code $blocked_country {
    default 0;
    RU 1;
    CN 1;
    KP 1;
}

server {
    # ... votre configuration de serveur ...

    if ($blocked_country) {
        return 403;
    }
}
# Autoriser seulement les États-Unis, le Royaume-Uni, le Canada, l'Australie
map $geoip2_country_code $allowed_country {
    default 0;
    US 1;
    GB 1;
    CA 1;
    AU 1;
}

server {
    # ... votre configuration de serveur ...

    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;
    }
}

Rechargez NGINX :

nginx -t && systemctl reload nginx

Test

# Tester avec une IP connue
curl -H 'X-Forwarded-For: 8.8.8.8' https://example.com
# Devrait fonctionner (Google DNS - États-Unis)

curl -H 'X-Forwarded-For: 77.88.8.8' https://example.com
# Devrait être bloqué (DNS Yandex - Russie, si RU est bloqué)

Tester Localement

Les IPs locales/privées renvoient des codes de pays vides. Testez avec de vraies IPs publiques.


Utilisation Avancée

Utiliser l'IP Réelle du Client Derrière un Proxy/CDN

geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
    $geoip2_country_code source=$http_x_forwarded_for country iso_code;
}

Règles Différentes pour Différents Chemins

# Bloquer partout sauf l'API
location / {
    if ($blocked_country) {
        return 403;
    }
    # ... configuration normale ...
}

location /api/ {
    # API accessible de partout
    # ... configuration de l'api ...
}

Journaliser les Informations sur le Pays

log_format geo '$remote_addr - $geoip2_country_code - $request';
access_log /var/log/nginx/geo.log geo;

Limiter le Taux par Pays

# Limites plus strictes pour les pays à haut risque
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;

Codes de Pays Courants

Code Pays Code Pays
US États-Unis DE Allemagne
GB Royaume-Uni FR France
CA Canada AU Australie
CN Chine RU Russie
IN Inde BR Brésil
JP Japon KR Corée du Sud
KP Corée du Nord IR Iran

Liste complète : ISO 3166-1 alpha-2


Dépannage

Le pays est toujours vide
  • Vérifiez que le chemin de la base de données existe : ls -la /usr/share/GeoIP/
  • Vérifiez que le module est chargé : nginx -V 2>&1 | grep geoip2
  • Vérifiez que l'IP n'est pas privée/localhost
Mauvais pays détecté
  • Mettez à jour la base de données : geoipupdate
  • Vérifiez si derrière un CDN/proxy (utilisez X-Forwarded-For)
  • Précision de MaxMind : ~99,8 % pour les pays
La base de données ne se met pas à jour
  • Vérifiez le minuteur : systemctl status geoipupdate.timer
  • Vérifiez les identifiants dans /etc/GeoIP.conf
  • Exécutez manuellement : geoipupdate -v

Liens Connexes