Prise en main de netfilter / iptables

Publié le par BORY DIALLO

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

# 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

Autoriser le trafic entrant sur l'interface loopback

# sudo iptables -A INPUT -i lo -j ACCEPT

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

Pour supprimer la règle, il suffit de remplacer le -A par -D

# sudo iptables -D INPUT -s 192.168.10.31 -j DROP

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

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.

Une autre machine va tenter d'émettre du trafic vers ce serveur 

C'est clair !!

Pour afficher la liste des règles accompagnées de numéro :

# sudo iptables -L --line-numbers

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

Testons les services & trafics provenant de la machine 192.168.10.31 vers notre serveur

  • ICMP
  • SSH
  • TELNET

Remarque : Tous les services sont autorisés en provenant de la machine 192.168.10.31 sauf SSH.

Expérimentation du PAT

Architecture

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

Translation

# iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -o eth0 -j MASQUERADE

Résultat

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

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 :

Test

Résultat

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

 

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

 

Le sens inverse

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é !! 

Publié dans Sécurité

Pour être informé des derniers articles, inscrivez vous :
Commenter cet article