Principe
Mes serveurs personnels sont uniquement utilisés en France ou en Europe. De plus, je remarque que de nombreuses attaques viennent de pays lointains. Il est donc nécessaire de réduire la surface d'attaque en n'autorisant que certains pays.
Pour cela il existe différentes solutions qui s'utilisent conjointement avec iptables :
- 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.