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/04/29 18:06] – yoann | netadmin:nftables:000_start [2024/12/03 09:15] (Version actuelle) – Corrections yoann | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | {{tag> | + | {{tag> |
| : | : | ||
| Ligne 40: | Ligne 40: | ||
| ===== Le ruleset ===== | ===== Le ruleset ===== | ||
| - | Le ruleset désigne l' | + | 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 ===== | ||
| - | Les tables sont des conteneurs. On y trouve les **chaînes**, | + | Les tables sont des conteneurs. On y trouve les **chaînes**, |
| Ligne 63: | Ligne 74: | ||
| # La famille peut être précisée en préfixe | # La famille peut être précisée en préfixe | ||
| - | nft list ip aTableName | + | nft list table ip aTableName |
| - | nft list ip6 aTableName | + | nft list table ip6 aTableName |
| - | nft list inet aTableName | + | nft list table inet aTableName |
| - | nft list arp aTableName | + | nft list table arp aTableName |
| - | nft list bridge aTableName | + | nft list table bridge aTableName |
| - | nft list netdev 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/ | ==== Activer/ | ||
| Ligne 84: | Ligne 115: | ||
| ===== Les chaînes ===== | ===== Les chaînes ===== | ||
| - | Les chaînes contiennent les séquences de règles. On distingue les **chaînes de base** et les **chaines | + | Les chaînes contiennent les séquences de règles. On distingue les **chaînes de base** et les **chaînes |
| * Un **chaîne de base** est un point d' | * 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' | * 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/ | ===== Création/ | ||
| Ligne 96: | Ligne 138: | ||
| # commande saisie en mode interactif | # commande saisie en mode interactif | ||
| create chain ip aTable anInputBaseChain { type filter hook input priority 0; policy drop; comment "a useful remark"; | 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 | ||
| </ | </ | ||
| Ligne 103: | Ligne 304: | ||
| * https:// | * https:// | ||
| * https:// | * https:// | ||
| - | * https:// | + | * [[https:// |
| * https:// | * https:// | ||
| * https:// | * https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||