Utiliser Iptables pour bloquer les accès par pays

Voici la traduction d’un article de   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.

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *