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.