Table des matières
Quelques nouveautés en vrac
Persistance
Avec iptables
et consorts, pour rendre les règles persistantes, il fallait avoir recours à des scripts lancés après l'initialisation des interfaces réseau ou utiliser les services du paquet “iptables-persistent”. Ici, le paquet nftables
fournit un service pour systemd
qui peut être activé, nous l'avons vu, permettant alors de charger toutes les règles contenues dans /etc/nftables.conf
.
Scripts
le service nftables.service
permet d'exécuter le fichier /etc/nftables.conf
. Rappelons que ce fichier doit commencer par la ligne #!/usr/sbin/nft -f
, dans la tradition des scripts shell. Autrement dit, /etc/nftables.conf
est à considérer comme un script. et généralement dans un script, on peut:
Insérer des commentaires
Il suffit de commencer la ligne par un “sharp”:
# ceci est un commentaire
Définir des variables
des choses simples comme:
define ifLan = enp7s0 define ifWan = enp1s0
Ce qui nous permettra de rendre les règles bien plus lisibles.
Aussi des “sets”. Par exemple:
define open_dns = {208.67.222.123, 208.67.220.123}
Exemple
Supposons que nous voulions empêcher les clients de notre lan (192.168.61.0/24) d'utiliser les serveurs “open DNS”, nous pourrions modifier notre /etc/nftables.conf
de la façon suivante:
#!/usr/sbin/nft -f # Pour rendre les règles plus lisibles define ifLan = enp7s0 define ifWan = enp1s0 define open_dns = {208.67.222.123, 208.67.220.123} table ip nat { chain PREROUTING { type nat hook prerouting priority -100; policy accept; } chain INPUT { type nat hook input priority 100; policy accept; } chain POSTROUTING { type nat hook postrouting priority 100; policy accept; oifname $ifWan counter packets 1 bytes 76 masquerade } chain OUTPUT { type nat hook output priority -100; policy accept; } } table ip filter { chain INPUT { type filter hook input priority 0; policy accept; iifname "lo" counter packets 0 bytes 0 accept iifname $ifLan counter packets 0 bytes 0 accept } chain FORWARD { type filter hook forward priority 0; policy accept; # open_dns ne passera pas ! ip daddr $open_dns counter packets 0 bytes 0 drop iifname $ifLan oifname $ifWan ct state established,related,new counter packets 0 bytes 0 accept iifname $ifWan oifname $ifLan ct state established,related counter packets 0 bytes 0 accept } chain OUTPUT { type filter hook output priority 0; policy accept; oifname "lo" counter packets 0 bytes 0 accept oifname $ifLan counter packets 0 bytes 0 accept } }Bien entendu, une fois ce script exécuté,
nft list ruleset
affichera les “vraies” valeurs sans les commentaires.
Éclatement
Dans le cas où nous aurions un très grand nombre de chaînes et de règles dans ces chaînes, il serait alors possible de créer par exemple un fichier par chaîne et de les faire lire séquentiellement par /etc/nftables.conf
en s'y prenant comme ceci (c'est juste un exemple):
Création d'un répertoire /etc/nftables
:
mkdir /etc/nftables
Création d'un fichier /etc/nftables.conf
contenant ceci:
#!/usr/sbin/nft -f # include all files in a given directory using an absolute path include "/etc/nftables/*.nft"
Les fichiers du répertoire /etc/nftables
seront alors lus par ordre alphabétique. Attention donc à les nommer de façon cohérente.
Nous pouvons donc créer dans /etc/nftables
un fichier 00-variables.nft
contenant:
# Pour rendre les règles plus lisibles define ifLan = enp7s0 define ifWan = enp1s0 define open_dns = {208.67.222.123, 208.67.220.123}
un fichier 10-nat.nft
contenant:
table ip nat { chain PREROUTING { type nat hook prerouting priority -100; policy accept; } chain INPUT { type nat hook input priority 100; policy accept; } chain POSTROUTING { type nat hook postrouting priority 100; policy accept; oifname $ifWan counter packets 1 bytes 76 masquerade } chain OUTPUT { type nat hook output priority -100; policy accept; } }
et un fichier 20-filter.nft
contenant:
table ip filter { chain INPUT { type filter hook input priority 0; policy accept; iifname "lo" counter packets 0 bytes 0 accept iifname $ifLan counter packets 0 bytes 0 accept } chain FORWARD { type filter hook forward priority 0; policy accept; # open_dns ne passera pas ! ip daddr $open_dns counter packets 0 bytes 0 drop iifname $ifLan oifname $ifWan ct state established,related,new counter packets 0 bytes 0 accept iifname $ifWan oifname $ifLan ct state established,related counter packets 0 bytes 0 accept } chain OUTPUT { type filter hook output priority 0; policy accept; oifname "lo" counter packets 0 bytes 0 accept oifname $ifLan counter packets 0 bytes 0 accept } }
Je vous laisse vérifier que ça fonctionne.
Nous pouvons nous douter que nftables
va s'avérer plus facile à maintenir que le bon vieux filtrage par iptables
.