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 :
- Inscrivez-vous sur maxmind.com/en/geolite2/signup
- Générez une clé de licence dans votre compte
- 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
-
Module GeoIP2
Référence complète des directives
-
ModSecurity WAF
Pare-feu d'application web complet
-
Limitation de Taux
Protéger contre les abus