Ceci est une ancienne révision du document !
nftables est le successeur d'iptables. Il est intégré aux noyaux >= 3.13 depuis 2014. Les distributions récentes fournissent par défaut nftables et sauf spécificité il est recommandé de migrer vers nftable.
Principales différences:
nft est la CLI permettant de définir les règles. Elle interprète les caractères spéciaux tels que l'accolade ou le point virgule également utilisés par le shell. Si nft est appelé depuis le bash il faudra donc échapper les caractères spéciaux.
On peut également invoquer nft en mode interactif via l'option -i. En fonctionnant dans ce mode il devient inutile d'échapper les caractère spéciaux.
nft --handle --interactive # équivalents nft -a -i nft -ai
Dans l'exemple ci-dessus on introduit également l'option --handle ou -a. Un handle (contrôleur) est un identifiant numérique associé à chaque élément de configuration. il peut être affiché grâce à cette option puis réutilisés par différentes commandes pour désigné de facon sure et concise l'élément a manipuler.
# nft depuis le bash : les caractères spéciaux doivent être échappés nft 'add chain ip my_iptable input_chain { type filter hook input priority 0 ; policy drop ; comment "text comment" ;}'
Les modifications apportées depuis nft s'appliquent immédiatement mais ne seront pas sauvegardées après redémarrage. Comme beaucoup d'autre outils réseau il fonctionne en système transitoire (ou transiant).
Le ruleset désigne l'ensemble des éléments de configuration existants. Des opérations peuvent être appliquées sur l'ensemble de la configuration comme:
# Sauvegarder/exporter le ruleset dans le fichier "my_ruleset.nft" nft list ruleset > my_ruleset.nft # Effacer le ruleset courant nft flush ruleset # Recharger un ruleset depuis le fichier "my_ruleset.nft" nft -f my_ruleset.nft
Les tables sont des conteneurs. On y trouve les chaînes, les ensembles et les objets à état (compteurs, quotas, limites). L'état désactivé (flag 'dormant') peut être positionné sur une table: dans ce cas les chaînes de base sont déchargées et ne sont plus évaluées.
Pour lister les tables existantes:
# nft list tables # On peut choisir de lister les tables d'une famille en particulier nft list tables bridge nft list tables inet nft list tables ip
Pour lister le contenu d'une table
nft list table aTableName # La famille peut être précisée en préfixe nft list ip aTableName nft list ip6 aTableName nft list inet aTableName nft list arp aTableName nft list bridge aTableName nft list netdev aTableName
Création d'une table “myTable” pour la famille ipv4.
add table ip myTable { flags dormant; comment "Basic firewall"; }
delete table ip myTable # Suppression de la table via son identifiant delete table handle 2
On positionne le drapeau dormant pour désactiver la table via la commande add:
add table aTableName { flags dormant; } # La famille peut être précisée add table ip6 aTableName { flags dormant; }
Les chaînes contiennent les séquences de règles. On distingue les chaînes de base et les chaines normales (regular):
add chain aTableName inbound { type filter hook input priority 0; comment "Filtrage du trafic entrant"; }
La chaîne est contenue dans une table. Lors de la création d'une chaîne de base les attributs type, hook et priority sont obligatoirement définis:
# Création d'une chaîne de base anInputBaseChain dans la table aTable # commande saisie en mode interactif create chain ip aTable anInputBaseChain { type filter hook input priority 0; policy drop; comment "a useful remark"; }
Suppression de la règle d'identifiant (handle) 5:
delete rule aTable aChain handle 5
Les objets de type counter et quota sont déclarés dans les tables et peuvent être utilisés par les règles dans les chaînes.
icmp type echo-request
Comme pour les ensembles ou les compteurs, on distingue les limites anonymes et les limites nommées.
Dans l'exemple ci-dessous on crée une limite nommée “limit_10ppm” dans la table “aTable”
add limit aTable limit_10ppm { rate 10/minute ; comment "Limitation du trafic a 10 paquets par minute" }
La limite nommée peut ensuite être utilisée par une ou plusieurs règles. Dans l'exemple ci-dessous on crée une règle dans la chaîne “inboundBaseChain” autorisant les requêtes ICMP entrantes dans la limite de 10 paquets par minutes:
add rule aTable inboundBaseChain icmp type echo-request limit name "limit_10ppm" accept comment "Autorisation limitee du ping"
Suppression de la limite
# Supprimer la limite par son label delete limit aTable limit_10ppm # Supprimer la limite via son identifiant delete limit aTable handle 1
Error: Could not process rule: Device or resource busy.