Voici la traduction d’un article de VIVEK GITE qui est disponible ici : Linux Iptables Just Block By Country – Merci à l’auteur de m’avoir donné l’autorisation de traduire son article.
Je gère un site de commerce électronique et un grand nombre de traffic indésirable (spam, tentative de hack, …) provient de certains pays dont l’intention d’achat est clairement inexistante. Je me posais alors la question de pouvoir mettre ne place un système basé sur Apache ou iptables pour bloquer les connections provenant de ces pays.
On peut bloquer le trafic à la fois au niveau d’Apache et d’iptable. Mais je recommande l’utilisation iptables afin d’économiser les ressources du serveur. En premier lieu il vous faut la liste des blocs d’ip qui correspondent à chacun des pays à bloquer. Rendez-vous simplement sur cette page et téléchargez les fichiers correspondants aux blocs d’IP que vous voulez, ceux-ci sont au format CIDR. Vous pouvez utiliser le script suivant :
A NOTER : Certaine personnes utilisent un proxy ou arrivent par divers moyen à changer leur IP. Contre cela, ce script ne vous sera pas d’un grande utilité, il vous protégera tout de même contre les scans et les spams automatiques.
#!/bin/bash ### Block all traffic from AFGHANISTAN (af) and CHINA (CN). Use ISO code ### ISO="af cn" ### Set PATH ### IPT=/sbin/iptables WGET=/usr/bin/wget EGREP=/bin/egrep ### No editing below ### SPAMLIST="countrydrop" ZONEROOT="/root/iptables" DLROOT="http://www.ipdeny.com/ipblocks/data/countries" cleanOldRules(){ $IPT -F $IPT -X $IPT -t nat -F $IPT -t nat -X $IPT -t mangle -F $IPT -t mangle -X $IPT -P INPUT ACCEPT $IPT -P OUTPUT ACCEPT $IPT -P FORWARD ACCEPT } # create a dir [ ! -d $ZONEROOT ] && /bin/mkdir -p $ZONEROOT # clean old rules cleanOldRules # create a new iptables list $IPT -N $SPAMLIST for c in $ISO do # local zone file tDB=$ZONEROOT/$c.zone # get fresh zone file $WGET -O $tDB $DLROOT/$c.zone # country specific log message SPAMDROPMSG="$c Country Drop" # get BADIPS=$(egrep -v "^#|^$" $tDB) for ipblock in $BADIPS do $IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG" $IPT -A $SPAMLIST -s $ipblock -j DROP done done # Drop everything $IPT -I INPUT -j $SPAMLIST $IPT -I OUTPUT -j $SPAMLIST $IPT -I FORWARD -j $SPAMLIST # call your other iptable script # /path/to/other/iptables.sh exit 0
En tant que root, enregistrez ce script après avoir modifié la variable ISO,,au debut, qui contient la liste des pays à bloquer au format ISO. Une fois fait, ajouter ce script à votre contab pour qu’il s’excute une fois par semaine :
@weekly /path/to/country.block.iptables.sh
Pour commencer dès à présent le blocage par pays il vous suffit de lancer le script une fois à la main :
# /path/to/country.block.iptables.sh
C’est fait, votre serveur refusera à présent les connections en provenances des pays déterminés dans le script.
Le patch geoip pour iptables
Une autre alternative à ce système est l’utilisation du patch geoip pour iptables. Ce n’est pas un module standard pour iptables. Vous devrez le télécharger et re-compiler le noyau Linux de votre serveur.
- Récupérez le patch depuis le site officiel.
- Téléchargez et installez le noyau Linux et iptables correspondant à la distribution de votre serveur.
- Téléchargez et installer l’outil patch-o-matic, il est requis pour appliquer le patch geoip au noyau.
- Puis téléchargez la base de données GEO IP mise à disposition par MaxMind.
Les détails de la re-compilation du noyau et de l’application du patch dépassent le cadre de cet article. Ca fait un bon exercice mais faites tout de même attention à ne pas planter votre serveur.
Autres scripts prêts à l’emploi
Note : Ces sites sont en anglais.
- Bash shell Script (sys v style) par David Picard
- Perl Script par Timothe Litt (voir aussi le script d’installation)