Syntaxe :
sudo nft add table <type de table> nom_table
Exemple : Créer une table ipv4
sudo nft add table ip tableipv4
sudo nft list tables
Syntaxe :
sudo nft delete table <type de table> nom_table
Exemple : Supprimer la table précedement créée
sudo nft delete table ip tableipv4
Syntaxe :
sudo nft flush table <type de table> nom_table
Exemple : Vider la table précedement créée
sudo nft flush table ip tableipv4
filter
: Utilisé pour filtrer les flux (supporté par les familles de table arp, bridge, ip, ip6 et inet)route
: Permet de re-router les IPs (supporté par les familles de tables ip, ip6 et inet)nat
: Permet de faire du NAT (supporté par les familles de tables ip, ip6 et inet)prerouting
: La décision d'acheminement de ces paquets n'a pas encore été prise, vous ne savez donc pas s'ils sont adressés aux systèmes locaux ou distants.input
: Il se produit après la décision d'acheminement. Les paquets sont destinés à ce système.forward
: Idem que pour le input, mais cette fois le paquet est destiné à un système distant (routage).output
: Inverse du input, mais s'occupe des paquets sortant du système local.postrouting
: Après la décision de routage pour les paquets sortant du système local.ingress
: Depuis la version 4.2 du noyau Linux, permet de traiter les paquets avant le prerouting, à partir du moment ou le paquet arrive à l'interface.Syntaxe :
nft add chain [<family>] <nom de la table> <nom de la chaine> { type <type> hook <hook> priority <value> \; [policy <policy>] }
Exemple : Ajouter une chaine input
nft 'add chain ip tableipv4 input { type filter hook input priority 0 ; policy deny; }
Je créer une chaine de famille ip dans la table tableipv4 ayant de nom input de type filter avec un hook en input refusant toutes les connexions entrant non explicitement autorisées.
Liste non exaustive :
meta (méta-propriétés, exemple : interfaces)
icmp (protocole ICMP)
icmpv6 (protocole ICMPv6)
ip (protocole IP)
ip6 (protocole IPv6)
tcp (protocole TCP)
udp (protocole UDP)
sctp (protocole SCTP)
ct (suivi de connexion)
meta:
oif <INDEX interface de sortie>
iif <INDEX interface d'entrée>
oifname <NOM interface de sortie>
iifname <NOM interface d'entrée>
(oif et iif acceptent des arguments de type chaîne et sont convertis en index d'interface)
(oifname et iifname sont plus dynamiques, mais plus lents en raison de la correspondance des chaînes)
icmp:
type <type icmp>
icmpv6:
type <type icmpv6>
ip:
protocol <protocole>
daddr <adresse de destination>
saddr <adresse source>
ip6:
daddr <adresse ipv6 de destination>
saddr <adresse ipv6 source>
tcp:
dport <port de destination>
sport <port source>
udp:
dport <port de destination>
sport <port source>
sctp:
dport <port de destination>
sport <port source>
ct:
state <new | established | related | invalid>
Je vais faire la comparaison entre une règle IPTables et NFTables pour faciliter la compréhension des règles
Syntaxe globale :
nft add rule type_regle nom_table nom_chaine handle valeur_handle état
Pour :
OUTPUT
, INPUT
et FORWARD
.La position joue un rôle important dans la conception d'un pare-feu. En effet, les règles sont lues dans l'ordre. Si vous bloquer le trafic http en 1ère règle et que vous acceptez en seconde règle, alors le trafic sera bloqué.
accept, reject et drop sont similaires à IPTables. En revanche, jump est utilisé pour transmettre la requête sur une autre chaine.
IPTables :
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
L'équivalent NFTables sera :
sudo nft add rule filter INPUT ip tcp dport 80
sudo nft add rule filter INPUT ip tcp dport 443
sudo nft list ruleset > nomFichier.nft