Bloquer des pays avec GeoIP pour Nginx


J'ai remarqué qu'il y a de nombreux visiteurs Chinois qui se connecte à mon serveur sauf que je n'écrit pas d'article à leur attention. Je souhaite donc leur renvoyer le code HTTP 403.

Télécharger la base

On va utiliser la base Maxmind qui est plus maintenu à jour que le paquet Debian geoip-database :

cd /usr/share/GeoIP/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz

Cela devrait suffire pour bloquer des Pays. Il existe d'autre bases pour bloquer par Ville ou par bloc d'IPs par exemple.

Configurer Nginx

Il faudra vérifier la version de Nginx qui doit supporter le module geoip :

nginx -V

On remarquera alors cette option :

--with-http_geoip_module=dynamic

Cela signifie que le module sera chargé au lancement du service Nginx. Les modules sont présent dans ce dossier : /etc/nginx/modules-enabled . Si la configuration Nginx ne les utilisent pas alors il est possible de charger spécifiquement un module :

nano /etc/nginx/nginx.conf

En ajoutant cette directive en dehors du block http {} :

load_module "modules/ngx_http_geoip_module.so";

On déclare par la suite les restrictions que l'on souhaite mettre en place :

http {

    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default yes;
        CN no;
        #FR no;
    }
    
    [...]
}

Le blockage doit s'appliquer dans les vhosts, dans le block server {} :

server {

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

    [...]
}

Il reste plus qu'a vérifier la syntaxe et recharger la configuration de Nginx!