titre informatique

Présentation

Netfilter, le pare-feu intégré au noyau Linux, peut se configurer avec trois interfaces en ligne de commandes :

  • UFW (Uncomplicated FireWall), simple mais moins complet que les autres commandes ;
  • iptables, plus complexe et complet qu'UFW, mais commençant à dater ;
  • nftables, successeur plus optimisé d'iptables.

 

Principaux généraux

 

Les tables

Les tables sont des objets contenant des chaines (groupes de règles). Une table appartient à une famille :

  • Famille ip : filtrage IPv4 (famille par défaut) ;
  • Famille ipv6 : filtrage IPv6 ;
  • Famille inet : filtrage IPv4 et IPv6 ;
  • Famille arp : filtrage ARP ;.
  • Famille bridge : filtrage pour les ponts.

 

Les chaines

Les chaînes continent les règles du pare-feu et sont attachées à des crochets (hook en anglais). Un crochet correspond à un point précis du chemin des données à travers la machine. Tous les crochets ne sont pas disponibles pour toutes les tables :

 Principaux crochets  Famille de table  Rôle
prerouting bridge, ip, ipv6, inet  Paquets arrivant sur la machine
postrouting bridge, ip, ipv6, inet Paquets quittant la machine 
forward bridge, ip, ipv6, inet  Paquets routés
input arp, bridge, ip, ipv6, inet Paquets à destination de la machine 
output arp, bridge, ip, ipv6, inet  Paquets émis par la machine

Une chaine possède également un type (supporté par certaines familles de table), correspondant à l'action à réaliser sur les paquets.

Principaux types  Famille de table  Rôle
filter arp, bridge, ip, ipv6, inet Filtrage de paquets 
nat ip, ipv6, inet   Translation d’adresse
route ip, ipv6, inet  Routage de paquets 

 

Les règles

Les règles correspondent aux actions à appliquer sur les données arrivant et/ou sortant de la machine. Elles sont stockées dans les chaînes qui indiqueront à quel moment elles seront appliquées lors du chemin des données dans la machine. Comme pour toutes les règles de pare-feu, les règles dans nftables sont ordonnées et se configurent essentiellement avec les paramètres suivants :

  • Le protocole (IP, TCP, UDP) ;
  • Des paramètres d’entrée (interface, adresse, port) ;
  • Des paramètres de sortie (interface, adresse, port) ;
  • Une action (accepter, bloquer).

 

Commandes

 

Général
  • nft list ruleset : affichage de l'ensemble des règles
  • nft -a list ruleset : affichage de l'ensemble des règles avec l'identifiant des objets
  • nft flush ruleset : suppression de l'ensemble des règles

 

Tables
Syntaxe
Ajout d'une table
 Commande  nft add table nomfamille nomtable
 Paramètres
  •  nomfamille : famille de la table
  • nomtable : nom de la table
Suppression d'une table
 Commande  nft delete table nomfamille nomtable
 Paramètres
  •  nomfamille : famille de la table
  • nomtable : nom de la table
Liste des tables, chaines et règles
 Commande  nft -a list tables famille
 Paramètres
  •  -a : affichage des identifiants des objets (facultatif)
  • familletable : famille des tables à afficher (facultatif)
Exemples
  • Création d'une table nommée ma_table de la famille ip : nft add table ip ma_table
  • Suppression de la table ma_table de la famille ip : nft delete table ip ma_table

 

Chaînes
Syntaxe
Ajout d'une chaîne
 Commande  nft add chain familletable nomtable nomchaine { type nomtype hook nomcrochet priority valeurpriorite \; }
 Paramètres
  • familletable : famille de la table où enregistrer la chaîne
  • nomtable : nom de la table où enregistrer la chaîne
  • nomchaine : nom de la chaîne
  • nomtype : type de la chaîne
  • nomcrochet : crochet de la chaîne
  • valeurpriorite : nombre entier indiquant l'ordre d'execution de la chaîne (de la valeur la plus basse à la plus haute)
Suppression d'une chaîne
 Commande  nft delete chain familletable nomtable nomchaine
 Paramètres
  • familletable : famille de la table où se trouve la chaîne à supprimer
  • nomtable : nom de la table où se trouve la chaîne à supprimer
  • nomchaine : nom de la chaine à supprimer
Exemples
  • Ajout dans la table ip ma_table d'une chaine nommée ma_chaine de famille filter contenant des règles s'appliquant à l'arrivée des paquets sur la machine et de priorité 100 : nft add chain ip ma_table ma_chaine { type filter hook prerouting priority 100 \; }
  • Suppression de la chaine ma_chaine se trouvant dans la table ip ma_table : nft delete chain ip ma_table ma_chaine

 

Règles
Syntaxe
Ajout d'une règle
 Commande  nft add rule nomtable nomchaine paramètres
 Paramètres
  • nomtable : nom de la table où enregistrer la chaîne
  • nomchaine : nom de la chaîne
  • paramètres : paramètres de la règle
Ajout d'une règle à un endroit précis
 Commande  nft add rule nomtable nomchaine position pos paramètres
 Paramètres
  • nomtable : nom de la table où enregistrer la chaîne
  • nomchaine : nom de la chaîne
  • pos : numéro de la règle précédant la règle à ajouter
  • paramètres : paramètres de la règle
