Outils pour utilisateurs

Outils du site


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.nftcontenant:

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.

Quelques nouveautés en vrac: Dernière modification le: 20/06/2025 à 14:46 par prof