Outils pour utilisateurs

Outils du site


Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
130netfilter:50-commencer_avec_nftables [le 24/06/2025 à 14:50] prof130netfilter:50-commencer_avec_nftables [le 28/06/2025 à 12:31] (Version actuelle) – [Ajout de règles dans la chaîne «input_ipv6»] prof
Ligne 102: Ligne 102:
 pour faire table rase. Puis nous (re)créons une table «inet filter»: pour faire table rase. Puis nous (re)créons une table «inet filter»:
   nft add table inet filter   nft add table inet filter
-<note warning>La documentation concernant ce type de table (inet) n'est pas si claire que ça. Faire accepter les ports 22, 80 et 443 aussi bien en IPv4 qu'en IPv6 n'est pas vraiment intuitif et il faudra faire appel à des notions avancées présentes dans nftables.</note>+<note warning>La documentation concernant ce type de table (inet) n'est pas si claire que ça. Faire accepter les ports 22, 80 et 443 aussi bien en IPv4 qu'en IPv6 n'est pas vraiment intuitif et il faudra faire appel à des notions avancées (formules magiques ?) présentes dans nftables.</note>
 Ceci étant dit, allons-y quand même. Ceci étant dit, allons-y quand même.
-==== Créer une chaîne dans la table ==== + 
-Dans cette table, ajoutons une chaîne:+Après de très nombreux essais plus que décevants concernant le filtrage simultané des ports tcp entrants en ipv4 **comme** en ipv6, et dont une lecture à de nombreuses reprises de la documentation qui n'a pas réussi à m'éclairer, voici un exemple qui fonctionne, inspiré d'ailleurs de la documentation officielle. 
 + 
 +==== Créer trois chaînes dans la table ==== 
      
 <html><pre class="code"> <html><pre class="code">
 +<b>nft add chain inet filter input_ipv4 '{type filter hook input priority 0 ;  }'</b>
 +<b>nft add chain inet filter input_ipv6 '{type filter hook input priority 0 ;  }'</b>
 <b>nft add chain inet filter input '{type filter hook input priority 0 ;  }'</b> <b>nft add chain inet filter input '{type filter hook input priority 0 ;  }'</b>
  
Ligne 113: Ligne 118:
  
 table inet filter { table inet filter {
 + chain input_ipv4 {
 + type filter hook input priority filter; policy accept;
 + }
 +
 + chain input_ipv6 {
 + type filter hook input priority filter; policy accept;
 + }
 +
  chain input {  chain input {
  type filter hook input priority filter; policy accept;  type filter hook input priority filter; policy accept;
  }  }
 } }
- 
 </pre></html> </pre></html>
 Jusque là, tout va bien;''nft'' a mis par défaut la «policy» "accept". Jusque là, tout va bien;''nft'' a mis par défaut la «policy» "accept".
-==== Ajout d'une règle dans la chaîne ==== +==== Ajout de règles dans la chaîne «input_ipv4» ==== 
-qui va explicitement laisser l'entrée ouverte sur les ports TCP 2280 et 443:+Nous allons ajouter des filtres pour icmp (v4) pour accepter ''icmp-request'', mais avec une limitation sur le débit:
 <html><pre class="code"> <html><pre class="code">
-<b>nft add rule inet filter input  tcp dport {22, 80, 443} accept</b>+<b>nft add rule inet filter input_ipv4  icmp type echo-request limit rate 5/second  accept</b>
  
 <b>nft list ruleset</b> <b>nft list ruleset</b>
  
 table inet filter { table inet filter {
 + chain input_ipv4 {
 + type filter hook input priority filter; policy accept;
 + <span class="hly">icmp type echo-request <b>limit rate 5/second</b> accept</span>
 + }
 +
 + chain input_ipv6 {
 + type filter hook input priority filter; policy accept;
 + }
 +
  chain input {  chain input {
  type filter hook input priority filter; policy accept;  type filter hook input priority filter; policy accept;
- tcp dport { 22, 80, 443 } accept 
  }  }
 } }
 +
 </pre></html> </pre></html>
-Maintenant que nous sommes capables d'utiliser ssh pour la suitenous changeons la politique par défaut du filtre input:+==== Ajout de règles dans la chaîne «input_ipv6» ==== 
 +Iciil faut en plus autoriser les types «nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert» nécessaires à l'auto-configuration IPv6 :
 <html><pre class="code">  <html><pre class="code"> 
