Table des matières

, , , , , , ,

:DEPRECATED:

Sur les distributions récentes, nftables remplace iptables. Voir la note bloquer temporairement des IP avec nftables.

iptables: Bloquer des adresses IP indésirables

Il est parfois nécessaire de bloquer des adresses IP avec lesquelles le système Linux communique par défaut: on peut vouloir bannir certains hôtes ayant tenté des attaques contre le système par exemple.

Sous Linux bannir une adresse IP individuellement peut se faire simplement via la commande iptables

sudo iptables -A INPUT -s 1.1.1.1 -p TCP -j DROP
 
# Pour bannir un bloc d'adresses ou un réseau
sudo iptables -A INPUT -s 1.1.2.0/24 -p TCP -j DROP

Cependant si l'on cherche à bannir un millier d'adresses n'ayant pas de préfixe CIDR commun, il nous faudra créer un millier de règles via iptables.

IP sets

Les IP sets (ou ensembles IP) permettent de répondre précisément à cette problématique. Ce sont des groupes d'éléments (des IP, des adresses MAC, ou ports indépendants) encodés et stockés dans des structures de données de type tables de hachage exploitables efficacement par netfilter.

Une fois l'ensemble créé, il peut être utilisé par les règles iptables.

Installer le paquet ipset via le gestionnaire de paquetage:

sudo apt-get install ipset

Créer l'ensemble

On commence par créer un nouvel ensemble, ici on le nomme “set_banished_net”:

sudo ipset create set_banished_net hash:net

L'argument hash:net est obligatoire, il indique le type d'ensemble à créer. Il existe de nombreux types d'ensembles. Le type hash:net utilise une table de hachage pour stocker de multiples blocs d'adresses CIDR. Pour stocker des adresses individuelles dans un ensemble, on pourra utiliser hash:ip.

sudo ipset create set_banished_ip hash:ip

Par défaut un ensemble compte 65536 éléments. Cette valeur peut être modifiée via l'argument maxelem:

sudo ipset create set_banished_ip hash:ip maxelem 1000000

Pour lister les ensembles définis:

sudo ipset list

Pour ajouter un élément dans un ensemble:

sudo ipset add set_basnished_net 1.1.1.1/32
sudo ipset add set_basnished_net 1.1.2.0/24
 
sudo ipset add set_banished_ip 93.186.198.153

Pour supprimer un élément de l'ensemble:

sudo ipset del set_banished_ip 93.186.198.153

Créer le filtre netfilter

Maintenant que l'ensemble est définit, on peut créer la règle de filtrage via iptables qui bloque les IP appartenant à cet ensemble, pour cela il faut utiliser les arguments -m set --match-set <set_name> :

sudo iptables -I INPUT -m set --match-set set_banished_ip src -p tcp -j LOG --log-level info --log-prefix="ACTION=BANISHED "
sudo iptables -I INPUT 2 -m set --match-set set_banished_ip src -p tcp -j DROP

Filtres avec Docker

Si le serveur s'appuie sur Docker pour fournir certains services, il faut aussi ajouter les filtres dans la chaîne DOCKER-USER:

sudo iptables -I DOCKER-USER -m set --match-set set_banished_ip src -p tcp -j LOG --log-level info --log-prefix="ACTION=BANISHED "
sudo iptables -I DOCKER-USER 2 -m set --match-set set_banished_ip src -p tcp -j DROP

Sauvegarde et restauration d'un ensemble

Il est possible d'exporter/sauvegarder un ensemble dans un fichier texte:

sudo ipset save set_banished_ip -f banished_ip.txt

Pour supprimer un set existant:

sudo ipset destroy set_banished_ip
Un ensemble ne pourra pas être supprimé s'il est en cours d'utilisation par une règle de filtrage.

Pour recréer un ensemble via le fichier d'export:

sudo ipset restore -f banished_ip.txt

Automatiser le bannissement

Références