KYOSH1RO

◀ Cheatsheets / CYBERSÉCURITÉ

nftables & iptables — Pare-feu Linux avancé

Comprendre et administrer le pare-feu Linux avec nftables et iptables : règles, chaînes, politiques, NAT, journalisation, persistance, migration et dépannage.

Filtrer
nftables est l'interface moderne du pare-feu Netfilter sous Linux. iptables reste très présent dans les scripts et les anciennes distributions, mais de nombreux systèmes exécutent aujourd'hui iptables au-dessus du backend nftables.

Avant toute modification

3 cmds
● Conserver une seconde session SSH ouverte
● Sauvegarder le ruleset actuel avant de modifier les politiques
● Autoriser SSH avant d'appliquer une politique input drop
● Tester le fichier avec nft -c avant de le charger
● Prévoir un accès console ou une tâche de retour arrière
Attention : une mauvaise règle peut couper immédiatement l'accès réseau. Ne jamais lancer flush ruleset à distance sans configuration complète prête, validée et mécanisme de récupération.
sudo nft list ruleset > /root/nftables-avant-modification.nftSauvegarder les règles nftables
sudo iptables-save > /root/iptables-avant-modification.rulesSauvegarder les règles iptables
sudo ss -lntupVérifier les services réellement en écoute

Concepts nftables

4 cmds
● Une table regroupe des chaînes, règles, sets et objets
● Une chaîne de base est reliée à un hook : input, output, forward, prerouting ou postrouting
● La famille inet traite IPv4 et IPv6 dans les mêmes chaînes de filtrage
● Une règle associe des critères à une action comme accept, drop, reject, log ou counter
● La policy définit le verdict par défaut d'une chaîne de base
sudo nft list tablesLister les tables
sudo nft list rulesetAfficher toutes les règles
sudo nft -n -a list rulesetAfficher en numérique avec les handles
sudo nft list table inet filterAfficher une table précise

Créer une table et des chaînes

4 cmds
sudo nft add table inet filter
sudo nft 'add chain inet filter input { type filter hook input priority filter; policy accept; }'
sudo nft 'add chain inet filter forward { type filter hook forward priority filter; policy drop; }'
sudo nft 'add chain inet filter output { type filter hook output priority filter; policy accept; }'
Commencer avec une policy accept, ajouter et tester les règles indispensables, puis seulement basculer la chaîne input vers drop.

Règles d'entrée essentielles

7 cmds
sudo nft add rule inet filter input iifname "lo" counter acceptAutoriser loopback
sudo nft add rule inet filter input ct state invalid counter dropRejeter les états invalides
sudo nft add rule inet filter input ct state established,related counter acceptAutoriser les connexions existantes
sudo nft add rule inet filter input ip protocol icmp counter acceptAutoriser ICMP IPv4
sudo nft add rule inet filter input ip6 nexthdr ipv6-icmp counter acceptAutoriser ICMPv6
sudo nft add rule inet filter input ip saddr 192.168.1.0/24 tcp dport 22 ct state new counter acceptSSH depuis le LAN
sudo nft add rule inet filter input tcp dport '{ 80, 443 }' ct state new counter acceptHTTP et HTTPS
ICMPv6 est nécessaire au bon fonctionnement d'IPv6. Ne pas le bloquer globalement comme s'il s'agissait d'un service facultatif.

Ruleset de base persistant

28 cmds
Exemple de /etc/nftables.conf pour un serveur web administré depuis le réseau local. Adapter l'interface, le sous-réseau et les ports avant utilisation.
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
set ssh_admins {
type ipv4_addr
flags interval
elements = { 192.168.1.0/24 }
}
chain input {
type filter hook input priority filter; policy drop;
iifname "lo" counter accept
ct state invalid counter drop
ct state established,related counter accept
ip protocol icmp counter accept
ip6 nexthdr ipv6-icmp counter accept
ip saddr @ssh_admins tcp dport 22 ct state new counter accept
tcp dport { 80, 443 } ct state new counter accept
limit rate 5/second log prefix "nft-input-drop: " counter drop
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}
sudo nft -c -f /etc/nftables.confValider sans appliquer
sudo nft -f /etc/nftables.confCharger le fichier validé
sudo nft list rulesetContrôler le résultat

Utiliser des sets

5 cmds
Les sets évitent de multiplier les règles identiques et permettent de modifier une liste d'adresses ou de ports efficacement.
sudo nft 'add set inet filter admins { type ipv4_addr; flags interval; }'
sudo nft add element inet filter admins '{ 192.168.1.10, 192.168.1.20, 10.10.0.0/24 }'
sudo nft add rule inet filter input ip saddr @admins tcp dport 22 counter accept
sudo nft delete element inet filter admins '{ 192.168.1.20 }'
sudo nft list set inet filter admins

Ajouter, insérer et supprimer une règle

5 cmds
sudo nft add rule inet filter input tcp dport 8080 counter acceptAjouter en fin de chaîne
sudo nft insert rule inet filter input tcp dport 22 counter acceptInsérer au début
sudo nft -a list chain inet filter inputTrouver le handle
sudo nft delete rule inet filter input handle 12Supprimer par handle
sudo nft flush chain inet filter inputVider une chaîne — dangereux à distance
Le handle peut changer après un rechargement complet. Toujours le relire avec nft -a juste avant une suppression.

