Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Règles de pare-feu : drop, reject et ordre

Après cette leçon: Je peux écrire une règle de pare-feu et dire ce que voit l'autre côté.

Leçon de 55 min12 commandesLab de passerelle NAT : masquerade et redirection de port avec nftables dans le navigateur

Le silence qui a coûté un après-midi

Une développeuse n'arrive pas à joindre un serveur de test. La page reste figée. Elle attend, réessaie et appelle l'équipe réseau.

Un refus lui aurait dit en une seconde que le serveur était en marche. Le silence ne lui a rien dit.

Cette leçon montre pourquoi un pare-feu peut être silencieux ou bruyant, et ce qui décide.

À la fin de cette leçon

Remarque

Je peux écrire une règle de pare-feu et dire ce que voit l'autre côté.

Mots clés

MotCe que ça veut direExemple
Pare-feudes règles qui décident quels paquets passent
Chaîneune liste de règles, lues dans l'ordre
Politiquece qui arrive à un paquet qu'aucune règle ne retient
Dropjeter un paquet sans aucune réponse
Rejectrefuser un paquet et le dire à l'expéditeur
Crochetl'endroit du trajet d'un paquet où une chaîne est lueinput

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Une chaîne est une liste avec une politique

Un pare-feu garde ses règles dans une chaîne. Un paquet est comparé aux règles depuis le haut. La première règle qui correspond décide, et les autres ne sont pas lues.

Si aucune règle ne correspond, c'est la politique qui décide. La chaîne de la passerelle a ici la politique drop : elle ne laisse passer que ce qu'une règle autorise.

Lire la chaîne forward de la passerelle

Commande
sudo ip netns exec gw nft list chain inet filter forward

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Exemple : lire cette chaîne ligne par ligne

LigneEn mots simples
hook forward ... policy dropLire les paquets qui traversent, et jeter ce qu'aucune règle n'autorise
ct state established,related acceptLaisser passer les réponses aux connexions déjà ouvertes
iifname "to-lan" acceptLaisser passer tout ce qui arrive du câble du LAN

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Une règle sur une machine jette un port

Maintenant vous écrivez une règle vous-même, sur la machine LAN et pas sur la passerelle. Elle va dans une table à part, appelée entrainement, et rien n'est sauvegardé.

D'abord une table, puis une chaîne sur le crochet input, qui voit les paquets qui arrivent à cette machine, puis une règle.

Créer une table sur la machine LAN

Commande
sudo ip netns exec lan nft add table inet entrainement

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Ajouter une chaîne sur le crochet input

Commande
sudo ip netns exec lan nft add chain inet entrainement garde '{ type filter hook input priority 0 ; policy accept ; }'

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Ajouter une règle qui jette le port 8081

Commande
sudo ip netns exec lan nft add rule inet entrainement garde tcp dport 8081 drop

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Demander le port 80, sans règle

Commande
sudo ip netns exec gw curl --noproxy '*' -sS -m 3 -o /dev/null -w '%{http_code}\n' http://10.0.0.2/

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Demander le port 8081, que la règle jette

Commande
sudo ip netns exec gw curl --noproxy '*' -sS -m 3 http://10.0.0.2:8081/

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Reject dit non à voix haute

Un drop ne donne aucune réponse, donc l'expéditeur attend jusqu'à abandonner. Un reject renvoie un refus tout de suite, donc l'expéditeur le sait en un instant.

Drop est plus discret pour l'extérieur. Reject est plus aimable pour vos propres collègues, qui trouvent la panne plus vite.

Vider la chaîne

Commande
sudo ip netns exec lan nft flush chain inet entrainement garde

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Ajouter une règle qui refuse le port 8081

Commande
sudo ip netns exec lan nft add rule inet entrainement garde tcp dport 8081 reject with tcp reset

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Frapper de nouveau au port 8081

Commande
sudo ip netns exec gw nc -zv -w 2 10.0.0.2 8081

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Une erreur fréquente

Attention

On croit souvent qu'un port bloqué affiche toujours Connection refused. Ce n'est le cas que si le pare-feu fait un reject. Avec un drop, l'expéditeur voit un délai dépassé, et un délai dépassé ressemble à une machine éteinte.

La première règle qui correspond gagne

Les règles sont lues depuis le haut. Une règle ajoutée avec add va tout en bas. Une règle ajoutée avec insert va tout en haut.

Vous laissez maintenant passer une machine, la passerelle en 10.0.0.1, vers le port 8081, pendant que tous les autres restent refusés.

Insérer une règle accept au-dessus du reject

Commande
sudo ip netns exec lan nft insert rule inet entrainement garde ip saddr 10.0.0.1 tcp dport 8081 accept

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Redemander le port 8081 depuis la passerelle

Commande
sudo ip netns exec gw curl --noproxy '*' -sS -m 3 http://10.0.0.2:8081/

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Supprimer la table d'entraînement

Commande
sudo ip netns exec lan nft delete table inet entrainement

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Pour aller plus loin : compter les correspondances

Refaites la table et la chaîne. Ajoutez la règle tcp dport 8081 counter reject with tcp reset, puis frappez trois fois au port 8081 avec nc.

Listez la table avec sudo ip netns exec lan nft list table inet entrainement. Que dit le compteur, et pourquoi une équipe réseau en voudrait-elle un ? Supprimez ensuite la table.