Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| netadmin:nftables:000_start [2023/03/14 23:36] – yoann | netadmin:nftables:000_start [2024/12/03 09:15] (Version actuelle) – Corrections yoann | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | {{tag> | + | {{tag> |
| : | : | ||
| Ligne 15: | Ligne 15: | ||
| - | ===== Aperçu | + | ===== Généralités à propos |
| - | **nft** est la CLI permettant de définir les règles. Elle interprète les caractères spéciaux tels que l' | + | **nft** est la CLI permettant de définir les règles. Elle interprète les caractères spéciaux tels que l' |
| On peut également invoquer **nft** en mode interactif via l' | On peut également invoquer **nft** en mode interactif via l' | ||
| + | <code bash> | ||
| + | nft --handle --interactive | ||
| + | |||
| + | # équivalents | ||
| + | nft -a -i | ||
| + | |||
| + | nft -ai | ||
| + | </ | ||
| + | |||
| + | Dans l' | ||
| <code bash> | <code bash> | ||
| Ligne 26: | Ligne 36: | ||
| </ | </ | ||
| - | Les modifications apportées depuis **nft** s' | + | Les modifications apportées depuis **nft** s' |
| + | ===== Le ruleset ===== | ||
| + | |||
| + | Le ruleset désigne l' | ||
| + | |||
| + | <code bash> | ||
| + | # Sauvegarder/ | ||
| + | nft list ruleset > my_ruleset.nft | ||
| + | |||
| + | # Effacer le ruleset courant | ||
| + | nft flush ruleset | ||
| + | |||
| + | # Recharger un ruleset depuis le fichier " | ||
| + | nft -f my_ruleset.nft | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Les tables ===== | ||
| + | |||
| + | Les tables sont des conteneurs. On y trouve les **chaînes**, | ||
| + | |||
| + | |||
| + | Pour lister les tables existantes: | ||
| + | <code bash> | ||
| + | # 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 | ||
| + | <code bash> | ||
| + | nft list table aTableName | ||
| + | |||
| + | # La famille peut être précisée en préfixe | ||
| + | nft list table ip aTableName | ||
| + | nft list table ip6 aTableName | ||
| + | nft list table inet aTableName | ||
| + | nft list table arp aTableName | ||
| + | nft list table bridge aTableName | ||
| + | nft list table netdev aTableName | ||
| + | </ | ||
| + | |||
| + | ==== Création d'une table ===== | ||
| + | |||
| + | Création d'une table " | ||
| + | < | ||
| + | add table ip myTable { flags dormant; comment "Basic firewall"; | ||
| + | </ | ||
| + | |||
| + | ==== Suppression d'une table ==== | ||
| + | |||
| + | < | ||
| + | delete table ip myTable | ||
| + | |||
| + | # Suppression de la table via son identifiant | ||
| + | delete table handle 2 | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | L' | ||
| + | </ | ||
| + | |||
| + | ==== Activer/ | ||
| + | |||
| + | On positionne le drapeau '' | ||
| + | |||
| + | <code bash> | ||
| + | add table aTableName { flags dormant; } | ||
| + | |||
| + | # La famille peut être précisée | ||
| + | add table ip6 aTableName { flags dormant; } | ||
| + | </ | ||
| + | |||
| + | ===== Les chaînes ===== | ||
| + | |||
| + | Les chaînes contiennent les séquences de règles. On distingue les **chaînes de base** et les **chaînes normales** (regular): | ||
| + | * Un **chaîne de base** est un point d' | ||
| + | * Une **chaîne normale** peut être utilisée comme cible par un saut (jump) elle permet notamment de regrouper et d' | ||
| + | |||
| + | < | ||
| + | add chain aTableName inbound { type filter hook input priority 0; comment " | ||
| + | </ | ||
| + | |||
| + | ===== Lister les règles d'une chaine ===== | ||
| + | |||
| + | Pour lister les règles contenues dans une chaine : | ||
| + | < | ||
| + | nft list chain aTablename aChain | ||
| + | </ | ||
| + | |||
| + | ===== Création/ | ||
| + | |||
| + | 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: | ||
| + | |||
| + | <code bash> | ||
| + | # 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"; | ||
| + | </ | ||
| + | |||
| + | ===== Les règles ===== | ||
| + | |||
| + | **Ajouter** une nouvelle règle dans une chaine avec la syntaxe suivante : | ||
| + | |||
| + | < | ||
| + | </ | ||
| + | |||
| + | |||
| + | **Remplacer** une règle existante toujours via le handler : | ||
| + | |||
| + | < | ||
| + | # On remplace la règle de la chaine " | ||
| + | # désignée par le handler 21 par la définition qui suit | ||
| + | |||
| + | replace rule ipfilter inbound handle 21 iif lo counter accept comment " | ||
| + | </ | ||
| + | |||
| + | Pour **inserer** une règle on s' | ||
| + | |||
| + | < | ||
| + | # Insertion d'une règle dns la chaine " | ||
| + | # au niveau du handler 12 | ||
| + | |||
| + | insert rule ipfilter outbound position 12 oif lo ct state established, | ||
| + | </ | ||
| + | |||
| + | **Supprimer** la règle désignée par le contrôleur 5 (handler) : | ||
| + | |||
| + | < | ||
| + | # Supprime la règle de la chaine " | ||
| + | # identifiée par le handle 5 | ||
| + | |||
| + | delete rule aTable aChain handle 5 | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==== Désignation des interfaces ===== | ||
| + | |||
| + | : | ||
| + | |||
| + | Les règles peuvent intégrer des critères de sélection des interfaces | ||
| + | |||
| + | Source : [[https:// | ||
| + | |||
| + | |||
| + | ==== Les états ==== | ||
| + | |||
| + | Une petite précision sur les états des **connexions TCP** disponibles via ct (conntrack), | ||
| + | |||
| + | * **NEW** : Il s'agit des premiers paquets d'une connexion (Exemple : premier paquet TCP SYN d'une connexion TCP). | ||
| + | * **ESTABLISHED** : Echange de paquet dans les deux sens, la connexion est dite " | ||
| + | * **RELATED** : Connexion qui se réfère d'une connexion ESTABLISHED et créé par elle (Exemple, une connexion FTP-DATA après une authentification correcte via le protocole FTP). | ||
| + | * **INVALID** : Paquet sans état et ne pouvant être rattaché à une connexion déjà connue, à dropper. | ||
| + | * **UNTRACKED** : Paquet ne faisant pas partie d'une connexion connue. | ||
| + | |||
| + | |||
| + | ==== Les sets (ensembles) ==== | ||
| + | |||
| + | Voir la note [[netadmin/ | ||
| + | |||
| + | ===== Compteurs ===== | ||
| + | |||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Journalisation ===== | ||
| + | |||
| + | : | ||
| + | |||
| + | Les valeurs possibles pour **level** correspondent aux niveau de syslog : emerg, alert, crit, err, warn (valeur par défault), notice, info, debug | ||
| + | |||
| + | ===== Limites ===== | ||
| + | |||
| + | Comme pour les ensembles ou les compteurs, on distingue les limites anonymes et les limites nommées. | ||
| + | |||
| + | Dans l' | ||
| + | |||
| + | < | ||
| + | add limit aTable limit_10ppm { rate 10/minute ; comment " | ||
| + | </ | ||
| + | |||
| + | La limite nommée peut ensuite être utilisée par une ou plusieurs règles. Dans l' | ||
| + | |||
| + | < | ||
| + | add rule aTable inboundBaseChain icmp type echo-request limit name " | ||
| + | </ | ||
| + | |||
| + | |||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | La suppression d'une limite nommée n'est possible que lorsqu' | ||
| + | </ | ||
| + | |||
| + | ===== Activer le service nftables ====== | ||
| + | |||
| + | Sur les distributions récentes basées sur systemd, le service existe mais il n'est pas activé par défaut : | ||
| + | |||
| + | <code bash> | ||
| + | systemctl status nftables.service | ||
| + | ○ nftables.service - nftables | ||
| + | | ||
| + | | ||
| + | Docs: man:nft(8) | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Activer le service '' | ||
| + | |||
| + | <code bash> | ||
| + | systemctl enable --now nftables.service | ||
| + | </ | ||
| + | |||
| + | Le ruleset ''/ | ||
| + | |||
| + | |||
| + | ===== Exemple ===== | ||
| + | |||
| + | <code bash> | ||
| + | # Lance netfilter en mode interactif | ||
| + | nft -ai | ||
| + | |||
| + | # création d'une table pour filtrage du trafic IP | ||
| + | # La table est désactivée | ||
| + | add table ip ipfilter { flag dormant; } | ||
| + | |||
| + | # Création de compteurs nommés | ||
| + | add counter ipfilter rejected_pkts | ||
| + | add counter ipfilter accepted_pkts | ||
| + | |||
| + | add chain ipfilter incoming { type filter hook input priority 0; policy drop; comment " | ||
| + | |||
| + | # Rejette et journalise le trafic non explicitement autorisé | ||
| + | add rule ipfilter incoming iif lan counter name rejected_pkts log prefix " | ||
| + | |||
| + | # rejet et journalise le trafic non autorisé | ||
| + | |||
| + | add chain ipfilter outgoing { type filter hook output priority 0; policy drop; comment " | ||
| + | |||
| + | add rule ipfilter outgoing oif lan counter name rejected_pkts log prefix " | ||
| + | |||
| + | # Activer la table | ||
| + | add table ip ipfilter | ||
| + | </ | ||
| ===== Références ===== | ===== Références ===== | ||
| * https:// | * https:// | ||
| + | * https:// | ||
| * https:// | * https:// | ||
| - | * https:// | + | * [[https:// |
| * https:// | * https:// | ||
| * https:// | * https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||