Site icon BLD Web Agency

Configurer Nginx avec le module GeoIP et les bases Maxmind

nginx-geoip-module-maxmind-country-city-database

Configurer Nginx avec le module GeoIP et des bases Maxmind peut s’avérer être utile pour diverses utilisations : bloquer l’accès à un site pour un pays spécifique, ou n’autoriser que certains pays à visualiser le contenu d’une page. D’autres usages nécessitent également les bases GeoIP sur Nginx comme la mise en place d’un Dashboard d’analyse des logs sur Grafana avec Loki.

Qu’est ce que GeoIP & Maxmind ?

GeoIP est une technique de géolocalisation visant à localiser un utilisateur en se basant sur son adresse IP. Une adresse IP n’intègre pas d’information géographique de manière intrinsèque. Il est donc nécessaire de passer par une table de conversion (une sorte d’annuaire) qui recense l’ensemble des plages d’adresses IP existantes et qui les fait correspondre à une région géographique. Ces tables sont compilées par des sociétés commerciales. Les tables les plus précises fournissent une précision qui va jusqu’au niveau de la ville. Il est à noter qu’il s’agit généralement de la ville où le fournisseur d’accès à internet a placé ses points d’accès.

Maxmind est l’un de ces fournisseur de base de géolocalisation par adresse IP. La société fourni une solution complète pour la mise en place, le maintient à jour et la configuration des bases GeoIP. Ils proposent une solution gratuite de bases assez limitée en précision. Pour bénéficier d’un service de qualité, il est possible de souscrire à leurs offres payantes.

Depuis quelques temps, Maxmind à mis à jour la solution gratuite et le format des bases fournies (MMDB) n’est plus compatible directement avec la configuration Nginx du module geoip (DAT). Une alternative développée par Sherpya permet la conversion d’un format vers l’autre.

Conversion d’une base MMDB au format DAT

Le développeur fourni un exemple de commande pour la conversion des format MMDB :

$ ./geolite2legacy.py -i GeoLite2-Country-CSV.zip -f geoname2fips.csv -o GeoIP.dat
Database type Country - Blocks IPv4
wrote 306385-node trie with 300679 networks (251 distinct labels) in 8 seconds

# ./geolite2legacy.py -i GeoLite2-ASN-CSV.zip -o GeoIPASNum.dat
Database type ASN - Blocks IPv4
wrote 518484-node trie with 417952 networks (62896 distinct labels) in 15 seconds

Prérequis : installation de Nginx depuis les dépôts officiels

Nous allons avoir besoin pour ce tutoriel d’installer Nginx depuis les dépôts officiels sur Ubuntu 20.04. Pour cela, suivez le guide :

sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

Ajout des dépôts officiels Nginx :

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list

Configurer Aptitude pour préférer l’usage des paquets Nginx depuis les sources officielles, plutôt que d’utiliser les repos Ubuntu :

echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | sudo tee /etc/apt/preferences.d/99nginx

Enfin, installer Nginx :

sudo apt update && sudo apt install nginx

Configurer Nginx pour utiliser les bases GeoIP legacy

Mise en place de la synchronisation des bases

J’ai développé un petit script permettant la génération et la mise à jour des fichiers de bases GeoIP. Ce script est à placer dans un cron et permet de récupérer les fichiers à jour sur le site geoiplegacy.

Récupérez le script sur le Github et ajoutez-lui les droits d’exécution :

wget -q https://raw.githubusercontent.com/bilyboy785/tooling/main/GeoIPUpdater/geoip_update_nginx -O /usr/local/bin/geoip_update_nginx
chmod +x /usr/local/bin/geoip_update_nginx

Configuration Nginx pour l’utilisation de GeoIP

Ajoutez les deux lignes suivantes à votre fichier /etc/nginx/nginx.conf dans le bloc http :

http {
  ##
  # Basic Settings
  ##
    [...]
    geoip_country /etc/nginx/maxmindcountry.dat;
    geoip_city /etc/nginx/maxmindcity.dat;
    [...]

Rechargez Nginx et vous pouvez désormais utiliser les variables geoip_coutry_code et geoip_city_code dans vos fichiers custom de log format ou ailleurs, dans les virtuals host.

Exemple d’utilisation des bases GeoIP pour du filtrage dans Nginx

Voici comment bloquer l’ensemble des requêtes par défaut, et n’autoriser que certains codes pays à accéder à un site. Ajoutez ces lignes à votre fichier /etc/nginx/nginx.conf :

geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
    default no;
    FR yes;
    GB yes;
}

Dans votre virtual host, ajoutez ce bloc if dans la location par défaut ( / ) ou tout autre location :

if ($allowed_country = no) {
    return 444;
}

Vous pouvez retrouver toutes les informations nécessaires à la configuration de Nginx et GeoIP ainsi que d’autres exemples sur le repo Github dédié.

Utilisation des bases GeoIP Maxmind IPV4 ou IPV6 ?

Deux types de bases existent pour la localisation IP : le fichier basée sur les adresses IPV4 et celui sur les adresses IPV6. Selon les informations fournies par l’hébergeur des fichiers legacy, quelque soit la base choisie, les adresses IPV4 sont mappées en adresses IPV6.

L’utilisation d’adresses IPV6 étant en forte augmentation, il conviendrait donc d’utiliser les fichiers de base IPV6 afin de pouvoir identifier à la fois les adresses V6 et les bonnes vieilles V4.

Quitter la version mobile