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 [02/06/2025 14:46] – [Fichier par défaut et fonctionnement] Zatalyz | pratique:informatique:parefeu:nftables [25/06/2025 20:40] (Version actuelle) – [Sur hyperviseur exposé sur internet] Zatalyz | ||
|---|---|---|---|
| Ligne 85: | Ligne 85: | ||
| === Smurf Attack === | === Smurf Attack === | ||
| - | C'est une attaque assez sournoise. En français " | + | C'est une attaque assez sournoise. En français " |
| Il y a deux cas de figures. | Il y a deux cas de figures. | ||
| Ligne 94: | Ligne 94: | ||
| ip daddr 224.0.0.1 drop</ | ip daddr 224.0.0.1 drop</ | ||
| - | Mais si on utilise un bridge réseau (cas classique quand on a un hyperviseur), | + | 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 | + | La solution basique consiste à utiliser le nom du réseau (via un '' |
| - | ip protocol udp th dport 67 accept | + | |
| - | ip protocol udp th dport 68 accept | + | |
| - | # Bloquer les broadcasts/ | + | <code bash># Autoriser ARP (sinon |
| - | iifname | + | meta iifname |
| - | iifname != " | + | # Autoriser DHCP (indispensable avec des VMs clients DHCP) |
| + | meta iifname $IFACES_LAN ip protocol udp udp dport { 67, 68 } accept | ||
| + | # Bloquer le broadcast limité uniquement sur le WAN | ||
| + | ip daddr { 255.255.255.255, 224.0.0.1 | ||
| <WRAP center round info 100%> | <WRAP center round info 100%> | ||
| - | L' | + | L' |
| + | |||
| + | Pour ipv6, ça a encore l'air d' | ||
| </ | </ | ||
| Ligne 153: | Ligne 149: | ||
| }</ | }</ | ||
| - | On peut aussi définir des variables avec '' | + | On peut aussi définir des variables avec '' |
| - | < | + | < |
| table inet firewall { | table inet firewall { | ||
| - | | + | define tcp_ports = {80, 443} |
| - | type filter hook input priority 0; policy drop; | + | |
| - | tcp dport { $tcp_ports } ct state new accept | + | type filter hook input priority 0; policy drop; |
| + | tcp dport { $tcp_ports } ct state new accept | ||
| + | } | ||
| + | } | ||
| </ | </ | ||
| + | |||
| + | === Modulariser : une ou plusieurs chaines/ | ||
| + | Comme expliqué en intro, on peut donner n' | ||
| + | |||
| + | * Une chaine est exécutée si elle a l' | ||
| + | * Ou si elle a été appelé depuis une autre chaine avec '' | ||
| + | |||
| + | Par exemple : | ||
| + | < | ||
| + | table inet firewall { | ||
| + | chain inbound { | ||
| + | type filter hook input priority 0; policy drop; | ||
| + | jump machinssh | ||
| + | } | ||
| + | chain machinssh { | ||
| + | counter comment " | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Pourquoi faire " | ||
| + | * Quand une règle doit être appelée plusieurs fois (par exemple pour input ET output) | ||
| + | * pour déclarer | ||
| + | * Pour clarifier les blocs et potentiellement n' | ||
| + | * Il suffit de commenter un " | ||
| + | |||
| + | Exemple d' | ||
| + | < | ||
| + | ├── 00-definitions.nft | ||
| + | ├── 10-sets.nft | ||
| + | ├── 20-input.nft | ||
| + | ├── 30-fight.nft | ||
| + | ├── 40-confperso.nft | ||
| + | └── 99-main.nft</ | ||
| + | |||
| + | Le nftables.conf ressemblera alors à ceci : | ||
| + | <code bash nftables.conf># | ||
| + | |||
| + | flush ruleset | ||
| + | |||
| + | include "/ | ||
| + | include "/ | ||
| + | include "/ | ||
| + | include "/ | ||
| + | include "/ | ||
| + | |||
| + | Cela permet alors de ne recharger/ | ||
| === Ips martiennes === | === Ips martiennes === | ||
| Ligne 215: | Ligne 261: | ||
| J'ai mis une option : si l' | J'ai mis une option : si l' | ||
| + | |||
| + | <WRAP center round important 100%> | ||
| + | Ça < | ||
| + | </ | ||
| + | |||
| <code bash / | <code bash / | ||
| Ligne 221: | Ligne 272: | ||
| flush ruleset | flush ruleset | ||
| - | # Table sur le trafic de type input/ | + | # Table sur le trafic de type input/ |
| + | # De base on rejette tout, sauf ce qui est explicitement autorisé. | ||
| + | # Séparer ipv4 et ipv6 simplifie le travail... | ||
| table inet firewall { | table inet firewall { | ||
| - | # Liste pour bannir les IP malveillantes temporairement | + | # ------------------------------ |
| - | set blocklist | + | # Define : des trucs à déclarer une fois ici |
| - | | + | # ------------------------------ |
| - | # Ceci va ajuster le temps de bannissement suivant les récidives | + | # Le nom de nos interfaces |
| - | flags timeout | + | define IFACES_LAN = { " |
| + | define IFACES_WAN = { " | ||
| + | # ------------------------------ | ||
| + | # SETS - alimenter des listes suivant des critères précis | ||
| + | # ------------------------------ | ||
| + | set allowlistsys | ||
| + | | ||
| + | # Ip internes et ip fixes de sysadmin | ||
| + | type ipv4_addr | ||
| + | flags interval | ||
| + | elements = { 109.190.202.194, | ||
| } | } | ||
| - | # Et ceci est le compteur pour les récidivistes | + | # Blocklist : ce qui est bloqué durablement. Alimenté par Reaction/ |
| - | set offender_count | + | # Interval : permet de bloquer des plages d'ip. |
| - | type addr | + | set blocklist_v4 |
| - | | + | type ipv4_addr |
| + | | ||
| } | } | ||
| - | # Set dynamique pour suivre les (plages) IP suspectes en temps réel | + | |
| - | set realtime_block | + | type ipv6_addr |
| - | type addr family inet hash | + | flags interval |
| + | } | ||
| + | | ||
| + | # Sert à " | ||
| + | set tempblock_v4 | ||
| + | type ipv4_addr | ||
| + | flags timeout | ||
| + | timeout 10s | ||
| size 1024 | size 1024 | ||
| - | timeout 10s # Timeout après 10 secondes | ||
| } | } | ||
| + | set tempblock_v6 { | ||
| + | type ipv6_addr | ||
| + | flags timeout | ||
| + | timeout 10s | ||
| + | size 1024 | ||
| + | } | ||
| + | set martienne_v4 { | ||
| + | # Adresses non-routables ou réservées, | ||
| + | type ipv4_addr | ||
| + | flags interval | ||
| + | elements = { 0.0.0.0/8, 10.0.0.0/8, 100.64.0.0/ | ||
| + | } | ||
| + | set martienne_v6 { | ||
| + | type ipv6_addr | ||
| + | flags interval | ||
| + | elements = { ::/128, ::1/128, :: | ||
| + | } | ||
| # ------------------------------ | # ------------------------------ | ||
| - | # Règles spécifiques IPv6 | + | # Autorisations explicites |
| + | # TODO : Adapter au réel ;) | ||
| # ------------------------------ | # ------------------------------ | ||
| - | chain input_ipv6 | + | chain confperso |
| - | # Paquets ICMPv6 qui ne doivent pas être rejetés, voir https:// | + | # Autoriser SSH si : |
| - | | + | |
| - | # Protège contre certaines attaques de spoofing en s' | + | |
| - | ip6 saddr fe80::/10 icmpv6 type { 130, 131, 132, 143, 151, 152, 153 } accept | + | # SSH ne sera sans doute pas sur le port 22, adapter... |
| - | + | | |
| - | # Vérifie si l' | + | |
| - | # 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 | + | # Proxmox : autoriser l’accès à l’interface web uniquement depuis certaines ip (fixes, perso) |
| - | ip6 saddr @blocklist drop | + | |
| - | # Mise à jour du compteur de récidive IPv6 | + | tcp dport 8006 drop # Refuser tout le reste |
| - | # Ces temps (10m, 30m, 1h) suffisent à limiter les attaques | + | |
| - | # et ne bloquent | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | 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) | + | |
| - | | + | |
| - | tcp flags syn 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 | # Règles génériques entrantes | ||
| Ligne 278: | Ligne 352: | ||
| type filter hook input priority 0; policy drop; | type filter hook input priority 0; policy drop; | ||
| | | ||
| - | # Vérifie si l'IP est bannie | + | # Vérifie si l'IP est bannie |
| - | ip saddr @blocklist | + | ip saddr @blocklist_v4 |
| - | | + | |
| - | ip saddr @offender_count update counter | + | |
| - | | + | ip saddr @tempblock_v4 drop |
| - | ip saddr @offender_count counter > 3 add @blocklist { ip saddr timeout 30m } | + | |
| - | | + | |
| # Autoriser le trafic de paquets " | # Autoriser le trafic de paquets " | ||
| ct state vmap { established : accept, related : accept, invalid : drop } | ct state vmap { established : accept, related : accept, invalid : drop } | ||
| + | | ||
| # Autorise le loopback | # Autorise le loopback | ||
| iifname " | iifname " | ||
| - | ## Mesures | + | # Spécial ipv6 |
| + | # Paquets ICMPv6 qui ne doivent pas être rejetés, voir https:// | ||
| + | ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, | ||
| + | # Protège contre certaines attaques de spoofing en s' | ||
| + | meta iifname $IFACES_LAN ip6 saddr fe80::/10 icmpv6 type { 130, 131, 132, 143, 151, 152, 153 } accept | ||
| + | |||
| + | # Appelle les chaines utiles | ||
| + | jump confperso | ||
| + | jump fight | ||
| + | |||
| + | } | ||
| + | |||
| + | # ------------------------------ | ||
| + | | ||
| + | # ------------------------------ | ||
| + | chain fight { | ||
| + | # Empêcher le loopback reçu ailleurs que sur lo | ||
| + | ip saddr 127.0.0.0/8 iifname != " | ||
| + | ip6 saddr ::1 iifname != " | ||
| + | # Bloquer les IP martiennes si elles ne viennent pas de LAN | ||
| + | ip saddr @martienne_v4 iifname != $IFACES_LAN drop | ||
| + | ip6 saddr @martienne_v6 iifname != $IFACES_LAN drop | ||
| + | # Attention suivant le réseau local, il faut peut-être autoriser des ip explicitement (définir un set au besoin) | ||
| + | |||
| # Autorise le ping avec une limite pour les abus / Protection contre ICMP Flood (Ping Flood) | # 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). | # 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 protocol icmp icmp type echo-request limit rate 10/second accept |
| + | | ||
| + | # Ping IPv6 | ||
| + | ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate 10/second accept | ||
| + | ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second add @tempblock_v6 { ip6 saddr } counter log prefix " | ||
| # Protection contre UDP Flood | # Protection contre UDP Flood | ||
| - | ip protocol udp limit rate over 200/second add @offender_count | + | ip protocol udp limit rate over 200/second add @tempblock_v4 |
| + | ip6 nexthdr udp limit rate over 200/second add @tempblock_v6 { ip6 saddr } counter log prefix " | ||
| + | | ||
| # Protection contre le DNS Query Flood | # Protection contre le DNS Query Flood | ||
| - | ip protocol udp th dport 53 limit rate over 50/second add @offender_count | + | ip protocol udp th dport 53 limit rate over 50/second add @tempblock_v4 |
| # Protection contre le SYN Flood, ACK Flood & RST Flood | # Protection contre le SYN Flood, ACK Flood & RST Flood | ||
| - | | + | |
| - | tcp flags ack limit rate over 100/second add @offender_count | + | # Les attaques sur syn sont plus fréquentes, |
| - | tcp flags rst limit rate over 50/second add @offender_count | + | # mais ack bénéficie de valeurs plus hautes (jusque 200) |
| + | # Bref à adapter au trafic réel (=> monitoring !) | ||
| + | tcp flags syn, | ||
| + | tcp flags ack limit rate over 100/second add @tempblock_v4 | ||
| + | ip6 nexthdr tcp tcp flags syn,rst limit rate over 50/second add @tempblock_v6 { ip6 saddr } counter log prefix " | ||
| + | ip6 nexthdr tcp tcp flags ack limit rate over 100/second add @tempblock_v6 { ip6 saddr } counter log prefix " | ||
| + | | ||
| # Protection contre le Smurf Attack | # Protection contre le Smurf Attack | ||
| - | | + | |
| - | | + | |
| - | # Attention en cas d' | + | # Autoriser DHCP (indispensable avec des VMs clients DHCP) |
| - | # Dans ce cas exclure spécifiquement d' | + | meta iifname $IFACES_LAN ip protocol udp udp dport { 67, 68 } accept |
| - | | + | # Bloquer |
| - | #iifname != " | + | ip daddr { 255.255.255.255, 224.0.0.1 |
| # Protection contre le SMTP/Email Bombing | # Protection contre le SMTP/Email Bombing | ||
| - | ip protocol tcp th dport 25 limit rate over 10/second add @offender_count | + | ip protocol tcp th dport 25 limit rate over 10/second add @tempblock_v4 |
| - | # Protection contre les botnets sur les ports fréquemment ciblés | + | # Protection contre les botnets sur les ports fréquemment ciblés |
| # tcp : telnet (23, 2323), UPnP (7547) | # tcp : telnet (23, 2323), UPnP (7547) | ||
| # udp : Memcached (11211), SSDP (1900), LDAP (389), NTP (123), IoT (48101) | # udp : Memcached (11211), SSDP (1900), LDAP (389), NTP (123), IoT (48101) | ||
| - | ip protocol tcp th dport { 23, 2323, 7547 } add @offender_count | + | ip protocol tcp th dport { 23, 2323, 7547 } add @tempblock_v4 |
| - | ip protocol udp th dport { 11211, 1900, 389, 123, 48101 } add @offender_count | + | ip protocol udp th dport { 11211, 1900, 389, 123, 48101 } add @tempblock_v4 |
| # Bloquer les scans de ports en cas de tentative de connexion rapide sur des ports multiples | # Bloquer les scans de ports en cas de tentative de connexion rapide sur des ports multiples | ||
| - | ip protocol tcp limit rate over 50/ | + | ip protocol tcp limit rate over 50/second add @tempblock_v4 |
| - | ip protocol udp limit rate over 50/ | + | ip protocol udp limit rate over 50/second add @tempblock_v4 |
| - | # 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 | + | |
| - | + | ||
| - | # 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 | + | |
| - | ip saddr @realtime_block limit rate over 200/second add @realtime_block { ip saddr } drop | + | |
| - | + | ||
| - | # Autoriser SSH si : | + | |
| - | # - source = Bastion1 (externe). mettre son ip, c'est pas 101.1.1.1 | + | |
| - | # - OU source dans le LAN 192.168.1.0/ | + | |
| - | # SSH ne sera sans doute pas sur le port 22, adapter... | + | |
| - | ip saddr { 101.1.1.1, 192.168.1.0/ | + | |
| - | # Autoriser certains ports quand les services liés sont actifs, ici le web | + | |
| - | tcp dport { 80, 443 } ct state new accept | + | |
| - | + | ||
| - | # Logging des connexions bloquées | + | |
| - | | + | |
| - | + | ||
| - | # Proxmox : autoriser l’accès à l’interface web uniquement depuis certaines ip (fixes, perso) | + | |
| - | ip saddr 10.0.0.10 tcp dport 8006 accept | + | |
| - | tcp dport 8006 drop # Refuser tout le reste | + | |
| - | | + | |
| } | } | ||
| - | |||
| # ------------------------------ | # ------------------------------ | ||
| # Règles génériques sortantes | # Règles génériques sortantes | ||
| # ------------------------------ | # ------------------------------ | ||
| + | |||
| chain output { | chain output { | ||
| # Par défaut, on rejette tout à moins de suivre une des règles ci-dessous. | # Par défaut, on rejette tout à moins de suivre une des règles ci-dessous. | ||
| type filter hook output priority 0; policy drop; | type filter hook output priority 0; policy drop; | ||
| # Autoriser le trafic de paquets " | # Autoriser le trafic de paquets " | ||
| - | ct state established accept | + | ct state established, |
| # Autorise le loopback sortant | # Autorise le loopback sortant | ||
| oifname " | oifname " | ||
| # Autorise le ping sortant | # Autorise le ping sortant | ||
| ip protocol icmp accept | ip protocol icmp accept | ||
| + | ip6 nexthdr icmpv6 accept | ||
| # Autoriser d' | # Autoriser d' | ||
| tcp dport { http, https } accept | tcp dport { http, https } accept | ||
| udp dport domain accept | udp dport domain accept | ||
| + | tcp dport domain accept | ||
| + | # Autoriser msmtp à envoyer ses mails | ||
| + | tcp dport { 25, 465, 587 } ct state new, | ||
| + | # Autoriser NTP | ||
| + | udp dport { 53, 123 } ct state new, | ||
| + | # Log de ce qui est bloqué | ||
| + | log prefix "[NFT OUTPUT DROP] " flags all drop | ||
| + | |||
| } | } | ||
| Ligne 380: | Ligne 473: | ||
| # Autoriser le trafic de paquets " | # Autoriser le trafic de paquets " | ||
| ct state established accept | ct state established accept | ||
| - | # Redirection des connexions web vers la VM 11 (proxy gérant le web). TODO différence daddr/saddr | ||
| - | ip daddr 192.168.1.11 tcp dport { http, https } accept | ||
| - | ip saddr 192.168.1.11 udp dport domain accept | ||
| - | ip saddr 192.168.1.11 tcp dport { http, https } accept | ||
| - | # Mail vers la VM mail | ||
| - | ip daddr 192.168.1.10 tcp dport { 25, 143, 587, 993 } accept | ||
| - | ip saddr 192.168.1.10 tcp dport { 25, 143, 587, 993 } 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 192.168.1.11 | ||
| - | # Rediriger SMTP, IMAP, etc. vers la VM mail | ||
| - | tcp dport { 25, 143, 587, 993 } dnat to 192.168.1.10 | ||
| - | } | ||
| - | |||
| - | 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 192.168.1.11 snat to 66.66.66.66 | ||
| - | } | ||
| - | } | ||
| </ | </ | ||
| - | <WRAP center round todo 100%> | + | === Ports suivant les services |
| - | === Machine seule ==== | + | |
| - | Pour un dédié, une machine exposé directement à internet. | + | |
| - | + | ||
| - | + | ||
| - | ==== Machine terminale ==== | + | |
| - | <WRAP center round todo 60%> | + | |
| - | À reprendre | + | |
| - | </ | + | |
| - | + | ||
| - | Config dans une vm après un proxy etc. Cette machine est placée derrière un routeur (box, proxy...) qui sera un peu plus complet, et surtout qui empêche déjà de rentrer n' | + | |
| - | <code bash / | + | |
| - | # | + | |
| - | + | ||
| - | flush ruleset | + | |
| - | + | ||
| - | table inet firewall { | + | |
| - | # Règles spécifiques ipv6 | + | |
| - | chain inbound_ipv6 { | + | |
| - | # accept neighbour discovery otherwise connectivity breaks | + | |
| - | # source : https:// | + | |
| - | icmpv6 type { nd-neighbor-solicit, | + | |
| - | # TODO comprendre ! ICMPv6 packets which must not be dropped, see https:// | + | |
| - | meta nfproto ipv6 icmpv6 type { destination-unreachable, | + | |
| - | ip6 saddr fe80::/10 icmpv6 type { 130, 131, 132, 143, 151, 152, 153 } accept | + | |
| - | } | + | |
| - | + | ||
| - | # Règles génériques entrantes | + | |
| - | chain inbound { | + | |
| - | # Par défaut, on rejette tout à moins de suivre une des règles ci-dessous. | + | |
| - | type filter hook input priority 0; policy drop; | + | |
| - | # Autoriser le trafic de paquets " | + | |
| - | ct state vmap { established : accept, related : accept, invalid : drop } | + | |
| - | # Autorise le loopback | + | |
| - | iifname " | + | |
| - | # Autorise le ping avec une limite pour les abus | + | |
| - | icmp type echo-request limit rate 5/second accept | + | |
| - | # Applique les règles en plus suivant le protocole(ici ipv6, on pourrait ajouter des trucs sur ipv4) | + | |
| - | meta protocol vmap { ip6 : jump inbound_ipv6 } | + | |
| - | # 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 | + | |
| - | # Uncomment to enable logging of denied inbound traffic | + | |
| - | # log prefix " | + | |
| - | # TODO ! count and drop any other traffic | + | |
| - | #counter drop | + | |
| - | } | + | |
| - | # En sortie (output) par défaut ça autorise tout et en théorie c'est ok. | + | |
| - | # forward, nat etc : pas utile dans ce cas de figure. | + | |
| - | } | + | |
| - | + | ||
| - | </ | + | |
| Si serveur mail : remplacer | Si serveur mail : remplacer | ||
| Ligne 470: | Ligne 489: | ||
| tcp dport { 22, 80, 443, 25, 587, 993, 4190 } ct state new accept | tcp dport { 22, 80, 443, 25, 587, 993, 4190 } ct state new accept | ||
| - | + | === Todo === | |
| - | ==== Machine proxy, configuration sécuritaire ==== | + | Faire plus modulaire. Adapter quand c'est pour une VM, un dédié... Mais la config |
| - | <WRAP center round todo 60%> | + | |
| - | À reprendre ; mieux vaut utiliser ma première config ! | + | |
| - | </ | + | |
| - | Cette machine redirige une partie du trafic vers d' | + | |
| - | + | ||
| - | Ici on va desservir l'ip interne (une VM) '' | + | |
| - | + | ||
| - | <WRAP center round todo 60%> | + | |
| - | Faudra améliorer sur ipv6. | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | L' | + | |
| - | + | ||
| - | <code bash / | + | |
| - | # | + | |
| - | + | ||
| - | flush ruleset | + | |
| - | + | ||
| - | # Table sur le trafic de type input/ | + | |
| - | table inet firewall { | + | |
| - | # Règles spécifiques ipv6 | + | |
| - | chain input_ipv6 { | + | |
| - | # accept neighbour discovery otherwise connectivity breaks | + | |
| - | # source : https:// | + | |
| - | icmpv6 type { nd-neighbor-solicit, | + | |
| - | # TODO comprendre ! ICMPv6 packets which must not be dropped, see https:// | + | |
| - | meta nfproto ipv6 icmpv6 type { destination-unreachable, | + | |
| - | ip6 saddr fe80::/10 icmpv6 type { 130, 131, 132, 143, 151, 152, 153 } accept | + | |
| - | } | + | |
| - | + | ||
| - | # Règles génériques entrantes (valables | + | |
| - | chain input_all { | + | |
| - | # Par défaut, on rejette tout à moins de suivre | + | |
| - | type filter hook input priority 0; policy drop; | + | |
| - | # Autoriser le trafic de paquets " | + | |
| - | ct state vmap { established : accept, related : accept, invalid : drop } | + | |
| - | # Autorise le loopback | + | |
| - | iifname " | + | |
| - | # Autorise le ping avec une limite pour les abus | + | |
| - | icmp type echo-request limit rate 5/second accept | + | |
| - | # Applique les règles en plus suivant le protocole(ici ipv6, on pourrait ajouter des trucs sur ipv4) | + | |
| - | meta protocol vmap { ip6 : jump input_ipv6 } | + | |
| - | # 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 | + | |
| - | # Uncomment to enable logging of denied inbound traffic | + | |
| - | # log prefix " | + | |
| - | # TODO ! count and drop any other traffic | + | |
| - | #counter drop | + | |
| - | } | + | |
| - | # 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 | + | |
| - | # transfère le web ? TODO différence daddr/ | + | |
| - | 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 | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | </ | + | |
| - | </ | + | |
| Ligne 586: | Ligne 511: | ||
| sudo nft list ruleset | sudo nft list ruleset | ||
| + | Pour recharger le fichier de configuration : | ||
| + | nft -f / | ||
| + | |||
| + | Admirer en temps réel les bans ? Pour admirer le contenu d'un set (par exemple tempblock_v4), | ||
| + | sudo watch -n 1 'nft list set inet firewall tempblock_v4' | ||
| + | |||
| + | Et pour les logs, si on a activé les [[pratique: | ||
| + | tail -f / | ||
| ===== Sources ===== | ===== Sources ===== | ||