Bloquer le trafic ICMP sous Linux avec iptables

CompTIABeginner
Pratiquer maintenant

Introduction

Dans cet atelier, vous allez apprendre à utiliser iptables, un puissant utilitaire de pare-feu en ligne de commande sous Linux, pour bloquer le trafic ICMP entrant. Vous configurerez une règle de pare-feu pour rejeter (drop) les paquets du protocole ICMP, qui est couramment utilisé par la commande ping pour tester la connectivité réseau. Il s'agit d'une compétence fondamentale pour sécuriser un système Linux en contrôlant l'accès au réseau au niveau du protocole.

Vous commencerez par effectuer un scan réseau préliminaire avec nmap afin d'évaluer les ports ouverts du système. Ensuite, vous établirez une base de référence en utilisant ping pour vérifier que le trafic ICMP est initialement autorisé. Le cœur de l'atelier consistera à créer et à appliquer une règle iptables spécifique pour rejeter tous les paquets ICMP entrants. Enfin, vous vérifierez que la règle est active et testerez son efficacité en tentant de pinger à nouveau votre machine, confirmant ainsi que les requêtes sont désormais bloquées avec succès.

Rechercher les ports TCP et UDP ouverts avec nmap

Dans cette étape, vous apprendrez à utiliser l'outil nmap pour scanner votre propre système à la recherche de ports réseau ouverts. Les ports réseau sont les points de terminaison de la communication dans un système d'exploitation. Lorsqu'un programme souhaite recevoir des informations du réseau, il « écoute » sur un port spécifique. La recherche de ports ouverts est une première étape fondamentale dans l'évaluation de la sécurité d'une machine, car chaque port ouvert représente un point d'entrée potentiel pour un attaquant.

Tout d'abord, vous devez installer nmap, car il n'est pas inclus dans l'environnement de base. Il est de bonne pratique de mettre à jour votre liste de paquets avant d'installer de nouveaux logiciels.

Exécutez la commande suivante pour mettre à jour la liste des paquets :

sudo apt-get update

Maintenant, installez nmap en exécutant :

sudo apt-get install -y nmap

Vous devriez voir des messages indiquant que nmap et ses dépendances sont en cours d'installation.

Ensuite, vous devez trouver l'adresse IP de votre machine pour indiquer à nmap ce qu'il doit scanner. Vous pouvez la trouver en utilisant la commande ip.

ip addr show

Cherchez une entrée comme eth0 ou ens33. Votre adresse IP sera listée à côté de inet. Elle ressemblera à quelque chose comme 172.16.50.13/24.

Comment identifier votre adresse IP à partir du résultat :

  1. Recherchez l'interface dont l'état est state UP (généralement eth0).
  2. Trouvez la ligne qui commence par inet (et non inet6).
  3. Prenez uniquement la partie de l'adresse IP avant le / (par exemple, si vous voyez inet 172.16.50.13/24, votre adresse IP est 172.16.50.13).
  4. Ignorez l'interface de bouclage local (lo) avec l'IP 127.0.0.1.

Pour le reste de cet atelier, nous utiliserons <your_IP_address> comme indicateur pour votre adresse IP réelle.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:04:c3:1d brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.13/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159940sec preferred_lft 1892159940sec
    inet6 fe80::216:3eff:fe04:c31d/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:1d:45:49:f8 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

Vous êtes maintenant prêt à effectuer votre premier scan. Commençons par rechercher les ports TCP (Transmission Control Protocol) ouverts. Le TCP est un protocole orienté connexion utilisé pour de nombreux services courants comme SSH (port 22) et HTTP (port 80). L'option -sT de nmap effectue un scan de connexion TCP.

Important : Remplacez <your_IP_address> par l'adresse IP réelle que vous avez trouvée à l'étape précédente. Par exemple, si votre IP est 172.16.50.13, la commande sera nmap -sT 172.16.50.13.

Remplacez <your_IP_address> par votre IP et exécutez la commande :

nmap -sT <your_IP_address>

Le résultat listera les ports qui sont à l'état « open » (ouvert). Votre système aura probablement le port SSH (22) ouvert par défaut, et peut avoir d'autres services en cours d'exécution sur d'autres ports.

