Blog geekesque... ou presque

Aller au contenu | Aller au menu | Aller à la recherche

Bloquer des pays sur Nginx

Depuis un certains temps, mes différents sites se font spammer par des robots provenant en particulier de 3 pays, à savoir la Chine, l’Afghanistan et l'Iran.

Utilisant un compte Cloudflare gratuit, je n'ai pas la possibilité de les bloquer via l'interface, je suis donc obligé de faire cela via la configuration de nginx. J'en ai donc profité pour faire un petit script qui automatise la liste des IP à bannir pour gérer ça d'une manière plus simple.

Pourquoi pas avec iptables ?

Tout simplement parce qu'ainsi que je l'ai dit précédemment, j'utilise Cloudflare et par conséquent le serveur ne voit pas directement les IPs des visiteurs, seul Nginx les voit avec la configuration idoine.

Notez tout de même que j'ai un second script qui fonctionne sur le même principe que celui que je présente ici et qui sert à alimenter iptables pour bloquer ces mêmes pays sur les accès directs.

Source des IP

Le site ipdeny liste les IP des différents pays et permet de les récupérer directement par le web. Il vous suffit de connaitre le code ISO du pays en question et vous pouvez automatiser cette récupération.

J'en ai profité aussi pour bloquer les accès qui se feraient via le réseau TOR, en utilisant la liste accessible à https://www.dan.me.uk/torlist/?exit (liste des nœuds de sortie ToR, rafraichit toutes les 30 minutes)

Script

Toutes les explications du script sont en commentaire dans le code afin que vous puissiez facilement le copier sur votre serveur.

#!/bin/bash
 
# Liste des codes ISO des pays à bannir
# Notez que j'ai créé un iso "tor" qui n'existe pas sur ipdeny
ISO="tor af cn ir"
 
### Set PATH ###
# Les chemins vers les différents utilitaires:
# wget pour récupérer les fichiers sur internet
WGET=/usr/bin/wget
# egrep pour nettoyer le contenu des fichiers
EGREP=/bin/egrep
 
# Ce fichier est celui qui stockera les directives nginx
# Il doit impérativement être dans le répertoire conf.d
DENY=/etc/nginx/conf.d/blockusers.conf
 
### No editing below ###
ZONEROOT="/tmp"
DLROOT="http://www.ipdeny.com/ipblocks/data/countries"
TORLIST="https://www.dan.me.uk/torlist/?exit"
 
# Première opération: supprimer les anciens fichiers
/bin/rm -f $ZONEROOT/*.zone
/bin/rm -f $DENY
/usr/bin/touch $DENY
 
# Boucle sur le contenu de la variable $ISO
for c in $ISO
do
        echo "# Forbiding $c" >> $DENY
        tDB=$ZONEROOT/$c.zone
        # Récupération des fichiers de zone
        if [ "$c" = "tor" ]
        then
                # Cas particulier de TOR, la liste n'est pas au même endroit
                $WGET -q -O $tDB $TORLIST
 
        else
                $WGET -q -O $tDB $DLROOT/$c.zone
        fi
 
        # On supprime les lignes de commentaires ou les lignes vides
        BADIPS=$(egrep -v "^#|^$" $tDB)
        for ipblock in $BADIPS
        do
                #On écrit la directive "deny" dans le fichier de configuration
                echo "deny $ipblock;" >> $DENY
        done
done
 
# On redémarre nginx
/etc/init.d/nginx force-reload
exit 0

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

La discussion continue ailleurs

URL de rétrolien : https://www.g33k-zone.org/index.php?trackback/112

Fil des commentaires de ce billet