Compteurs et journalisation

5 cmds
sudo nft list countersLister les compteurs nommés
sudo nft reset countersRemettre les compteurs à zéro
sudo journalctl -k -g 'nft-input-drop'Filtrer les logs noyau nftables
sudo dmesg --level=warn,errVoir les messages noyau récents
limit rate 5/second burst 10 packets log prefix "nft-drop: " counter drop
Toujours limiter les règles de log. Sans limite, un scan ou une attaque peut saturer les journaux et masquer les événements importants.

Routage et NAT

9 cmds
Activer le transfert IPv4
sysctl net.ipv4.ip_forward
sudo sysctl -w net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-router.conf
sudo sysctl --system
Masquerader un réseau privé
sudo nft add table ip nat
sudo nft 'add chain ip nat postrouting { type nat hook postrouting priority srcnat; policy accept; }'
sudo nft add rule ip nat postrouting oifname "eth0" ip saddr 10.10.0.0/24 counter masquerade
Autoriser le forwarding
sudo nft add rule inet filter forward ct state established,related counter accept
sudo nft add rule inet filter forward iifname "lan0" oifname "eth0" ip saddr 10.10.0.0/24 counter accept

Persistance nftables

5 cmds
sudo nft list ruleset > /etc/nftables.confExporter le ruleset actuel
sudo nft -c -f /etc/nftables.confVérifier le fichier
sudo systemctl enable --now nftablesActiver le service au démarrage
sudo systemctl status nftables
sudo journalctl -u nftables -bLogs du chargement au démarrage
Le chemin et le service peuvent varier selon la distribution. Sur Debian et Ubuntu, le paquet nftables utilise généralement /etc/nftables.conf.

iptables — commandes essentielles

12 cmds
sudo iptables -SRègles IPv4 sous forme de commandes
sudo iptables -L -n -v --line-numbersRègles, compteurs et numéros
sudo ip6tables -SRègles IPv6
sudo iptables -A INPUT -i lo -j ACCEPTAutoriser loopback
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTConnexions établies
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPTSSH depuis le LAN
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPTHTTP et HTTPS
sudo iptables -P INPUT DROPPolitique par défaut — après les autorisations
Supprimer et sauvegarder
sudo iptables -L INPUT -n -v --line-numbers
sudo iptables -D INPUT 4Supprimer la règle numéro 4
sudo iptables-save > /root/iptables.rules
sudo iptables-restore < /root/iptables.rules

Savoir quel backend iptables utilise

3 cmds
iptables --versionAffiche souvent nf_tables ou legacy
sudo update-alternatives --display iptablesBackend sélectionné sur Debian et Ubuntu
sudo nft list rulesetVoir si les règles iptables apparaissent dans nftables
Ne pas administrer simultanément le même flux avec des règles nftables natives et des scripts iptables sans comprendre l'ordre des hooks. Le résultat devient difficile à prédire et à dépanner.

Traduire iptables vers nftables

5 cmds
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
iptables-restore-translate -f /root/iptables.rules
sudo iptables-save > /root/iptables-a-migrer.rules
sudo iptables-restore-translate -f /root/iptables-a-migrer.rules > /root/nftables-migre.nft
sudo nft -c -f /root/nftables-migre.nft
La traduction aide à démarrer, mais elle ne remplace pas une relecture. Profiter de la migration pour regrouper les règles avec des sets et adopter une table inet cohérente.

Docker et le pare-feu

4 cmds
Docker crée ses propres règles pour les réseaux bridge et les ports publiés. Une politique INPUT stricte ne suffit pas toujours à filtrer les flux transférés vers les conteneurs, qui passent par le chemin FORWARD.
sudo nft list ruleset | lessInspecter les règles ajoutées par Docker
sudo iptables -S DOCKER-USERChaîne de filtrage utilisateur avec le backend iptables
docker network inspect bridgeVoir le sous-réseau Docker par défaut
sudo conntrack -LExaminer les connexions suivies
Ne pas vider aveuglément les tables gérées par Docker. Placer les règles personnalisées dans les mécanismes prévus par la version et le backend Docker utilisés, puis tester les ports depuis une autre machine.

Retour arrière et dépannage

7 cmds
sudo nft -c -f /root/nftables-avant-modification.nftVérifier la sauvegarde
sudo nft -f /root/nftables-avant-modification.nftRestaurer nftables
sudo iptables-restore < /root/iptables-avant-modification.rulesRestaurer iptables
sudo nft add rule inet filter input ip saddr 192.0.2.10 meta nftrace set 1Marquer temporairement une IP de test
sudo nft monitor traceTracer les paquets marqués nftrace
sudo tcpdump -ni any port 22Vérifier l'arrivée du trafic SSH
sudo ss -lntupVérifier que le service écoute

Checklist

● Le ruleset actuel est sauvegardé
● SSH est autorisé depuis l'adresse d'administration
● Les connexions established,related sont acceptées
● ICMP et ICMPv6 nécessaires sont traités
● Le fichier passe nft -c sans erreur
● Les logs sont limités en fréquence
● La persistance a été testée après redémarrage
● Les ports sont testés depuis une machine extérieure

Aucune commande ne correspond à ce filtre.