Découvrir le pare-feu : filtrer les connexions entrantes et sortantes sur un serveur Linux
Un serveur qui héberge un site public et une interface d'administration ne devrait pas répondre à tout le monde sur tous ses ports. Comment décider qui entre, et qui sort ?
Petite vérification
Avant de commencer, vérifiez si vous savez encore répondre à ces 3 questions très simples, sur la séance précédente consacrée au smartphone personnel utilisé pour le travail :
- sous quel délai, en principe, le responsable d'un traitement doit-il notifier une violation de données à la CNIL, lorsqu'elle est susceptible d'engendrer un risque pour les personnes ?
- un employeur peut-il consulter les photos privées du téléphone personnel d'un salarié ?
- quel est le nom du droit qui prot ège le salarié des sollicitations professionnelles en dehors de son temps de travail ?
📌 Réponse attendue
TP pour réfléchir et résoudre des problèmes
Votre défi pour aujourd'hui consiste à bloquer l'accès à une interface d'administration sans toucher au service qui la fournit, puis à passer d'un pare-feu qui interdit ce qui est connu à un pare-feu qui n'autorise que ce qui est utile
L'association « Les Jardins Partagés » et son serveur sont fictifs, construits pour l'exercice.
Pour que vous puissiez tout faire seul(e) sur une seule VM, les « clients » se connectent depuis
la machine elle-même, par la boucle locale (127.0.0.1).
Vous modifiez ici le pare-feu de votre propre VM, jamais celui d'un serveur partagé. La dernière
étape vous demande de laisser passer le port 22 (SSH) : si vous êtes connecté(e) à votre VM par
SSH, ne l'oubliez jamais, sous peine de vous couper l'accès.
L'association « Les Jardins Partagés » héberge sur un petit serveur Linux deux services web : le site
public de l'association (port 8080) et une interface d'administration (port 8081), qui ne
doit servir qu'aux bénévoles. Un bénévole vous demande : « Comment faire pour que personne d'autre ne
puisse atteindre l'administration ? »
Étape 1 — Lancer les deux services
Dans le terminal de votre VM Debian, installez les outils et créez un dossier de travail :
sudo apt install nftables curl
mkdir -p ~/tp-parefeu/site ~/tp-parefeu/admin
cd ~/tp-parefeu
echo "Site public des Jardins Partages" > site/index.html
echo "Interface d'administration" > admin/index.html
Lancez les deux services (deux petits serveurs web fournis par Python), puis listez les ports en écoute :
python3 -m http.server 8080 --bind 127.0.0.1 --directory site &
python3 -m http.server 8081 --bind 127.0.0.1 --directory admin &
ss -tln
- Quels ports voyez-vous en écoute, et sur quelle adresse ?
- Interrogez chaque service avec
curl -s http://127.0.0.1:8080/puiscurl -s http://127.0.0.1:8081/. Que répondent-ils ?
📌 Réponse attendue
Étape 2 — Constater l'absence de filtrage
Regardez ce que votre pare-feu contient pour le moment :
sudo nft list tables
curl -s --max-time 3 http://127.0.0.1:8081/ ; echo "code retour : $?"
- Que contient la liste des tables ?
- Que vous répond l'interface d'administration, et quel est le code retour de
curl? - Que peut-on en conclure sur la protection de cette interface ?
📌 Réponse attendue
Étape 3 — Un premier filtre sur les connexions entrantes
Créez une table, une chaîne qui examine les paquets entrants, puis une règle qui jette les
paquets destinés au port 8081 :
sudo nft add table inet filtre_tp
sudo nft add chain inet filtre_tp entrant '{ type filter hook input priority 0 ; policy accept ; }'
sudo nft add rule inet filtre_tp entrant tcp dport 8081 drop
sudo nft list ruleset
Testez les deux services, puis vérifiez que les services tournent toujours :
curl -s --max-time 3 http://127.0.0.1:8080/ ; echo "code retour : $?"
curl -s --max-time 3 http://127.0.0.1:8081/ ; echo "code retour : $?"
ss -tln
- Que fait la politique
policy acceptde la chaîne ? - Que répondent les deux services, et quels sont les codes retour ?
- Le service d'administration est-il arrêté ? Qu'est-ce qui a changé exactement ?
📌 Réponse attendue
Étape 4 — Jeter ou refuser
Remplacez la règle par une règle qui refuse explicitement la connexion plutôt que de l'ignorer :
sudo nft flush chain inet filtre_tp entrant
sudo nft add rule inet filtre_tp entrant tcp dport 8081 reject
curl -sS --max-time 3 http://127.0.0.1:8081/ ; echo "code retour : $?"
- Quelle différence de comportement observez-vous par rapport à l'étape précédente (message, durée, code retour) ?
- Quel est l'avantage de
dropface à un attaquant qui scanne les ports du serveur ? Et celui derejectpour un administrateur ?
📌 Réponse attendue
Étape 5 — Filtrer aussi les connexions sortantes
Un pare-feu s'applique aussi aux connexions qui partent de la machine. Ajoutez une chaîne pour les
paquets sortants, puis une règle qui refuse les connexions vers le port 8080 :
sudo nft flush chain inet filtre_tp entrant
sudo nft add chain inet filtre_tp sortant '{ type filter hook output priority 0 ; policy accept ; }'
sudo nft add rule inet filtre_tp sortant tcp dport 8080 reject
curl -sS --max-time 3 http://127.0.0.1:8080/ ; echo "code retour : $?"
curl -sS --max-time 3 http://127.0.0.1:8081/ ; echo "code retour : $?"
- Pourquoi le site public (8080) n'est-il plus joignable, alors que la chaîne des paquets entrants ne contient plus aucune règle ?
- Pourquoi l'interface d'administration (8081) répond-elle de nouveau ?
- Dans quel cas réel un administrateur filtrerait-il des connexions sortantes ?
📌 Réponse attendue
Étape 6 — N'autoriser que ce qui est utile
Vous avez jusqu'ici interdit ce que vous connaissiez. Inversez la logique : refusez tout par défaut, puis autorisez uniquement ce qui est nécessaire. Supprimez l'ancienne table et créez-en une nouvelle :
sudo nft delete table inet filtre_tp
sudo nft add table inet filtre_strict
sudo nft add chain inet filtre_strict entrant '{ type filter hook input priority 0 ; policy drop ; }'
sudo nft add rule inet filtre_strict entrant ct state established,related accept
sudo nft add rule inet filtre_strict entrant tcp dport 22 accept
sudo nft add rule inet filtre_strict entrant tcp dport 8080 accept
Lancez ensuite un troisième service, que l'association a installé sans prévenir, puis testez les trois ports :
python3 -m http.server 8082 --bind 127.0.0.1 --directory site &
for p in 8080 8081 8082; do curl -sS --max-time 3 http://127.0.0.1:$p/ | head -1 ; echo "port $p : code retour ${PIPESTATUS[0]}" ; done
Quand vous avez terminé, nettoyez :
sudo nft delete table inet filtre_strict
pkill -f "http.server"
- Quels ports répondent, et quel est le sort du service 8082 que personne n'avait déclaré ?
- Pourquoi ajouter la règle
ct state established,related accept? - Pourquoi la règle du port
22est-elle indispensable, même si votre test n'utilise pas SSH ?
📌 Réponse attendue
Étape 7 — Conseiller l'association
Le bénévole vous demande ce qu'il doit retenir de votre intervention : « Quels ports laisser ouverts, pourquoi refuser tout par défaut, et le pare-feu suffit-il à protéger le serveur ? » Que lui répondez-vous ?
Restitution orale
Un étudiant (ou un binôme) vient présenter à la classe les règles posées sur le serveur (étapes 3 à 6) et les conseils donnés à l'association (étape 7).
- Durée : 5 minutes de présentation + 2 à 3 minutes de questions.
- Qui passe : un(e) étudiant(e) (ou un binôme) désigné(e) par l'enseignant.
- Support : le travail réalisé pendant le TP, aucune préparation supplémentaire n'est nécessaire.
- Ce qui est attendu :
- rappeler le contexte (le serveur de l'association et l'interface à protéger) ;
- présenter la démarche suivie (entrant, sortant, politique par défaut) et les conseils donnés ;
- répondre aux questions de la classe.
Cet exercice entraîne à l'oral technique court exigé par plusieurs épreuves du BTS (notamment E5 et E6) : clarté, structure, capacité à répondre à l'improviste.
📌 Une solution
Notions théoriques
Vous venez de contrôler ce qui entre et ce qui sort d'un serveur, par port. Voyons ce qu'est un pare-feu, les décisions qu'il prend et ses limites.
Qu'est-ce qu'un pare-feu ?
Un pare-feu (firewall) est un composant qui examine les paquets réseau et décide, d'après des règles, de les laisser passer ou de les bloquer. Il peut s'appuyer sur :
- le port de destination (le service visé :
22pour SSH,80pour le web...) ; - l'adresse de l'émetteur ou du destinataire ;
- le sens de la connexion (entrante ou sortante) ;
- l'état de la connexion (nouvelle, ou déjà établie).
Un pare-feu peut être matériel (une boîte entre deux réseaux) ou logiciel, installé sur la
machine à protéger. Sous Linux, le filtrage est assuré par le noyau, et on le configure avec des
outils comme nft (nftables) ou, plus simplement, ufw.
Le cours « Firewall » du dossier de sécurité réseau de ce site détaille la mise en œuvre avec UFW. Cette séance se limite à la découverte du principe, avec l'outil que le noyau utilise réellement.
Entrant et sortant
| Sens | Ce que l'on contrôle | Exemple |
|---|---|---|
Entrant (input) | Qui peut atteindre un service de la machine | Interdire l'accès à l'interface d'administration |
Sortant (output) | Ce que la machine peut atteindre ailleurs | Empêcher une machine compromise de joindre l'attaquant |
Transit (forward) | Ce qui traverse la machine (routeur) | Filtrer entre deux sous-réseaux |
Dans ce TP, seuls l'entrant et le sortant ont été utilisés.
La politique par défaut
Lorsqu'un paquet ne correspond à aucune règle, la politique par défaut de la chaîne décide de son sort :
| Politique | Principe | Avantage | Inconvénient |
|---|---|---|---|
| accept | On interdit ce que l'on connaît (liste noire) | Simple, rien ne casse | Ce qui est inconnu passe |
| drop | On autorise ce qui est utile (liste blanche) | Ce qui est imprévu est bloqué | Une règle oubliée coupe un service, voire l'accès à distance |
C'est le principe du moindre privilège appliqué au réseau : n'ouvrir que ce qui est nécessaire.
Jeter ou refuser
| Action | Ce que voit l'émetteur | Usage |
|---|---|---|
| drop | Aucune réponse, jusqu'à l'expiration du délai | Ralentir un scan, ne rien révéler |
| reject | Un refus explicite, immédiat | Faciliter le diagnostic en réseau interne |
Dans les deux cas, le service continue de tourner : c'est la connexion qui est bloquée. Un pare-feu ne répare pas un service vulnérable, il en limite seulement l'accès.
Les limites d'un pare-feu
- Il ne protège pas contre une faille d'une application sur un port autorisé.
- Il ne remplace ni les mises à jour, ni les mots de passe solides.
- Il ne voit pas ce qui se passe à l'intérieur (compte compromis, utilisateur malveillant).
- Une règle ajoutée en ligne de commande est temporaire : sans enregistrement dans la configuration, elle est perdue au redémarrage.
La séance suivante de la progression s'intéressera à ce que voit un attaquant avant même de
s'attaquer à un service : un scan de ports. C'est précisément ce que le pare-feu rend plus
difficile, par exemple avec drop.
Test de mémorisation/compréhension
Bonnes pratiques
- Refuser par défaut, autoriser explicitement : une politique
dropet une liste de ports utiles. - N'ouvrir que les ports nécessaires : une interface d'administration n'a pas à être joignable de partout.
- Ne jamais oublier la règle SSH avant de passer une chaîne en
dropsur un serveur distant. - Filtrer aussi le sortant quand c'est utile, pour limiter ce qu'une machine compromise peut faire.
- Enregistrer les règles dans la configuration pour qu'elles survivent au redémarrage.
- Tester après chaque modification, depuis l'extérieur de la machine quand c'est possible.
- Ne pas se reposer sur le pare-feu seul : il se combine avec les mises à jour, des mots de passe solides et des droits limités.