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èglesnft -a list ruleset
: affichage de l'ensemble des règles avec l'identifiant des objetsnft flush ruleset
: suppression de l'ensemble des règles
Tables
Syntaxe
Ajout d'une table | |
---|---|
Commande | nft add table nomfamille nomtable |
Paramètres |
|
Suppression d'une table | |
---|---|
Commande | nft delete table nomfamille nomtable |
Paramètres |
|
Liste des tables, chaines et règles | |
---|---|
Commande | nft -a list tables famille |
Paramètres |
|
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 |
|
Suppression d'une chaîne | |
---|---|
Commande | nft delete chain familletable nomtable nomchaine |
Paramètres |
|
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 |
|
Ajout d'une règle à un endroit précis | |
---|---|
Commande | nft add rule nomtable nomchaine position pos paramètres |
Paramètres |
|
Suppression d'une règle | |
---|---|
Commande | nft delete rule nomtable nomchaine handle idregle |
Paramètres |
|
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