-<b>nft chain inet filter input '{policy drop; }'</b> +<b>nft add rule inet filter input_ipv6  icmpv6 type echo-request limit rate 5/second  accept</b> 
 +<b>nft add rule inet filter input_ipv6  icmpv6 type nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert  accept</b>
 <b>nft list ruleset</b> <b>nft list ruleset</b>
  
 table inet filter { table inet filter {
 + chain input_ipv4 {
 + type filter hook input priority filter; policy accept;
 + icmp type echo-request limit rate 5/second accept
 + }
 +
 + chain input_ipv6 {
 + type filter hook input priority filter; policy accept;
 + <span class="hly"><b>icmpv6</b> type echo-request limit rate 5/second accept</span>
 + <span class="hly"><b>icmpv6</b> type { nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } accept</span>
 + }
 +
  chain input {  chain input {
- type filter hook input priority filter; <span class="bhly">policy drop;</span> + type filter hook input priority filter; policy accept;
- tcp dport { 22, 80, 443 } accept+
  }  }
 } }
 +</pre></html>
 +==== Ajout de règles dans la chaîne «input» ====
 +C'est ici que le destin de notre pare-feu se joue...
 +Concernant l'interface locale:
 +  nft add rule inet filter input iifname "lo" accept
 +Concernant le suivi des connexions :
 +  nft add rule inet filter input ct state vmap { established : accept, related : accept, invalid : drop }
 +Mettre en œuvre les chaînes «input_ipv4» et «input_ipv6»
  
 </pre></html> </pre></html>
Ligne 151: Ligne 191:
   nft add rule inet filter input ct state established, related accept   nft add rule inet filter input ct state established, related accept
 tout laisser entrer par l'interface locale: tout laisser entrer par l'interface locale:
-  nft add rule inet filter input iif lo accept+  Ajout de règles dans la chaîne «input_ipv6»
 autoriser certains signaux icmp: autoriser certains signaux icmp:
   nft add rule inet filter input icmp type {echo-request, destination-unreachable, time-exceeded, parameter-problem} accept   nft add rule inet filter input icmp type {echo-request, destination-unreachable, time-exceeded, parameter-problem} accept
Ligne 194: Ligne 234:
 } }
 </pre></html> </pre></html>
-  +===== Vérifier le travail ===== 
 + 
 + 
 +Après de nombreux essais, voici une solution efficiente, mais pas évidente: 
 +<html><pre class="code"> 
 +<b>cat /etc/nftables.conf</b> 
 + 
 +#!/usr/sbin/nft -f 
 +flush ruleset 
 + 
 +table inet filter { 
 + 
 +    chain input_ipv4 { 
 +        icmp type echo-request  <span class="hlg">limit rate 5/second</span> accept 
 +    } 
 + 
 +    chain input_ipv6 { 
 +        icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept 
 +        icmpv6 type echo-request limit rate 5/second accept 
 +    } 
 + 
 +    chain input { 
 +        type filter hook input priority 0; policy drop; 
 +        iifname lo accept 
 +        <span class="hly">ct state <b>vmap</b> { established : accept, related : accept, invalid : drop }</span> 
 +        <span class="hlo">meta protocol <b>vmap</b> { ip : <b>jump</b> input_ipv4, ip6 : <b>jump</b> input_ipv6 }</span> 
 +        tcp dport { 22, 80, 443} accept 
 +    } 
 +
 +</pre></html> 
 +Solution extraite de la [[https://wiki.nftables.org/wiki-nftables/index.php/Simple_ruleset_for_a_server|documentation officielle]]. 
 +  * ** limit rate** permet de limiter la fréquence de réception des paquets icmp «echo-request», ici à 5 paquets pas seconde. S'ils arrivent à une fréquence plus élevée, les paquets «en trop» sont jetés, ceci afin d'éviter le déni de service par «ping flood». 
 +  * **vmap** pourrait être comparé à un dictionnaire, un ensemble de couples clé:valeur, 
 +  * **jump** c'est un saut vers quelque chose, ici une autre chaîne, et lorsque cette autre chaîne a été entièrement parcourue, revient à la ligne qui suit le «jump». 
Commencer avec Nftables: Dernière modification le: 24/06/2025 à 14:50 par prof