Le programme "geoip" qui s'interface directement avec iptables. Ce programme doit être compilé manuellement ou avec DKMS, ce qui peut parfois être complexe. De plus certains noyaux ne supportent pas cette méthode (les serveurs OVH par exemple).
L'utilisation du programme "ipset" qui permet de créer des listes d'adresses réseau de grande taille (maxi 65536 entrées). Ipset est disponible à partir du noyau 2.6.32 (debian 7)
Récupération des listes de réseaux d'un pays!!!
Le site www.ipdeny.com permet de télécharger des listes gratuites. Remarquez les abréviations qui désignent les pays : "cn" pour la chine par exemple. Il est possible de télécharger directement une liste avec un commande wget, par exemple pour la chine :
wget http://www.ipdeny.com/ipblocks/data/countries/cn.zone --no-check-certificate
Création d'une liste avec "ipset"
ipset flush maliste # RAZ total la liste "maliste" ipset create maliste hash:net # Création de la liste si elle n'existe pas encore for S in $(cat cn.zone) # Ajout des réseaux chinois do
ipset add maliste $S
done for S in $(cat ru.zone) # Ajout des réseaux russes do
ipset add maliste $S
done ipset add maliste 1.2.3.4/32 # Ajout d'une autre adresse IP dans la liste
Il est possible de voir le contenu d'un liste : ipset list maliste
Exemples d'utilisation d'une liste dans "iptables"
J'utilise directement les commandes iptables
Bloquer les pings de certains pays (ceux de la liste "maliste")
iptables -A INPUT -p icmp -m set --match-set maliste src -j DROP
Bloquer les pings de tous les pays sauf ceux de "maliste"
iptables -A INPUT -p icmp -m set ! --match-set maliste src -j DROP
Si votre serveur fait également du routage et du DNAT, utilisez FORWARD à la place de INPUT (dans les deux sens)
iptables -A FORWARD -p icmp -m set ! --match-set maliste src -j DROP
Si votre serveur fait également du routage et du DNAT, utilisez FORWARD à la place de INPUT (dans un seul sens)
iptables -A FORWARD -p icmp ! -s 192.168.222.0/24 -m set ! --match-set maliste src -j DROP
Comment lancer la protection au démarrage Le contenu de la table "maliste" est supprimé automatiquement en cas de redémarrage du serveur. Il faut donc la reconstruire avant d'utiliser iptables pour cela, j'utilise le fichier /etc/rc.local (à créer s'il n'existe pas) :
- RAZ ipset
ipset flush maliste
- Création de la liste
ipset create maliste hash:net for S in $(cat /opt/cn.zone) do
ipset add maliste $S
done for S in $(cat /opt/ru.zone) do
ipset add maliste $S
done
- RAZ filters
iptables -F iptables -X iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT
- RAZ nat
iptables -t nat -F iptables -t nat -X iptables -t nat -P INPUT ACCEPT iptables -t nat -P OUTPUT ACCEPT iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT
- Règle(s) de Firewall
iptables -A INPUT -p icmp -m set --match-set maliste src -j DROP
Rappel
Ne pas oublier que les rêgles NAT d'iptables sont lancés avant les règles de filtrage du firewall. Il faut donc en tenir compte