Nftables
Nftables est le successeur d'Iptables. Il a la particularité principale d'être plus complexe à configuré (comme à peu près tout les nouveaux logiciels libre... C'est une tendance déplorable...).
Heureusement, il existe une méthode pour traduire les règles Iptables en règles Nftables. Ceci viendra combler la pauvreté tiers-mondiste de la documentation officielle.
Par défaut, Nftables est vide de toute règle (comme son prédécesseur) mais également de toute table (on sent donc tout de suite venir la merde de la non standardisation et donc de la difficulté de développer des outils comme fail2ban par exemple...).
Utilisation native
Il existe trois façons de configurer Nftables:
- Via la commande
nft
se comportant comme la commandeiptables
- Via un shell interactif accessible via la commande
nft -i
- Via un fichier de configuration:
/etc/nftables.conf
Il est à noter que Nftables intègre de base le concept de persistance des règles à condition d'utiliser la troisième méthode (celle du fichier de configuration). Les règles seront donc chargées automatiquement au démarrage par le service nftables.service
.
Listage
Lister les tables
nft list tables
Lister les chaînes
nft list chains
Lister les règles
nft list table ip filter
Note: Les arguments "ip" et "filter" sont variables en fonction de ce que vous voulez:
- ip: pour de l'IPv4. Peut être ip6 pour de l'IPv6 ou inet pour les deux
- filter: le nom de la table que vous avez définit à la création
Création d'une table
Par convention, les tables Nftables sont écrites en minuscules (contrairement à Iptables).
Création d'une table nommée filter agissant sur IPv4
nft add table ip filter
Création d'une chaîne
Création de la chaîne input avec blocage du trafic par défaut
nft add chain ip filter input { type filter hook input priority 0\; policy drop\; }
<commande> <action> <famille_IP> <nom_table> <nom_chaine> { type <filter|route|nat> hook <prerouting|input|output|postrouting} priority <poids_comme_MX>\; policy <accept|drop>
Création d'une règle
Création d'une règle d'acceptation du port 80
nft add rule ip filter input tcp dport 80 accept
Suppression d'une règle
Pour supprimer une règle, il faut d'abord afficher un numéro lié aux règles
nft --handle list table ip filter
Dans l'exemple, le numéro de la règle est 2. L'attribution de ces numéros n'est pas incrémental mais aléatoire (ce ne serai pas drôle sinon...).
Suppression de la règle
nft delete rule ip filter input handle 2
Sources de la section
- https://wiki.nftables.org/wiki-nftables/index.php/Configuring_tables
- https://www.mankier.com/8/nft
- https://wiki.archlinux.org/index.php/Nftables
Utilisation par conversion
Une fonction indispensable pour gérer le pare feux via Nftables est de convertir les règles Iptables en règles pour celui-ci. Comme ça, pas besoin de galérer des heures à trouver la bonne syntaxe (particulièrement à chier, il faut le dire) pour de pauvres règles toutes simples.
L'outil miracle se nomme iptables-translate
et se trouve dans le paquet iptables
. Il est donc probablement déjà présent sur votre machine (testé sur Debian Buster).
Conversion de règles
L'outil est très simple d'utilisation. Il suffit de remplacer la commande iptables
par iptables-translate
lorsque vous tapez vos règles. Ces dernières ne s'appliquerons pas, l’outil redirigeant la chaîne de caractère convertie dans le stdout de votre terminal en règle Nftables prête à l'emploi.
Par exemple:
iptables-translate -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
donne:
nft add rule ip filter INPUT ct state related,established counter accept
Il est possible de donner directement un fichier de sauvegarde Iptables à Nftables afin de convertir une configuration complète en un seul coup ! C'est presque trop beau pour être vrai tellement c'est facile et que ça marche du premier coup sans galère (on est vraiment pas habitué à ça dans le monde du libre) !
Comme la syntaxe est légèrement différente entre les règles fournies par la commande iptables
et un fichier de sauvegarde Iptables. Il faut utilisé une autre commande toujours présente dans le même paquet:
iptables-restore-translate -f /etc/iptables/rules.v4 > /etc/nftables.conf
Ainsi, un ensemble de règles comme celles-ci:
*filter
:INPUT DROP
:FORWARD DROP
:OUTPUT DROP
# Windows, ça spam…
-A INPUT -p udp -d 255.255.255.255 -j DROP
-A INPUT -p udp -d 192.168.1.255 -j DROP
-A INPUT -p udp -m multiport --dport netbios-ns,netbios-dgm,netbios-ssn -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport ssh -j ACCEPT
-A INPUT -p tcp -m tcp --dport http -j ACCEPT
-A INPUT -p tcp -m tcp --dport https -j ACCEPT
-A INPUT -p tcp -m tcp --dport smtp -j ACCEPT
-A INPUT -p tcp -m tcp --dport submission -j ACCEPT
-A INPUT -p tcp -m tcp --dport imaps -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
COMMIT
ressemble à ça après conversion:
table ip filter {
chain INPUT {
type filter hook input priority 0; policy drop;
ip protocol udp ip daddr 255.255.255.255 counter packets 0 bytes 0 drop
ip protocol udp ip daddr 192.168.150.255 counter packets 0 bytes 0 drop
udp dport { netbios-ns, netbios-dgm, netbios-ssn } counter packets 0 bytes 0 drop
iifname "lo" counter packets 0 bytes 0 accept
ip protocol icmp counter packets 0 bytes 0 accept
ct state established,related counter packets 402 bytes 28608 accept
tcp dport ssh counter packets 1 bytes 88 accept
tcp dport http counter packets 0 bytes 0 accept
tcp dport https counter packets 0 bytes 0 accept
tcp dport smtp counter packets 0 bytes 0 accept
tcp dport submission counter packets 0 bytes 0 accept
tcp dport imaps counter packets 0 bytes 0 accept
}
chain FORWARD {
type filter hook forward priority 0; policy drop;
}
chain OUTPUT {
type filter hook output priority 0; policy drop;
oifname "lo" counter packets 0 bytes 0 accept
ip protocol icmp counter packets 0 bytes 0 accept
ct state established,related,new counter packets 234 bytes 35560 accept
}
}
Franchement, vous vous imaginiez taper ça à la main sérieux ? Avec un retour d'erreur n'aidant absolument pas à la résolution de problème, trouver la bonne syntaxe tout seul relève de la pure torture.
INFORMATION
Ne pas oublier d'ajouter le shebang du fichier de destination (#!/usr/sbin/nft -f
) et éventuellement la première règle de purge pour bien gérer un redémarrage du service à chaud (flush ruleset
équivalent de iptables -F
). Ce fichier doit avoir les droits d'exécution (il s'agit d'un script).