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 | ||
pratique:informatique:parefeu:nftables [23/06/2024 20:02] – [nftables.conf] Zatalyz | pratique:informatique:parefeu:nftables [30/01/2025 20:17] (Version actuelle) – [Exemples de fichiers suivant les cas] Zatalyz | ||
---|---|---|---|
Ligne 13: | Ligne 13: | ||
===== nftables.conf ===== | ===== nftables.conf ===== | ||
Ce fichier ''/ | Ce fichier ''/ | ||
+ | |||
+ | ==== Fichier par défaut et fonctionnement ==== | ||
Fichier par défaut sur ma Debian : | Fichier par défaut sur ma Debian : | ||
Ligne 46: | Ligne 48: | ||
Quelque soit la version, je préfère une politique où je refuse tout, en dehors de ce qui est explicitement autorisé. | Quelque soit la version, je préfère une politique où je refuse tout, en dehors de ce qui est explicitement autorisé. | ||
+ | |||
+ | ==== Options ==== | ||
+ | Je ne vais pas tout décrire, y'a la doc pour ça, juste ce que j'ai trouvé à utiliser et pourquoi (quand ça ne me semblait pas explicite avec un petit commentaire dans la configuration). | ||
+ | |||
+ | === IPv6 === | ||
+ | Sur la partie ipv6, j'ai ajouté la ligne suivante sans trop comprendre((Copié de [[https:// | ||
+ | |||
+ | < | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Ces paquets sont nécessaires au bon fonctionnement d'IPv6 et doivent donc être acceptés, au risque sinon de casser le réseau, d' | ||
+ | |||
+ | < | ||
+ | Cette règle protège contre certaines attaques de spoofing en s' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | == Smurf Attack == | ||
+ | C'est une attaque assez sournoise. En français " | ||
+ | |||
+ | Il y a deux cas de figures. | ||
+ | |||
+ | On est sur un dédié, pas de réseau sous forme de bridge, on met ces lignes : | ||
+ | < | ||
+ | ip daddr 255.255.255.255 drop | ||
+ | ip daddr 224.0.0.1 drop</ | ||
+ | |||
+ | Mais si on utilise un bridge réseau (cas classique quand on a un hyperviseur), | ||
+ | < | ||
+ | iifname != " | ||
+ | iifname != " | ||
+ | Ou même autoriser explicitement ARP (adresses MAC) et DHCP : | ||
+ | < | ||
+ | # Laisser passer ARP (sinon les VM ne pourront pas résoudre les adresses IP en MAC) | ||
+ | arp accept | ||
+ | |||
+ | # Laisser passer DHCP (car les requêtes DHCP utilisent 255.255.255.255) | ||
+ | ip protocol udp th dport 67 accept | ||
+ | ip protocol udp th dport 68 accept | ||
+ | |||
+ | # Bloquer les broadcasts/ | ||
+ | iifname != " | ||
+ | iifname != " | ||
+ | |||
+ | <WRAP center round info 100%> | ||
+ | L' | ||
+ | </ | ||
==== Autres éléments de syntaxe ==== | ==== Autres éléments de syntaxe ==== | ||
Ligne 92: | Ligne 158: | ||
==== Exemples de fichiers suivant les cas ==== | ==== Exemples de fichiers suivant les cas ==== | ||
+ | === Machine seule === | ||
+ | Pour un dédié, une machine exposé directement à internet, voici la configuration de base. On va adapter un peu dans les chapitres suivants pour les fonctionnements avec hyperviseurs et machines derrière des proxy. | ||
+ | |||
+ | C'est abondament commenté pour s'y retrouver... | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | Ce qui suit demande à être relu et adapté suivant le contexte ! | ||
+ | </ | ||
+ | <WRAP center round todo 60%> | ||
+ | D' | ||
+ | </ | ||
+ | |||
+ | |||
+ | <code bash / | ||
+ | # | ||
+ | |||
+ | flush ruleset | ||
+ | |||
+ | # Table sur le trafic de type input/ | ||
+ | table inet firewall { | ||
+ | # Liste pour bannir les IP malveillantes temporairement | ||
+ | set blocklist { | ||
+ | type addr | ||
+ | # Ceci va ajuster le temps de bannissement suivant les récidives | ||
+ | flags timeout | ||
+ | } | ||
+ | # Et ceci est le compteur pour les récidivistes | ||
+ | set offender_count { | ||
+ | type addr | ||
+ | counters | ||
+ | } | ||
+ | # Set dynamique pour suivre les (plages) IP suspectes en temps réel | ||
+ | set realtime_block { | ||
+ | type addr family inet hash | ||
+ | size 1024 | ||
+ | timeout 10s # Timeout après 10 secondes | ||
+ | } | ||
+ | |||
+ | # ------------------------------ | ||
+ | # Règles spécifiques IPv6 | ||
+ | # ------------------------------ | ||
+ | chain input_ipv6 { | ||
+ | # Paquets ICMPv6 qui ne doivent pas être rejetés, voir https:// | ||
+ | meta nfproto ipv6 icmpv6 type { destination-unreachable, | ||
+ | # Protège contre certaines attaques de spoofing en s' | ||
+ | ip6 saddr fe80::/10 icmpv6 type { 130, 131, 132, 143, 151, 152, 153 } accept | ||
+ | |||
+ | # Vérifie si l'IP est bannie | ||
+ | # On différencie ipv4 et ipv6 parce que si les règles sont les mêmes (cf plus bas), | ||
+ | # visiblement ça va aider de filtrer par type d'ip | ||
+ | ip6 saddr @blocklist drop | ||
+ | # Mise à jour du compteur de récidive IPv6 | ||
+ | # Ces temps (10m, 30m, 1h) suffisent à limiter les attaques sans trop grossir la BL | ||
+ | # et ne bloquent pas un humain de façon trop violente. | ||
+ | ip6 saddr @offender_count update counter | ||
+ | ip6 saddr @offender_count counter > 5 add @blocklist { ip6 saddr timeout 1h } | ||
+ | ip6 saddr @offender_count counter > 3 add @blocklist { ip6 saddr timeout 30m } | ||
+ | ip6 saddr @offender_count counter > 1 add @blocklist { ip6 saddr timeout 10m } | ||
+ | |||
+ | # Protection contre les attaques IPv6 (flood udp, syn, ack, rst, ping (on accepte) | ||
+ | ip6 nexthdr udp limit rate over 200/second add @offender_count { ip6 saddr } drop | ||
+ | tcp flags syn limit rate over 100/second add @offender_count { ip6 saddr } drop | ||
+ | tcp flags ack limit rate over 100/second add @offender_count { ip6 saddr } drop | ||
+ | tcp flags rst limit rate over 50/second add @offender_count { ip6 saddr } drop | ||
+ | icmpv6 type echo-request limit rate 10/second accept | ||
+ | icmpv6 type echo-request limit rate over 10/second add @offender_count { ip6 saddr } drop | ||
+ | } | ||
+ | |||
+ | # ------------------------------ | ||
+ | # Règles génériques entrantes | ||
+ | # ------------------------------ | ||
+ | chain input_all { | ||
+ | # Par défaut, on rejette tout à moins de suivre une des règles ci-dessous. | ||
+ | type filter hook input priority 0; policy drop; | ||
+ | | ||
+ | # Vérifie si l'IP est bannie | ||
+ | ip saddr @blocklist drop | ||
+ | # Mise à jour du compteur de récidive IPv4 | ||
+ | ip saddr @offender_count update counter | ||
+ | ip saddr @offender_count counter > 5 add @blocklist { ip saddr timeout 1h } | ||
+ | ip saddr @offender_count counter > 3 add @blocklist { ip saddr timeout 30m } | ||
+ | ip saddr @offender_count counter > 1 add @blocklist { ip saddr timeout 10m } | ||
+ | |||
+ | # Autoriser le trafic de paquets " | ||
+ | ct state vmap { established : accept, related : accept, invalid : drop } | ||
+ | # Autorise le loopback | ||
+ | iifname " | ||
+ | |||
+ | ## Mesures anti-DDoS | ||
+ | # Autorise le ping avec une limite pour les abus / Protection contre ICMP Flood (Ping Flood) | ||
+ | # Ping normal : 1/s. Attention des outils de monitorings peuvent être plus rapides (jusque 20/s). | ||
+ | icmp type echo-request limit rate 10/second accept | ||
+ | icmp type echo-request limit rate over 10/second add @offender_count { ip saddr } drop | ||
+ | |||
+ | # Protection contre UDP Flood | ||
+ | ip protocol udp limit rate over 200/second add @offender_count { ip saddr } drop | ||
+ | |||
+ | # Protection contre le DNS Query Flood | ||
+ | ip protocol udp th dport 53 limit rate over 50/second add @offender_count { ip saddr } drop | ||
+ | |||
+ | # Protection contre le SYN Flood, ACK Flood & RST Flood | ||
+ | tcp flags syn limit rate over 100/second add @offender_count { ip saddr } drop | ||
+ | tcp flags ack limit rate over 100/second add @offender_count { ip saddr } drop | ||
+ | tcp flags rst limit rate over 50/second add @offender_count { ip saddr } drop | ||
+ | |||
+ | # Protection contre le Smurf Attack | ||
+ | ip daddr 255.255.255.255 drop | ||
+ | ip daddr 224.0.0.1 drop | ||
+ | # Attention en cas d' | ||
+ | # Dans ce cas exclure spécifiquement d' | ||
+ | #iifname != " | ||
+ | #iifname != " | ||
+ | |||
+ | # Protection contre le SMTP/Email Bombing | ||
+ | ip protocol tcp th dport 25 limit rate over 10/second add @offender_count { ip saddr } drop | ||
+ | |||
+ | # Protection contre les botnets sur les ports fréquemment ciblés | ||
+ | # tcp : telnet (23, 2323), UPnP (7547) | ||
+ | # udp : Memcached (11211), SSDP (1900), LDAP (389), NTP (123), IoT (48101) | ||
+ | ip protocol tcp th dport { 23, 2323, 7547 } add @offender_count { ip saddr } drop | ||
+ | ip protocol udp th dport { 11211, 1900, 389, 123, 48101 } add @offender_count { ip saddr } drop | ||
+ | |||
+ | # Bloquer les scans de ports en cas de tentative de connexion rapide sur des ports multiples | ||
+ | ip protocol tcp limit rate over 50/second counter add @offender_count { ip saddr } drop | ||
+ | ip protocol udp limit rate over 50/second counter add @offender_count { ip saddr } drop | ||
+ | # Règle de détection de scan de port via compteur (connexions multiples sur des ports distincts, ici 50 ports/ | ||
+ | ip protocol tcp sport != 0 limit rate over 50/second add @offender_count { ip saddr } drop | ||
+ | |||
+ | # Gestion des IP malveillantes (liste noire) | ||
+ | ip saddr @blocklist drop | ||
+ | |||
+ | # Applique les règles en plus suivant le protocole (ici ipv6) | ||
+ | meta protocol vmap { ip6 : jump input_ipv6 } | ||
+ | |||
+ | # Realtime Blocking pour détecter les attaques basées sur des plages d'IP | ||
+ | ip saddr @realtime_block counter add @realtime_block { ip saddr } drop | ||
+ | ip saddr @realtime_block limit rate over 200/second add @realtime_block { ip saddr } drop | ||
+ | | ||
+ | # Autoriser certains ports quand les services liés sont actifs (donc à adapter), ici le web et ssh | ||
+ | tcp dport { 22, 80, 443 } ct state new accept | ||
+ | |||
+ | # Logging des connexions bloquées | ||
+ | log prefix " | ||
+ | } | ||
+ | |||
+ | # ------------------------------ | ||
+ | # Règles génériques sortantes | ||
+ | # ------------------------------ | ||
+ | chain output { | ||
+ | # Par défaut, on rejette tout à moins de suivre une des règles ci-dessous. | ||
+ | type filter hook output priority 0; policy drop; | ||
+ | # Autoriser le trafic de paquets " | ||
+ | ct state established accept | ||
+ | # Autorise le loopback sortant | ||
+ | oifname " | ||
+ | # Autorise le ping sortant | ||
+ | ip protocol icmp accept | ||
+ | # Autoriser d' | ||
+ | tcp dport { http, https } accept | ||
+ | udp dport domain accept | ||
+ | } | ||
+ | |||
+ | # ------------------------------ | ||
+ | # Règles génériques " | ||
+ | # ------------------------------ | ||
+ | chain forward { | ||
+ | # Par défaut, on rejette tout à moins de suivre une des règles ci-dessous. | ||
+ | type filter hook forward priority 0; policy drop; | ||
+ | # Autoriser le trafic de paquets " | ||
+ | ct state established accept | ||
+ | # Redirection des connexions web vers la VM 69 (si c'est le proxy). TODO différence daddr/saddr | ||
+ | ip daddr 10.10.10.69 tcp dport { http, https } accept | ||
+ | ip saddr 10.10.10.69 udp dport domain accept | ||
+ | ip saddr 10.10.10.69 tcp dport { http, https } accept | ||
+ | } | ||
+ | } | ||
+ | |||
+ | # Table sur le trafic de type prerouting/ | ||
+ | table ip nat { | ||
+ | chain prerout { | ||
+ | type nat hook prerouting priority 0; policy accept; | ||
+ | # ce qui va sur les ports web doit être redirigé vers la VM | ||
+ | tcp dport { http, https } dnat to 10.10.10.69 | ||
+ | } | ||
+ | |||
+ | chain postrout { | ||
+ | type nat hook postrouting priority 0; policy accept; | ||
+ | # Ce qui vient de la VM et qui tente de se connecter au web doit sortir par l'ip de notre proxy | ||
+ | # Sinon on est redirigé sur nous-même... | ||
+ | ip saddr 10.10.10.69 snat to 66.66.66.66 | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
=== Machine terminale === | === Machine terminale === | ||
+ | <WRAP center round todo 60%> | ||
+ | À reprendre | ||
+ | </ | ||
- | Premier cas : serveur " | + | Config |
- | < | + | < |
# | # | ||
Ligne 108: | Ligne 371: | ||
icmpv6 type { nd-neighbor-solicit, | icmpv6 type { nd-neighbor-solicit, | ||
# TODO comprendre ! ICMPv6 packets which must not be dropped, see https:// | # TODO comprendre ! ICMPv6 packets which must not be dropped, see https:// | ||
- | meta nfproto ipv6 icmpv6 type { destination-unreachable, | + | meta nfproto ipv6 icmpv6 type { destination-unreachable, |
ip6 saddr fe80::/10 icmpv6 type { 130, 131, 132, 143, 151, 152, 153 } accept | ip6 saddr fe80::/10 icmpv6 type { 130, 131, 132, 143, 151, 152, 153 } accept | ||
} | } | ||
Ligne 136: | Ligne 399: | ||
</ | </ | ||
+ | |||
+ | Si serveur mail : remplacer | ||
+ | # Autoriser certains ports quand les services liés sont actifs (donc à adapter), ici le web et ssh | ||
+ | tcp dport { 22, 80, 443 } ct state new accept | ||
+ | Par | ||
+ | # Autoriser certains ports quand les services liés sont actifs : web (80/443), ssh (22), | ||
+ | # smtp (25), SMTP TLS (587), IMAPS (993), Sieve (4190) | ||
+ | tcp dport { 22, 80, 443, 25, 587, 993, 4190 } ct state new accept | ||
+ | |||
=== Machine proxy, configuration sécuritaire === | === Machine proxy, configuration sécuritaire === | ||
+ | <WRAP center round todo 60%> | ||
+ | À reprendre ; mieux vaut utiliser ma première config ! | ||
+ | </ | ||
Cette machine redirige une partie du trafic vers d' | Cette machine redirige une partie du trafic vers d' | ||
Ligne 149: | Ligne 424: | ||
L' | L' | ||
- | < | + | < |
# | # | ||
Ligne 243: | Ligne 518: | ||
sudo systemctl enable nftables.service | sudo systemctl enable nftables.service | ||
sudo service nftables start | sudo service nftables start | ||
+ | |||
+ | |||
+ | Pour lister les règles en place : | ||
+ | sudo nft list ruleset | ||
==== Sources ==== | ==== Sources ==== |