Nginx – GeoIP : configuration

Dans ce nouveau tutoriel dédié à Nginx, je vais vous expliquer comment configurer la GeoIP afin de pouvoir mettre des filtres (restriction) en fonction du pays de vos visiteurs.

La GéoIP va nous permettre de déterminer le pays (voir la ville) d’un visiteur en fonction de son adresse IP, pour cela on va s’appuyer sur une base de données fournie par MaxMind.

Connaitre le pays de notre visiteur permet ensuite de définir des actions comment :

  • Bloquer l’utilisateur et ne pas fournir de contenu par exemple, souvent utiliser en entreprise pour « protéger » des applications
  • Rediriger l’utilisateur vers un serveur proche pour une meilleure expérience
  • Fournir un contenu différent

Dans ce tutoriel, je vais principalement aborder le « blocage ».

Prérequis

Avant de commencer, vous devez vérifier que le module GeoIP2 est présent sur Nginx, pour cela entrer la commande ci-après et rechercher dans la liste : http-geoip2

nginx -V

Si le module n’est pas présent, vous avez plusieurs solutions :

  • Réinstaller Nginx avec les modules extras
  • Compiler le module et l’ajouter

Afin de pouvoir télécharger la base de données Maxmind, il est nécessaire d’avoir un compte (gratuit) et d’avoir un token.

Installation des composants libmaxmindddb et geoipuodate

Afin de pouvoir télécharger et mettre à jour la base de données, nous allons installer les composants suivants :

  • libmaxmindddb
  • geoipuodate

Pour cela nous allons ajouter un dépôt :

sudo add-apt-repository ppa:maxmind/ppa

Mettre à jour les paquets :

sudo apt update

Installer composants nécessaires :

sudo apt install libmaxminddb0 libmaxminddb-dev mmdb-bin geoipupdate -y

Maxmind et geoipupdate sont installés.

Configuration de Maxmind et test

Il faut maintenant configurer Maxmind avec l’identifiant et la clé de licence.

Ouvrir le fichier /etc/GeoIP.conf

sudo nano /etc/GeoIP.conf

Modifier les lignes AccountID et LicenseKey puis sauvegarder le fichier.

Maintenant, on va télécharger les bases de données, ce qui va permettre de tester la bonne configuration de licence.

Entrer la commande ci-dessous :

sudo geoipupdate -v

Les fichiers de base de données (mmdb) se trouve dans le dossier /usr/share/GeoIP.

Pour tester le bon, on va utiliser la commande mmdblookup.

sudo mmdblookup --file /usr/share/GeoIP/GeoLite2-Country.mmdb --ip 1.1.1.1

On peut voir les différents pays reconnu pour l’adresse IP 1.1.1.1

On va maintenant pouvoir passer à la configuration de Nginx pour utiliser les bases de GeoIP.

Configuration de Nginx pour utiliser la GeoIP

Pour commencer, on va éditer le fichier /etc/nginx/nginx.conf, où l’on va indiquer à Nginx et au mod geoip2, la base de données de charger.

Avant de modifier le fichier nginx.conf, penser à en faire une sauvegarde.

Ouvrir le fichier /etc/nginx/nginx.conf :

sudo nano /etc/nginx/nginx.conf

Dans le bloc http{}, ajouter les lignes suivantes pour charger la base de données des pays :

##
# Geoip2 Settings
##
        
geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
    $geoip2_data_country_iso_code country iso_code;
}

Sauvegarder le fichier, puis tester la configuration avec la commande suivante :

sudo nginx -t

S’il n y a pas de problème, recharger la configuration :

sudo systemctl reload nginx

Maintenant, on va voir comment utiliser la GeoIP au niveau des virtualhosts, on a deux façon de procéder :

  • Liste noire : autoriser tout le trafic et bloquer certains pays
  • Liste blanche : bloquer tout le trafic et autoriser certains pays et adresses IP

Dans ce tutoriel, je vais vous donner un exemple de chaque

Ci dessous, un exemple de fichier virtualhost, qui autorise tout le trafic et qui bloque les IPs en provenance de Russie et du Vietnam.

Ci dessous, un exemple de virtualhost, qui bloque tout le trafic (default no;) et ensuite on autorise le trafic.


Vous savez maintenant configurer le GeoIP avec Nginx et sécuriser l’accès à des sites internet en fonction du pays du visiteurs.

Comme toutes limitations géographique, elles peuvent être contourner à l’aide d’un VPN.