#!/usr/sbin/nft -f flush ruleset # Table sur le trafic de type input/output/forward. De base on rejette tout, sauf ce qui est explicitement autorisé. table inet firewall { # Règles spécifiques ipv6 chain input_ipv6 { # accept neighbour discovery otherwise connectivity breaks # source : https://wiki.nftables.org/wiki-nftables/index.php/Simple_ruleset_for_a_server icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept # TODO comprendre ! ICMPv6 packets which must not be dropped, see https://tools.ietf.org/html/rfc4890#section-4.4.1 meta nfproto ipv6 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, echo-reply, echo-request, nd-router-solicit,> ip6 saddr fe80::/10 icmpv6 type { 130, 131, 132, 143, 151, 152, 153 } accept } # Règles génériques entrantes (valables pour ipv6 et ipv4) 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; # Autoriser le trafic de paquets "etablished" et associés, supprimer les paquets non valides ct state vmap { established : accept, related : accept, invalid : drop } # Autorise le loopback iifname "lo" accept # 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 "[nftables] Inbound Denied: " counter drop # 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 "etablished" et associés, supprimer les paquets non valides ct state established accept # Autorise le loopback sortant oifname "lo" accept # Autorise le ping sortant ip protocol icmp accept # Autoriser d'aller sur internet et de contacter les dns (domain) tcp dport { http, https } accept udp dport domain accept } # Règles génériques "forward" (ce qui circule vers les autres adresses routées) 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 "etablished" et associés, supprimer les paquets non valides ct state established accept # transfère le web ? 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/postrouting, par défaut sur accept pour que les connexions puissent s'initialiser 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 } }