Gestion avancée du pare-feu avec nftables : Transition d’iptables
nftables est le successeur d’iptables sur les systèmes Linux, et est depuis devenu le pare-feu par défaut. Si vous n’êtes pas encore passé à nftables, vous passez à côté de performances améliorées, d’une syntaxe de commande plus simple et d’une manière globalement plus simple de gérer les règles de pare-feu. Dans ce tutoriel, vous allez apprendre comment passer d’iptables à nftables. Pour ce faire, nous devons nous familiariser avec la façon dont nftables diffère d’iptables d’un point de vue fonctionnel, ainsi qu’avec la nouvelle syntaxe de commande pour configurer les règles.
Dans ce tutoriel, vous allez apprendre :
- En quoi nftables fonctionne-t-il différemment d’iptables ?
- Comment les commandes
iptables
sont automatiquement traduites ennftables
- Comment commencer la transition vers nftables, du point de vue d’iptables
nftables vs. iptables : différences de fonctionnalité
iptables est livré avec plusieurs outils tels que iptables
, ip6tables
, arptables
et ebtables
. Cela peut rendre la gestion des règles assez complexe, car nous devons gérer plusieurs ensembles de règles en fonction de ce que nous essayons de filtrer. Au minimum, à l’ère de la généralisation d’IPv6, cela signifie que nous devons écrire des filtres à la fois dans iptables
et ip6tables
presque chaque fois que nous voulons ajouter une règle à notre pare-feu.
NFTretables combine tout en un seul outil. De plus, nftables nous donne plus de contrôle sur la structure de nos règles de pare-feu. Au lieu des chaînes par défaut INPUT
, OUTPUT
, et FORWARD
qui sont présentes dans iptables, ainsi que des tables mangle
, nat
, filter
et raw
, nftables n’est pas livré avec des chaînes ou des tables créées automatiquement. Nous devons créer et nommer nos propres tables et chaînes, puis les remplir avec des règles et lier les fonctionnalités entre elles. Le résultat est un contrôle beaucoup plus granulaire sur la façon dont notre pare-feu traite le trafic réseau.
De plus, il y a aussi une différence de performance. Étant donné qu’iptables nous impose des chaînes et des tables par défaut, cette structure est touchée à chaque paquet circulant dans notre système, et a un impact mesurable sur les performances du réseau, même si aucune règle n’a été configurée ! Comme nftables nous permet de configurer exactement ce dont nous avons besoin, nous pouvons réduire les parties inutiles introduites par iptables.
Transition automatique de iptables à nftables
La bonne nouvelle, c’est qu’une partie de la transition vers nftables est prise en charge automatiquement.
LE SAVIEZ-VOUS ?
Même si vous utilisez les commandes iptables
obsolètes sur votre système, ces règles sont traduites en l’équivalent de nftables, et la configuration est appliquée par nftables. C’est-à-dire, à moins que vous n’utilisiez un système gravement obsolète (par exemple, de 2019 ou avant) qui utilise toujours iptables sous le capot.
La commande iptables
peut toujours être utilisée sur la plupart des systèmes, mais elle est maintenant liée à un outil qui traduit l’entrée en règles nftables équivalentes, avant de transmettre la configuration à nftables pour application.
Vous pouvez le constater par vous-même en utilisant la commande readlink
pour voir que la commande iptables
n’est qu’un lien symbolique vers un autre outil. Sur notre système de test Ubuntu, xtables-nft-multi est ce qui est réellement exécuté chaque fois que nous tapons iptables
:
readlink -f $(which iptables)
/usr/sbin/xtables-nft-multi
Si nous ouvrons la page de manuel de cet outil avec man xtables-nft-multi
, nous pouvons voir ce qu’il fait réellement :
xtables-nft — iptables using nftables kernel api
Ainsi, cet outil envoie simplement les commandes iptables
à l’API nftables.
Bien que cette traduction se fasse automatiquement pour nous, il est toujours recommandé d’abandonner l’ancienne syntaxe de commande iptables
en faveur de nftables
. Pour les règles complexes, la traduction via l’API peut ne pas fonctionner comme prévu, il est donc préférable d’interagir directement avec nftables via la commande nft
. De plus, la syntaxe de commande est plus facile et les règles sont plus simples à maintenir.
De plus, iptables est susceptible de devenir complètement obsolète dans les futures versions, et cette couche de compatibilité peut cesser de fonctionner ou inclure les fonctions nécessaires. Bref, la transition est inévitable et avantageuse pour les administrateurs système.
Traduire iptables en nftables
Les règles complexes qui sont écrites dans iptables devront sans aucun doute être converties manuellement sur nftables. Cependant, pour des règles plus simples, la commande iptables-translate
fait un travail décent pour prendre une commande iptables
en entrée et sortir la commande nft
équivalente. Voici un exemple qui accepte toutes les connexions établies et associées :
iptables-translate -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
nft add rule ip filter INPUT ct state related,established counter accept
Nous spécifions la commande iptables
mais utilisons iptables-translate
au lieu de iptables
. Le reste des arguments est typique d’iptables. Ensuite, en sortie, on nous donne une commande nft
qui se traduit directement par la même règle iptables.
Voici un autre exemple qui pourrait supprimer le trafic ICMP entrant :
iptables-translate -t mangle -A PREROUTING -p icmp -j DROP
nft add rule ip mangle PREROUTING ip protocol icmp counter drop
NOTE
Malheureusement, l’outil iptables-translate n’est pas parfait, et assez facile à déjouer une fois que vous commencez à lui donner des règles iptables plus complexes pour lesquelles il n’y a pas d’équivalent direct avec la commande nft
.
nftables vs. iptables : faire la transition
Dans cette section, nous allons partir du principe que le lecteur est un administrateur système qui connaît raisonnablement iptables, mais ne connaît rien à nftables. Cela servira d’introduction pour vous familiariser avec nftables, tout en supposant que vous avez un peu de connaissances en iptables pour vous aider à comprendre.
Passons en revue le processus d’application d’une configuration de pare-feu de base dans nftables, tout en montrant comment le même processus serait effectué à l’ancienne manière dans iptables :
Comme mentionné précédemment, nftables nous donne une ardoise vierge sans tables ni chaînes créées par défaut. Donc, contrairement à iptables, nous devrions commencer par créer une table. Les tables sont les principaux conteneurs utilisés pour organiser nos règles de pare-feu. Commençons par créer une table appelée
filter
:sudo nft add table inet filter
NFT
démarre la commande et c’est ainsi que nous interagissons avec NFTABLES.add
indique à l’utilitaire que nous souhaitons ajouter quelque chose.inet
signifie que nous voulons appliquer la règleà la fois à IPv4 et à IPv6 – nous aurions pu spécifier
IP
ouIP6
si nous voulions seulement filtrer IPv4 ou IPv6, respectivement. Enfin,filter
est le nom de la table que nous ajoutons.Ensuite, nous devons ajouter une chaîne à notre table. Nous nommerons notre
entrée
de chaîne pour qu’il soit clair que cette chaîne sera utilisée pour traiter les paquets réseau entrants :sudo nft 'add chain inet filter input { type filter hook input priority 0; }'
Nous avons déjà passé en revue l’utilité de certains des arguments ci-dessus ;
Chain
spécifie que nous essayons d’ajouter une chaîne à la configuration du pare-feu.filter
est le nom de la table à laquelle nous ajoutons la nouvelle chaîne.input
est le nom de la chaîne (un nom couramment choisi pour clarifier son objectif). Dans les accolades, nous spécifions letype filter
pour indiquer que cette chaîne filtrera les paquets.L’entrée de crochet
signifie que la chaîne sera attachée au crochet d’entrée, que NFTtables utilise pour traiter les paquets entrants. Enfin,la priorité 0
donne simplement à la chaîne une priorité plus élevée que les autres chaînes (un nombre inférieur équivaut à une priorité plus élevée, 0 étant la priorité la plus élevée).Jusqu’à ce point, nous avons une table nommée
filter
et une chaîne nomméeinput
. Nous pouvons maintenant continuer avec l’ajout de quelques règles à la chaîne. Voyons une simple commandenft
pour ajouter une règle qui autorise le trafic entrant sur les ports 80 et 443 :sudo nft add rule inet filter input tcp dport { 80, 443 } accept
La règle équivalente dans iptables serait :
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
Ces deux commandes feront la même chose, c’est-à-dire permettre au trafic entrant sur les ports 80 (HTTP) et 443 (HTTPS) de traverser le pare-feu et d’atteindre les services exposés exécutés sur le serveur. La commande
nft
s’avère plus simple, tout en s’appliquant à la fois à IPv4 et IPv6, contrairement à la commandeiptables
.Nous pouvons voir la configuration de nos nftables en exécutant la commande suivante :
sudo nft list ruleset table inet filter { chain input { type filter hook input priority filter; policy accept; tcp dport { 80, 443 } accept } }
Le résultat est beaucoup plus facile à comprendre que celui d’iptables, la plupart du crédit étant dû à son format structuré. Nous pouvons voir que notre table
inet
nomméefilter
contient une chaîne nomméeinput
, que la chaîne est attachée au hook d’entrée et que le trafic destiné aux ports (dport
) 80 et 443 est accepté.
En complétant ces étapes, vous avez configuré une table et une chaîne dans nftables, ainsi qu’une règle qui s’applique au trafic entrant, tout en comprenant comment la commande se traduit à partir de l’équivalent iptables
d’origine.
VOUS VOUS SENTEZ DÉPASSÉ ?
Bien que nftables s’avère un peu plus facile qu’iptables, les deux ne sont certes pas très conviviaux. Si l’apprentissage de la nouvelle syntaxe vous semble être une tâche ardue, n’oubliez pas que les interfaces plus simples comme firewalld et ufw offrent un moyen beaucoup plus facile d’interagir avec le pare-feu iptables ou nftables sous-jacent sur votre système. Ce sont des alternatives conviviales qui utilisent toujours iptables et nftables, mais qui ont une syntaxe plus facile et font une partie du travail supplémentaire pour vous.
Réflexions finales
Dans ce tutoriel, nous avons vu comment passer du pare-feu iptables au pare-feu nftables sur un système Linux. Cela ne sert qu’d’introduction qui ne fait qu’effleurer la surface, car les deux pare-feu sont complexes et nécessitent beaucoup de dévouement pour ceux qui souhaitent être parfaitement à l’aise avec leur utilisation.
Maintenant que vous savez comment créer des tables, des chaînes et des règles avec la commande nft
, et que vous pouvez traduire la syntaxe iptables
en nft
via l’outil iptables-translate
, vous allez pouvoir commencer à faire la transition de iptables à nftables sur votre système Linux. Pour les règles complexes, quelques bricolages supplémentaires seront probablement nécessaires. Nous vous recommandons d’en savoir plus sur le wiki nftables, où vous pouvez voir des exemples de règles avancées et de configuration de nftables.