Prise en main de netfilter / iptables
Netfilter est un cadriciel (framework) implémentant un pare-feu au sein du noyau Linux à partir de la version 2.4 de ce dernier. Il est principalement utilisé pour implémenter un pare-feu dans les systèmes d'exploitation Linux.
Les outils de gestion de Netfilter sont :
- iptables ;
- nftables ;
- firewalld ;
- UFW (Uncomplicated Firewall) ;
- shorewall.
Dans cet atelier, nous mettrons l'accent sur iptables qui est un firewall logiciel installé en standard sur de nombreuses distributions GNU/Linux récentes (kernel 2.4.x. ou supérieur).
Les tables iptables
Il est composé de principalement trois tables :
- NAT (Pour les translation d'adresses ou translation de ports) ;
- FILTER (Pour la gestion du filtrage de paquets entrants, sortants et transversaux) c'est la table par défaut si l'on ne précise rien ;
- MANGLE (Contient des règles pour la modification des paquets) ;
Note : Nous mettrons l'accent sur les tables NAT & FILTER
Les chaines iptables
Chaque tables dispose de ses chaines :
La table NAT
- PREROUTING (Utilisé pour le port Forwarding)
- POSTROUTING (Souvent utilisé pour la translation d'adresses réseau) ;
- OUTPUT
La table FILTER
- INPUT
- OUTPUT
- FORWARD
Les actions
Chaque table dispose également de ses actions
NAT
- SNAT (Souvent utilisé pour faire du NAT statique) ;
- DNAT (Souvent utilisé pour faire du port forwarding);
- MASQUERADE (Souvent utilisé pour faire du PAT).
FILTER
- ACCEPT (Autoriser le trafic) ;
- REJECT ( Rejeter le trafic)
- DROP (ignorer tout simplement le trafic)
Mise en œuvre
Avant de faire quoique ce soit avec iptables, il faut autoriser le transfert de paquets d'interface en interface.
# nano /etc/sysctl.conf
/image%2F3625927%2F20240408%2Fob_077d32_22.png)
# sysctl -p
Il est par défaut installé sur votre machine. Si ce n'est pas le cas, faites ceci :
# apt update ; apt install iptables -y
Vérification du statut
/image%2F3625927%2F20240408%2Fob_59fdd2_1.png)
Autoriser le trafic entrant sur l'interface loopback
# sudo iptables -A INPUT -i lo -j ACCEPT
/image%2F3625927%2F20240408%2Fob_22ac18_2.png)
Acception des connexions HTTP , SSL et SSH
# sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Filtrage basé sur la source
Nous allons ignorer (DROP) tout le trafic de la machine dont l'adresse est : 192.168.10.31
/image%2F3625927%2F20240408%2Fob_369248_3.png)
Pour supprimer la règle, il suffit de remplacer le -A par -D
# sudo iptables -D INPUT -s 192.168.10.31 -j DROP
/image%2F3625927%2F20240408%2Fob_ff8565_4.png)
Pour rejeter au lieu d'ignorer les paquets de la machine 192.168.10.31 , on fait ceci :
Et ça n'aura pas le même effet.
# sudo iptables -A INPUT -s 192.168.10.31 -j REJECT
/image%2F3625927%2F20240408%2Fob_42016b_5.png)
Que remarquez-vous ?
Rejeter des paquets à partir d'une plage d'adresses (un range).
Dans ce cas, nous devons utiliser le module iprange avec l’option -m et spécifier la plage d’adresses IP avec --src-range.
Par exemple : Ignorer le trafic des machines de la plage 192.168.1.100 à 192.168.1.110
# sudo iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.110 -j DROP
Pour supprimer toutes les règles définies au initialement, très simple :
# iptables -F
Rejeter le trafic non autorisé
Il est important de DROP tout autre trafic après avoir défini les règles, car cela empêche les accès non autorisés au serveur à partir d’autres ports ouverts. C’est l’équivalent sous cisco de mettre ceci à la fin d’une ACL étendue autorisant du trafic : access-list 100 deny ip any any
Note : Il faut tout d’abord autoriser tout trafic que vous aimeriez sur le serveur avant de fermer la porte au reste du trafic non autorisé
# sudo iptables -A INPUT -j DROP
Par exemple : N'autoriser que le trafic de la machine 192.168.10.56 et refuser tout le reste.
# iptables -A INPUT -s 192.168.10.56 -j ACCEPT
# iptables -A INPUT -j DROP
A ce stade, le serveur ne recevra que le trafic de cette machine, et refusera tout autre trafic.
/image%2F3625927%2F20240408%2Fob_c59c85_6.png)
Une autre machine va tenter d'émettre du trafic vers ce serveur
/image%2F3625927%2F20240408%2Fob_9f4c25_7.png)
C'est clair !!
Pour afficher la liste des règles accompagnées de numéro :
# sudo iptables -L --line-numbers
/image%2F3625927%2F20240408%2Fob_d7548b_8.png)
Si nous voulons par exemple supprimer la règle N°2, on procède comme suit :
# iptables -D INPUT 2
Filtrage à travers les ports
ça se fait avec le paramètre --dport
Refuser uniquement les connexions SSH provenant de la machine 192.168.10.31 en impactant pas d’autres trafics provenant de cette machine.
Sur le serveur
/image%2F3625927%2F20240408%2Fob_5f923a_9.png)
Testons les services & trafics provenant de la machine 192.168.10.31 vers notre serveur
- ICMP
/image%2F3625927%2F20240408%2Fob_8c7ef3_10.png)
- SSH
/image%2F3625927%2F20240408%2Fob_5b41bd_11.png)
- TELNET
/image%2F3625927%2F20240408%2Fob_19253c_12.png)
Remarque : Tous les services sont autorisés en provenant de la machine 192.168.10.31 sauf SSH.
Expérimentation du PAT
Architecture
/image%2F3625927%2F20240408%2Fob_caa38a_13.png)
Nous avons un Firewall qui fera office de passerelle pour la VM DNS-2 (172.16.0.1/24) qui est un client dans le LAN.
Il a accès à internet
/image%2F3625927%2F20240408%2Fob_8cd6e4_15.png)
Translation
# iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -o eth0 -j MASQUERADE
/image%2F3625927%2F20240408%2Fob_23e301_17.png)
Résultat
/image%2F3625927%2F20240408%2Fob_29432b_18.png)
Expérimentation du port Forwaring
Nous allons utiliser la même architecture pour rediriger toutes les connexions Telnet vers la machine du LAN (172.16.0.1).
Voici la config IP du Firewall
/image%2F3625927%2F20240408%2Fob_740871_14.png)
La règles
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 23 -j DNAT --to-destination 172.16.0.1 :23
en clair :
/image%2F3625927%2F20240408%2Fob_0c26ec_19.png)
Test
/image%2F3625927%2F20240408%2Fob_2c4103_20.png)
Résultat
/image%2F3625927%2F20240408%2Fob_25f5f1_21.png)
Pour tester la config, on s’est adressé à l'interface WAN du Firewall (192.168.10.73) sur un port bien précis, qui a ensuite redirigé la connexion sur la machine concernée dans le LAN. C’est ça le port forwarding.
Comment Netfilter fait-il pour savoir qu'un paquet est une réponse à un paquet autorisé précédemment ?
Le noyau maintient une table qui enregistre toutes les sessions.
Quand un paquet arrive sur une interface, Netfilter regarde sur l'en-tête IP afin de voir si ce paquet fait partie d'une session connue. En fonction du cas, il détermine l'état du paquet parmi les cas suivants :
- NEW : le paquet n'est lié à aucune session.
- ESTABLISHED : la session existe au niveau du protocole de la couche transport comme une session TCP.
- RELATED : la session existe de façon relative à une autre, par exemple une session FTP ou le pong qui vient après le ping.
- INVALID : la session est invalide et ne rentre dans aucun des cas cités au-dessus
De cette manière, la phrase « J'autorise les paquets étant des réponses de quelque chose que j'ai déjà autorisé avant » est traduite en « J'autorise les paquets avec l'état NEW et/ou ESTABLISHED à passer le pare-feu ».
Architecture
/image%2F3625927%2F20240414%2Fob_3f216e_1.png)
Ici le but est de filtrer le trafic entre les deux réseaux de part et d’autre du Firewall. Il faudra permettre au PC1 d’envoyer des requêtes vers l’autre réseau, tout en interdisant le sens inverse.
Prérequis : S'assurer que la variable net.ipv4.ipforward est à 1
Nous allons autoriser PC1 à communiquer avec les PC-2 & PC-3, mais interdire l’inverse
Il faut tout d’abord activer le suivit de connexion
# iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Autoriser maintenant la connexion du réseau PC1 vers l’autre réseau
# iptables -A FORWARD -i enp0s3 -o enp0s8 -j ACCEPT
Refuser la connexion du réseau de PC2 vers celui de PC1
# iptables -A FORWARD -i enp0s8 -o enp0s3 -j REJECT
Test
Depuis PC1 vers PC2 & PC3
/image%2F3625927%2F20240414%2Fob_98483c_3.png)
Le sens inverse
/image%2F3625927%2F20240414%2Fob_44ac9d_4.png)
Nous pouvons après fermer la porte à tout autre trafic non autorisé
# iptables -D INPUT -j DROP
Ce principe peut être appliqué à une architecture DMZ !!!
Comment sauvegarder les règles iptables ?
En cas de redémarrage de votre serveur, vous risquez de perdre ces règles définies. Pour éviter cela, il faut les sauvegarder. Cela se fait avec l'utilitaire iptables-save comme suit :
iptables-save > /root/rules
Restauration des règles iptables
iptables-restore < /root/rules
Note : rules est un fichier de choix. Vous pouvez choisir autre chose.
iptables est un pare-feu extrêmement puissant s'il est bien exploité !!