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 à 16:14] – [Vérifier le travail] 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 195: Ligne 235:
 </pre></html> </pre></html>
 ===== Vérifier le travail ===== ===== Vérifier le travail =====
-depuis le poste d'administration qui dispose bien entendu d'une double pile IP, nous ouvrons une connexion ssh sur le serveur et ça fonctionne :-) 
  
-Oui mais...+ 
 +Après de nombreux essais, voici une solution efficiente, mais pas évidente:
 <html><pre class="code"> <html><pre class="code">
-<b>who</b>+<b>cat /etc/nftables.conf</b>
  
-user     sshd pts/1   2025-06-24 16:55 <span class="hly">(192.168.60.76)</span> +#!/usr/sbin/nft -f 
-</pre></html> +flush ruleset
-**who**((commande qui permet d'afficher la liste des utilisateurs ayant ouvert une session distante )) indique une IPv4. Normalement, IPv6 est prioritaire... Ça ne sent pas bon...+
  
-Fermeture de la connexion et ré-ouverture en appelant explicitement l'adresse IPv6 du serveur: +table inet filter {
-<html><pre class="code"> +
-<b>ssh user@2a01:e0a:875:b1d0:5054:ff:fe79:7d6f</b>+
  
-<span class="bhlr">ssh: connect to host 2a01:e0a:875:b1d0:5054:ff:fe79:7d6f port 22: No route to host</span> +    chain input_ipv4 { 
-</pre></html> +        icmp type echo-request  <span class="hlg">limit rate 5/second</span> accept 
- Il est pourtant bien dit dans la [[https://wiki.nftables.org/wiki-nftables/index.php/Nftables_families|documentation]] que les tables inet "//Tables of this family see both IPv4 and IPv6 traffic/packets, simplifying dual stack support. //"+    }
  
-Après de nombreux essaisvoici une solution efficientemais pas évidente:+    chain input_ipv6 { 
 +        icmpv6 type { nd-neighbor-solicitnd-router-advertnd-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 à 16:14 par prof