Suppression d'une règle
 Commande  nft delete rule nomtable nomchaine handle idregle
 Paramètres
  • nomtable : nom de la table où se trouve la chaîne à supprimer
  • nomchaine : nom de la chaine à supprimer
  • idregle : identifiant de la règle
Principaux paramètres de règle
ip / tcp / udp / icmp Protocole IP, TCP, UDP ou ICMP
iif Nom de l'interface d'entrée
saddr Adresse source
sport Port source
snat Translation d'adresse source
oif Nom de l'interface de sortie
daddr  Adresse de destination
dport  Port de destination
dnat Translation de l'adresse de destination
drop ou accept Bloquer ou Autoriser
masquerade Remplacement automatique de l'adresse source par l'adresse de sortie des données

Remarque : tous les paramètres ne peuvent pas s'utiliser avec tous les types de chaîne.

Exemples
  •  Ajout d'un règle dans la chaine ma_chaine (se trouvant dans la table ma_table) acceptant les requêtes HTTP en entrée : nft add rule ma_table ma_chaine tcp dport 80 accept
  • Ajout d'une règle dans la chaine ma_chaine (se trouvant dans la table ma_table) refusant les requêtes SSH en entrée de l'adresse 192.168.0.1 : nft add rule ma_table ma_chaine tcp daddr 192.168.0.1 dport 22 drop
  • Suppression de la règle 5 de la chaîne (se trouvant dans la table ma_table) : nft delete rule ma_table ma_chaine handle 5

 

Exemples de translations d'adresse

 

Translation d'adresse dynamique

Pour mettre en place un mécanisme de translation d'adresse dynamique permettant l'accès à Internet à des postes se trouvant dans un réseau privé, il faut ajouter une règle avec le paramètre masquerade dans une chaine de type nat attaché au crochet postrouting. Cette règle possédera au moins deux paramètres :

  • Le nom de l'interface de sortie (paramètre oif) ;
  • Le paramètre masquerade.

Il est évidemment possible d'être plus précis en utilisant d'autres paramètres.

Exemple de démarche (translation d'adresse dynamique avec un routeur dont la carte enp0s3 est connectée à un réseau public) :

  • Création d'une table nommée table_nat pour stocker les chaines : nft add table ip table_nat
  • Création d'une chaine nommée nat_dyn attachée au crochet postrouting, d'une priorité 100 et stockée dans la table table_nat : nft add chain ip table_nat nat_dyn { type nat hook postrouting priority 100 \; }
  • Ajout de la règle de translation d'adresse dynamique dans la chaine nat_dyn : nft add rule table_nat nat_dyn oif enp0s3 masquerade

Remarque : au lieu d'attribuer automatiquement l'adresse IP de la carte de sortie, il est possible de la définir manuellement avec le paramètre snat. Par exemple, pour attribuer à tous les paquets émis du réseau 192.168.1.0/24 l'adresse source 80.0.0.1 en sortie de la carte enp0s3, il faut utiliser la commande suivante : nft add rule table_nat nat_dyn ip saddr 192.168.1.0/24 oif enp0s3 snat to 80.0.0.1 (si vous avez créé une table nommée table_nat et une chaine nat_dyn de type nat et attachée au crochet postrouting).

 

Redirection d'adresse et de port

Pour rediriger des paquets IP vers une adresse IP et/ou un port différent, les règles doivent être ajoutées dans une chaîne de type nat et attachée au crochet prerouting. Cette règle peut avoir les paramètres suivants :

  • Le nom de l'interface d'entrée (paramètre iif) ;
  • Le protocole ;
  • Le port d'émission d'origine (paramètre dport) ;
  • L'adresse de destination translatée, parfois accompagnée du port translatée séparé par le caractère : (paramètre dnat).

Exemple de démarche (redirection des requêtes HTTP arrivant sur l'interface enp0s3 d'un routeur et renvoyée vers l'adresse locale 192.168.1.1 sur le port 8080) :

  • Création d'une table nommée table_nat pour stocker les chaines : nft add table ip table_nat
  • Création d'une chaine nommée redirection attachée au crochet prerouting, d'une priorité 100 et stockée dans la table table_nat : nft add chain ip table_nat redirection { type nat hook prerouting priority 100 \; }
  • Ajout de la règle de translation d'adresse dynamique dans la chaine nat_dyn : nft add rule table_nat redirection iif enp0s3 tcp dport 80 dnat 192.168.1.1:8080

 

Sauvegarde des règles

Il existe différentes solutions permettant de sauvegarder les règles saisies dans nftables et les recharger à chaque redémarrage du routeur. Voici une solution utilisant le service nftables qui lit au démarrage du système le contenu du fichier /etc/nftables.conf.

  • Activation du service nftables (à ne faire qu'une seule fois) : systemctl enable nftables ;
  • Exportation des règles dans le fichier /etc/nftables.conf (à faire chaque fois que vous souhaitez sauvegarder vos règles) : nft list ruleset > /etc/nftables.conf

 Remarque : après l'activation du service nftables, vous pouvez démarrer ce service (commande service nftables start). Démarrer ce service va lire le fichier /etc/ntables.conf qui possède par défaut une commande vidant l'ensemble des règles. Il n'est pas pertinent de démarrer de suite le service si vous avez déjà entré des règles avec nftables.

 

 Liens