nft intègre les ensembles (set) en natif. On distingue les ensembles anonymes intégrés directement dans les règles et ne pouvant pas être modifiés des ensembles nommés dont le contenu pourra être mis à jour.
# nft en mode interactif
# L'ensemble utilisé dans cet règle est anonyme et ne pourra pas être modifié
nft> add rule
Dans l'exemple ci-dessous on crée un ensemble “resolveurs” dans la table “filter” puis on y ajoute des éléments:
nft> add set filter resolveurs { type ipv4_addr; comment "Resolveurs DNS de confiance";}
# Ajout des éléments à l'ensemble
nft> add element filter resolveurs { 192.9.200.8,192.9.200.231}
nft> add element ip filter resolveurs {208.67.220.220,208.67.222.222}
On peut à présent utiliser l'ensemble dans une règle. Pour l'exemple on autorise les communications sortantes en direction des résolveurs de confiance:
nft> add rule filter output ct state new ip daddr @resolveurs tcp dport 53 counter accept comment "Autorise DNS vers resolveurs de confiance"
Pour lister les ensembles :
nft list sets
Afficher les attributs détaillés (les éléments) d'un ensemble déterminé:
# nft list set [family] aTable setName nft list set filter resolveurs
Il est possible de peupler un ensemble en indiquant un FQDN plutôt qu'une adresse IP
nft> add set aTable aSet { type ipv4_addr ; timeout 24h ;} nft> add element aTable aSet { "server.domain.tld" }
Sources :