Différences
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 | ||
130netfilter:50-commencer_avec_nftables [le 24/06/2025 à 14:47] – [Une configuration basique] prof | 130netfilter:50-commencer_avec_nftables [le 28/06/2025 à 12:31] (Version actuelle) – [Ajout de règles dans la chaîne «input_ipv6»] prof | ||
---|---|---|---|
Ligne 79: | Ligne 79: | ||
Pour l' | Pour l' | ||
====== Une configuration basique ====== | ====== Une configuration basique ====== | ||
- | Un serveur exposé sur le net: | + | ===== Un serveur exposé sur le «net» |
- | - doit être administré à distance par ssh (port TCP 22), | + | |
- | - un serveur http doit y être installé, accessible également par https (ports TCP 80 et 443), | + | |
- | - l' | + | |
- | - les connexions établies ou relatives à des connexions établies doivent pouvoir entrer sur l' | + | |
- | - Tout ceci doit être vérifié pour IPv4 et IPv6. | + | |
- | Nous pourrions ajouter des filtres dans la chaîne | + | |
Pour fixer les idées, l' | Pour fixer les idées, l' | ||
< | < | ||
Ligne 94: | Ligne 87: | ||
trixie-nft.home.nain-t.net has IPv6 address 2a01: | trixie-nft.home.nain-t.net has IPv6 address 2a01: | ||
</ | </ | ||
+ | Cahier des charges: | ||
+ | - l' | ||
+ | - un serveur http doit y être installé, accessible également par https (ports TCP 80 et 443), | ||
+ | - l' | ||
+ | - les connexions établies ou relatives à des connexions établies doivent pouvoir entrer sur l' | ||
+ | - Tout ceci doit être vérifié pour IPv4 et IPv6. | ||
+ | Nous pourrions ajouter des filtres dans la chaîne | ||
+ | |||
+ | |||
===== Créer une table ===== | ===== Créer une table ===== | ||
Ligne 100: | 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> | + | <note warning> |
Ceci étant dit, allons-y quand même. | Ceci étant dit, allons-y quand même. | ||
- | ==== Créer | + | |
- | 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' |
+ | |||
+ | ==== Créer | ||
| | ||
< | < | ||
+ | < | ||
+ | < | ||
< | < | ||
Ligne 111: | 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; | ||
} | } | ||
} | } | ||
- | |||
</ | </ | ||
Jusque là, tout va bien;'' | Jusque là, tout va bien;'' | ||
- | ==== Ajout d'une règle | + | ==== Ajout de règles |
- | qui va explicitement laisser l'entrée ouverte sur les ports TCP 22, 80 et 443: | + | Nous allons ajouter des filtres pour icmp (v4) pour accepter '' |
< | < | ||
- | < | + | < |
< | < | ||
table inet filter { | table inet filter { | ||
+ | chain input_ipv4 { | ||
+ | type filter hook input priority filter; policy accept; | ||
+ | <span class=" | ||
+ | } | ||
+ | |||
+ | 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 | ||
} | } | ||
} | } | ||
+ | |||
</ | </ | ||
- | Maintenant que nous sommes capables d' | + | ==== Ajout de règles dans la chaîne «input_ipv6» ==== |
+ | Ici, il faut en plus autoriser les types «nd-neighbor-solicit, | ||
< | < | ||
- | < | + | < |
+ | < | ||
< | < | ||
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=" | ||
+ | <span class=" | ||
+ | } | ||
+ | |||
chain input { | chain input { | ||
- | type filter hook input priority filter; | + | type filter hook input priority filter; policy accept; |
- | tcp dport { 22, 80, 443 } accept | + | |
} | } | ||
} | } | ||
+ | </ | ||
+ | ==== Ajout de règles dans la chaîne «input» ==== | ||
+ | C'est ici que le destin de notre pare-feu se joue... | ||
+ | Concernant l' | ||
+ | nft add rule inet filter input iifname " | ||
+ | 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» | ||
</ | </ | ||
Ligne 149: | Ligne 191: | ||
nft add rule inet filter input ct state established, | nft add rule inet filter input ct state established, | ||
tout laisser entrer par l' | tout laisser entrer par l' | ||
- | | + | |
autoriser certains signaux icmp: | autoriser certains signaux icmp: | ||
nft add rule inet filter input icmp type {echo-request, | nft add rule inet filter input icmp type {echo-request, | ||
Ligne 192: | Ligne 234: | ||
} | } | ||
</ | </ | ||
- | | + | ===== Vérifier le travail ===== |
+ | |||
+ | |||
+ | Après de nombreux essais, voici une solution efficiente, mais pas évidente: | ||
+ | < | ||
+ | < | ||
+ | |||
+ | # | ||
+ | flush ruleset | ||
+ | |||
+ | table inet filter { | ||
+ | |||
+ | chain input_ipv4 { | ||
+ | icmp type echo-request | ||
+ | } | ||
+ | |||
+ | chain input_ipv6 { | ||
+ | icmpv6 type { nd-neighbor-solicit, | ||
+ | icmpv6 type echo-request limit rate 5/second accept | ||
+ | } | ||
+ | |||
+ | chain input { | ||
+ | type filter hook input priority 0; policy drop; | ||
+ | iifname lo accept | ||
+ | <span class=" | ||
+ | <span class=" | ||
+ | tcp dport { 22, 80, 443} accept | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | Solution extraite de la [[https:// | ||
+ | * ** limit rate** permet de limiter la fréquence de réception des paquets icmp «echo-request», | ||
+ | * **vmap** pourrait être comparé à un dictionnaire, | ||
+ | * **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:47 par prof