Il y a des visiteurs sur nos sites/serveurs dont on se passerait, et certains pays sont reconnus à juste titre pour avoir un grand nombre de personnes avec des intentions malveillantes pour nos sites. J’avais écrit un article sur le sujet il y a quelques mois dans le cadre d’une utilisation d’un serveur Apache et un autre plus récemment sur une méthode avec CSF et  LFD.

Nous allons aborder ici quelques moyens de bloquer certains visiteurs avec NGinx en utilisant les adresses IP, les sites référents, les réseaux par pays et quelques autres petites astuces en utilisant les options fournies par NGinx. Il existe bien d’autres façons de faire et j’ai choisi celles qui me paraissent les plus simples à mettre en œuvre.

Par adresse IP

Bloquer une ou plusieurs adresses IP est très simple avec NGinx. Il suffit d’utiliser la syntaxe suivante:

deny 85.17.26.68; # DOS attack, denied.  

Il est toujours utile de laisser un commentaire comme dans l’exemple précédent pour se rappeler plus tard pourquoi cette adresse a été bloquée.

Par réseau

si vous avez des attaques de différentes adresses IP d’un même réseau, il existe le moyen suivant de bloquer un réseau entier. C’est la même syntaxe que dans le chapitre précédent mais au lieu de bloquer une adresse unique vous bloquez ici un bloc réseau CIDR.

Exemple:

deny 19.22.31.0/24; # attack argument2 deny 29.12.44.0/20; # blocked because argument  

 Par User Agent

C’est également très simple dans ce cas, il suffit juste de mettre le nom du user-agent pour bloquer ces crawlers:

if ($http_user_agent ~ "Purebot|Lipperhey|MaMa CaSpEr|libwww-perl|Mail.Ru|gold crawler" ) { return 403; }  

Par Référent (Referrer)

Vous pouvez également bloquer les connexions en vous basant sur les informations de “referrer” envoyées avec les entêtes:

if ($http_referer ~* "bingo|casino|viagra") { return 403; }  

Par Pays

Pour bloquer les accès par pays on peut utiliser le module GeoIP et ensuite paramétrer son serveur Nginx pour bloquer le ou les pays choisis avec le(s) code(s) correspondant.

Il faut d’abord installer GeoIP avec sa base de données, définir le chemin de la base GeoIP dans la configuration NGinx et dans un bloc http {}.

Installer GeoIP

sudo apt-get install geoip-database -y  
sudo apt-get install libgeoip-dev -y  
sudo apt-get install libgd2-noxpm -y  
sudo apt-get install libgd2-noxpm-dev -y  

Installer la base GeoIP

cd /usr/share/GeoIP/  
sudo wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz  
sudo gzip -d GeoLiteCity.dat.gz  

Vérifier l’installation

nginx -V  

Look for the –with-httpgeoipmodule, this means that Geo IP support is enabled.

sudo apt-get install nginx-full  

Paramétrer NGinx avec geoIP

Ajouter le chemin de la base dans le fichier de configuration de NGinx.

Exemple:

geoip_country /usr/share/GeoIP/GeoIP.dat; geoip_city /usr/share/GeoIP/GeoLiteCity.dat;  

Puis, bloquer les pays dont on veut refuser l’accès. Ainsi on obtient l’exemple suivant:

if ($geoip_country_code ~ (CN|RU) ) { return 403; }  

Source:
http://nginx.org/en/docs/http/ngxhttpgeoip_module.html

http://www.howtoforge.com/using-geoip-with-nginx-on-debian-squeeze-ubuntu-11.04

http://blog.mdnsolutions.com/index.php/installing-geoip-on-nginx/
http://doc.ubuntu-fr.org/nginx
https://launchpad.net/~nginx/+archive/stable?field.series_filter=precise

https://wiki.debian.org/fr/Nginx