🕒 : 3 h maximum

  • Utilisation d’iptables le firewall de Linux qui permet de gérer et protéger une machine

ufw s’appuie sur iptables pour faire le firewall sous linux

Sur Linux, la véritable capacité de pare-feu vient du sous-système netfilter intégré au noyau. iptables est l’outil en ligne de commande qui dialogue directement avec netfilter, tandis que UFW (Uncomplicated Firewall) a été conçu pour faciliter la configuration d’iptables avec des commandes plus simples.

Dans ce tp on va s’intéresser à iptables .

Il faut récupèrer la salle du tp précèdent.

Avec m1 à m3 réseau R0 et m4 à m6 réseau R1


Nous disposons de m7 qui à iptables d’installé , le firewall linux !

Le protocole de ping « icmp » sous contrôle

m7 ou il y a iptables va bloquer les requêtes icmp et les rétablir .

on testera le ping de m7 depuis m1, m2 à m6

Pour interdire icmp (ping)

iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT

on peut vérifier les régles iptables avec l’option -L

root@m7:~# iptables -L                                                  
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     icmp --  anywhere             anywhere             icmp echo-request reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
root@m7:~# iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT
root@m7:~# iptables -L                                                  
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     icmp --  anywhere             anywhere             icmp echo-request reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Pour enlever la règle (Delete) , autoriser le ping

iptables -D INPUT -p icmp --icmp-type echo-request -j REJECT
root@m7:~# iptables -D INPUT -p icmp --icmp-type echo-request -j REJECT
root@m7:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
root@m7:~# 

Pourquoi interdire le protocole icmp sur une machine (en cybersécurité)

iptables possède des règles, OUTPUT (SORTIE), INPUT (ENTREE) et FORWARD (a travers)

root@m7:~# iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT
root@m7:~# iptables -L OUTPUT 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
root@m7:~# iptables -L INPUT 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     icmp --  anywhere             anywhere             icmp echo-request reject-with icmp-port-unreachable
root@m7:~# iptables -L FORWARD 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
root@m7:~# 

on voit ici qu’une règle en entrée concernant icmp est rejetée !

ssh vers m7

Nous allons nous connecter sur m7 depuis m1 à m6, on va se concentrer sur m1

machine m7

sur la machine m7 vérifier que le service sshd est bien activé ! (serveur ssh)

root@m7:~# systemctl status ssh    
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2026-03-30 11:09:33 CEST; 1h 23min ago
       Docs: man:sshd(8)
             man:sshd_config(5)
    Process: 506 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
   Main PID: 509 (sshd)
      Tasks: 1 (limit: 1115)
     Memory: 6.6M
        CPU: 779ms
     CGroup: /system.slice/ssh.service
             └─509 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups

on voit ici que c’est ok !

machine m1 ou mx !

les machines m1 à m6 sont de simple cliente et doit disposer de ssh client , le cas de m6 ci-dessous

# on utilise la fonction whereis 
whereis ssh # et on vois que le client ssh est bien disponible

bloquons m6

root@m7:~# iptables -A INPUT -s 192.168.1.6 -p tcp --dport 22 -j DROP
root@m7:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     icmp --  anywhere             anywhere             icmp echo-request reject-with icmp-port-unreachable
DROP       tcp  --  192.168.1.6          anywhere             tcp dpt:ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
root@m7:~# 

pour supprimer cette règle:

iptables -D INPUT -s 192.168.1.6 -p tcp --dport 22 -j DROP

une autre possibilité d’enlever les règles par ligne

iptables -L INPUT --line-numbers -n  # en déduire le numéro de ligne 
iptables -D INPUT <numéro>  # supprimer la règle 
Faire un test et proposer des exemples

Bloquer une ip

iptables -A INPUT -s 192.168.1.6 -j DROP

Autoriser internet sur tous les postes (nat)

Pour permettre le partage internet il faut activer le bit de net.ipv4.ip_forward=1

sysctl -w net.ipv4.ip_forward=1

pour le rendre définitif à chaque reboot

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

ou dé-commenter la ligne du fichier /etc/sysctl.conf

iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE

tester et valider votre partage

Autoriser le partage internet que sur R0

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o enp0s3 -j MASQUERADE

Autoriser le partage internet que sur R1

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o enp0s3 -j MASQUERADE

Vérifier les règles , et supprimer la règle autorisant R0 à accéder à internet.

root@m7:~# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o enp0s3 -j MASQUERADE  # R0  pas R1
root@m7:~# iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    1    84 MASQUERADE  all  --  *      enp0s3  192.168.0.0/24       0.0.0.0/0           
root@m7:~# iptables -t nat -D POSTROUTING 1
root@m7:~# iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
root@m7:~# 

Bloquer sur le réseau local une adresse MAC

iptables -A INPUT -m mac --mac-source XX:XX:XX:XX:XX:XX -j DROP

Tester de bloquer la mac adresse de la machine m2

Sauvegarder les règles iptables

Sous Debian il est plus simple d’utiliser iptables-persistent :

# Debian / Ubuntu
apt update
apt install iptables-persistent

quand on veut mettre à jour les règles qui sont activées sur la machine il existe la commande : netfilter-persistent save

netfilter-persistent save

Quelques scripts pour aller plus vite et faire des tests

mettre net.ipv4.ip_forward=1
sysctl -w net.ipv4.ip_forward=1
partage internet pour tout le réseau local

iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE

partage internet pour R0 seulement
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o enp0s3 -j MASQUERADE
partage internet pour R1 seulement
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o enp0s3 -j MASQUERADE
liste des POSTROUTING nat
iptables -t nat -L POSTROUTING -n --line-numbers
effacer la ligne 1 postrouting
iptables -t nat -D POSTROUTING 1

La machine m7 à la fin est opérationnelle :

Le bit net.ipV4_ip_forward est toujours à 1 (passerelle)

Et le partage nat d’internet est bien réalisé .