Starting Nmap 7.80 ( https://nmap.org ) at 2025-07-01 14:08 CST
Nmap scan report for iZrj93qpoj98oqswu96cqfZ (172.16.50.13)
Host is up (0.00013s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
3000/tcp open  ppp
3001/tcp open  nessus

Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds

Ensuite, scannons les ports UDP (User Datagram Protocol). L'UDP est un protocole sans connexion utilisé pour des services comme le DNS (port 53) et le DHCP (port 67/68). Les scans UDP peuvent être plus lents et moins fiables que les scans TCP. L'utilisation de sudo donne de meilleurs résultats pour les scans UDP. L'option -sU indique à nmap d'effectuer un scan UDP.

Rappel : Remplacez <your_IP_address> par votre adresse IP réelle.

Remplacez <your_IP_address> par votre IP et exécutez la commande :

sudo nmap -sU <your_IP_address>

Le résultat peut afficher des ports comme open|filtered. Cela signifie que nmap ne peut pas déterminer si le port est ouvert ou si un pare-feu bloque le scan. C'est un résultat courant pour les scans UDP.

Starting Nmap 7.80 ( https://nmap.org ) at 2025-07-01 14:09 CST
Nmap scan report for iZrj93qpoj98oqswu96cqfZ (172.16.50.13)
Host is up (0.0000060s latency).
Not shown: 998 closed ports
PORT     STATE         SERVICE
68/udp   open|filtered dhcpc
5353/udp open|filtered zeroconf

Nmap done: 1 IP address (1 host up) scanned in 1.29 seconds

En terminant ces scans, vous avez identifié avec succès les services qui écoutent les connexions réseau sur votre machine.

Vérifier la connectivité réseau initiale avec ping

Dans cette étape, vous utiliserez la commande ping pour vérifier que votre système répond aux requêtes réseau avant de mettre en place des règles de pare-feu. La commande ping envoie des paquets ICMP (Internet Control Message Protocol) de type « echo request » à un hôte cible. Si l'hôte est joignable et configuré pour répondre, il renverra un paquet « echo reply ». C'est une méthode fondamentale pour tester la connectivité réseau de base.

Avant de créer une règle de pare-feu pour bloquer ce type de trafic, nous devons d'abord confirmer que le trafic est actuellement autorisé. Cela garantit que lorsque nous testerons notre règle plus tard, nous pourrons être certains que c'est la règle qui cause le blocage, et non un autre problème réseau préexistant.

Nous allons pinger l'adresse de bouclage (loopback), 127.0.0.1. Cette adresse IP spéciale pointe toujours vers votre propre machine, ce qui vous permet de tester la pile réseau locale sans avoir besoin d'une connexion externe ni même de connaître l'adresse IP assignée à votre machine.

Pour envoyer seulement quatre paquets puis s'arrêter, nous utiliserons l'option -c 4. C'est important car, sans cela, ping s'exécuterait indéfiniment jusqu'à ce que vous l'arrêtiez manuellement avec Ctrl+C.

Ouvrez votre terminal et exécutez la commande suivante :

ping -c 4 127.0.0.1

Vous devriez voir un résultat indiquant que quatre paquets ont été envoyés et quatre ont été reçus, ce qui signifie que votre système répond correctement aux requêtes ICMP.

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.055 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.052 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.053 ms

--- 127.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3070ms
rtt min/avg/max/mdev = 0.045/0.051/0.055/0.003 ms

La ligne 0% packet loss confirme que la connexion fonctionne parfaitement. Maintenant que vous avez établi une base de référence, vous êtes prêt à configurer une règle de pare-feu pour bloquer ce type précis de communication.

Créer une règle iptables pour rejeter les paquets ICMP

Dans cette étape, vous allez configurer une règle de pare-feu simple à l'aide d'iptables, l'utilitaire standard en ligne de commande pour gérer les règles de filtrage de paquets réseau dans le noyau Linux. Nous allons créer une règle pour bloquer le trafic ICMP que vous avez précédemment testé avec la commande ping.

iptables fonctionne avec un système de tables, de chaînes et de règles.

  • Tables : Ce sont des collections de chaînes destinées à un usage spécifique. La table la plus couramment utilisée est filter, qui est la table par défaut utilisée pour le filtrage des paquets.
  • Chaînes : Ce sont des listes de règles qui sont vérifiées dans l'ordre. Pour le trafic entrant, la chaîne INPUT est utilisée.
  • Règles : Une règle spécifie des critères pour un paquet (comme son protocole ou son adresse source) et une cible (ce qu'il faut faire du paquet, par exemple, ACCEPT ou DROP).

Tout d'abord, examinons l'ensemble actuel des règles. Comme iptables modifie les paramètres du noyau, vous devez utiliser sudo. L'option -L liste les règles de la table par défaut filter.

sudo iptables -L

Vous verrez les trois chaînes par défaut : INPUT, FORWARD et OUTPUT. Dans cet environnement, vous remarquerez peut-être que Docker a déjà créé certaines règles dans la chaîne FORWARD et ajouté des chaînes personnalisées pour le réseau des conteneurs. Les chaînes INPUT et OUTPUT utilisent toujours la politique par défaut ACCEPT pour le trafic normal.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-USER  all  --  anywhere             anywhere
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (1 references)
target     prot opt source               destination

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Maintenant, ajoutons une règle pour bloquer les paquets ICMP entrants. Nous allons ajouter (-A pour append) une nouvelle règle à la chaîne INPUT.

La commande est construite comme suit :

  • sudo iptables : La commande pour gérer le pare-feu.
  • -A INPUT : Ajoute une règle à la fin de la chaîne INPUT.
  • -p icmp : Cette règle s'applique aux paquets utilisant le protocole icmp.
  • -j DROP : Si un paquet correspond, on saute vers la cible DROP, qui rejette silencieusement le paquet sans envoyer de réponse.

Exécutez la commande suivante pour créer la règle :

sudo iptables -A INPUT -p icmp -j DROP

Cette commande ne produira aucun résultat si elle réussit. Vous avez maintenant ordonné au pare-feu du noyau de rejeter tous les paquets ICMP entrants provenant de n'importe quelle source.

Vérifier la règle de pare-feu et tester le blocage

Dans cette dernière étape, vous allez confirmer que votre nouvelle règle de pare-feu a été ajoutée avec succès, puis tester son effet en tentant de pinger à nouveau votre système. Ce processus de vérification est crucial en administration réseau pour s'assurer que les politiques de sécurité sont correctement implémentées.

Tout d'abord, affichons à nouveau la liste des règles pour voir votre nouvel ajout. En exécutant la même commande que précédemment, vous pouvez voir l'état actuel du pare-feu.

sudo iptables -L

Vous devriez maintenant voir votre nouvelle règle listée sous la chaîne INPUT. Le résultat montre clairement que les paquets correspondant au protocole icmp seront envoyés vers la cible DROP.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       icmp --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Maintenant que vous avez confirmé que la règle est en place, testons-la. Exécutez la même commande ping qu'à l'étape 2.

ping -c 4 127.0.0.1

Cette fois, vous ne recevrez aucune réponse. La commande semblera se figer pendant quelques secondes puis s'arrêtera. Le résultat affichera 100% packet loss. C'est le comportement attendu car le pare-feu du noyau rejette désormais silencieusement les paquets ICMP entrants, comme vous l'avez demandé.

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

--- 127.0.0.1 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3055ms

Vous avez réussi à bloquer le trafic ICMP ! Les règles que vous créez avec iptables ne sont pas persistantes et seront effacées lors d'un redémarrage du système. Cependant, il est de bonne pratique de savoir comment supprimer une règle manuellement. Vous pouvez le faire en utilisant le drapeau -D (delete), en spécifiant exactement la même règle que celle que vous avez ajoutée.

Supprimons la règle pour rétablir la connectivité.

sudo iptables -D INPUT -p icmp -j DROP

Pour confirmer que la règle a disparu et que la connectivité est rétablie, exécutez ping une dernière fois.

ping -c 2 127.0.0.1

Le ping devrait maintenant réussir, confirmant que vous avez supprimé avec succès la règle de pare-feu.

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.058 ms

--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1024ms
rtt min/avg/max/mdev = 0.048/0.053/0.058/0.005 ms

Résumé

Dans cet atelier, vous avez appris à effectuer une reconnaissance réseau initiale sur un système Linux. Vous avez commencé par installer l'outil nmap pour rechercher les ports TCP et UDP ouverts après avoir identifié l'adresse IP de la machine. Ensuite, vous avez établi une base de référence pour la connectivité réseau en utilisant la commande ping, qui a confirmé que le système recevait et répondait correctement au trafic ICMP.

Le cœur de l'atelier a consisté à utiliser l'utilitaire de pare-feu iptables pour manipuler le trafic réseau. Vous avez construit et appliqué une règle spécifique à la chaîne INPUT pour rejeter (DROP) tous les paquets ICMP entrants, bloquant ainsi efficacement des outils comme ping. Pour terminer le processus, vous avez vérifié que la nouvelle règle était active en listant le jeu de règles iptables actuel, puis vous avez testé le blocage en tentant de pinger à nouveau la machine, confirmant que les requêtes échouaient désormais comme prévu.