---
title: Howto nftables
categories: sysadmin network firewall routing
...

* WIKI nftables <https://wiki.nftables.org/>

[Nftables](https://wiki.nftables.org/) est un sous-système du noyau Linux assurant le filtrage et la classification des paquets / datagrammes / trames réseau. Il est disponible depuis le noyau Linux 3.13 publié le 19 janvier 2014. Il est destiné à remplacer l'ancien système iptables de Netfilter. Parmi les avantages de nftables par rapport à iptables, il y a moins de duplication de code ainsi qu'une meilleure prise en charge des nouveaux protocoles. La configuration est gérée via le programme nft, tandis que les outils hérités sont configurés via les utilitaires iptables, ip6tables, arptables et ebtables frameworks. Il utilise les éléments des modules Netfilter du noyau Linux, tels que les hooks existants dans la pile réseau, le système de suivi des connexions, le composant de mise en file d'attente de l'espace utilisateur et le sous-système de journalisation.

Depuis Debian Buster, nftables est le backend par défaut lors de l'utilisation d'iptables, grâce à la couche iptables-nft (utilisation de la syntaxe iptables assurant la compatabilité avec le sous-système du noyau nf_tables). Cela affecte également ip6tables, arptables et ebtables.

Le programme iptables-translate(8) permet la traduction des règles iptables au format nftables.

## Installation

Pour installer et activer nftables :

~~~
# apt install nftables
# systemctl enable nftables.service
~~~

Par défaut, les règles chargées se trouvent dans /etc/nftables.conf.

NB: Si pour une raison quelconque nftables a des problèmes pour démarrer, par défaut aucune règle n'est appliquée, ce qui signifie tout le trafic sera autorisé. Cela peut se produire si vous utilisez des noms d'hôte dans les règles, ce qui posera problème au démarrage nftables démarrant avant que la résolution de nom ne soit disponible.

## Commandes utiles

Lister les tables existantes :

~~~
# nft list tables
~~~

Lister le contenu de la table « filter » :

~~~
# nft list table inet filter
~~~

Supprimer l'ensemble des règles de la table « filter » :

~~~
# nft flush table inet filter
~~~

Lister l'ensemble des règles :

~~~
# nft list ruleset
~~~

Supprimer l'ensemble des règles :

~~~
# nft flush ruleset
~~~

Créer une table (IPv4/IPv6) « filter » :

~~~
# nft add table inet filter
~~~

*La fiamille de type inet permet l'unification des types ip (IPv4) et ip6 (IPv6).*

Supprimer la table « filter » ainsi que les règles associées :

~~~
# nft delete table inet filter
~~~

Ajouter une chaine « input » à la table « filter » pour le trafic (IPv4/IPv6) en entrée :

~~~
# nft add chain inet filter input { type filter hook input priority 0\; }
~~~

*Le type peut être **filter**, **route**, ou **nat**.*
*Le type de hook peut être **prerouting**, **input**, **forward**, **output**, or **postrouting**.*
*On peut remplacer **add** par **create** pour ajouter une nouvelle chaine mais retrourner une erreur si cette chaine existe déjà.*

Supprimer la chaine « input » de la table « filter » :

~~~
# nft delete chain inet filter input
~~~

Ajouter une règle à la chaine « input » de la table « filter » pour autoriser le trafic SSH en entrée :

~~~
# nft add rule inet filter input tcp dport ssh inet accept comment "Accept SSH on port 22"
~~~

Supprimer toutes les règles de la chaine « input » appartenant à la table « filter » :

~~~
# nft flush chain inet filter input
~~~

## Exemple

Voici un exemple permettant de mettre en place un firewall. Il s'agit ici d'autoriser le trafic SSH à l'IP 203.0.113.1 seulement et le trafic HTTP/HTTPS à tous. 

### Configuration en CLI

On doit donc réaliser les opérations suivantes :

Créer une table « filter » par exemple.

~~~
# nft add table inet filter
~~~

Créer une chaine « input » dans la table « filter » (drop du trafic par défaut).

~~~
# nft 'add chain inet filter input { type filter hook input priority 0 ; policy drop;}'
~~~

Créer une chaine « output » dans la table « filter » (autorisation du trafic par défaut).

~~~
# nft 'add chain inet filter output { type filter hook output priority 0 ; policy accept; }'
~~~
 
Ajouter les règles permettant le trafic SSH a l'IP 203.0.113.1 seulement et le trafic HTTP/HTTPS à tous.

~~~
# nft add rule inet filter input saddr 203.0.113.1/24 tcp dport ssh inet accept comment "Accept SSH on port 22 for IP 203.0.113.1"
# nft add rule inet filter input tcp dport { 80,443 } inet accept comment "Accept HTTP/HTTPS traffic"
~~~

Sous Debian des exemples de configuration sont visibles dans le dossier **/usr/share/doc/nftables/examples/**

## Débogage

## Liens

* [WIKI ARCHLINUX](https://wiki.archlinux.org/index.php/Nftables)
* [WIKI DEBIAN](https://wiki.debian.org/nftables)
* [WIKI NFTABLES](https://wiki.nftables.org/wiki-nftables/index.php/)
* [PAGE WIKIPEDIA](https://en.wikipedia.org/wiki/Nftables)
