Votre service est accessible en local mais pas depuis Internet ? Le pare-feu bloque probablement le trafic entrant. Ce module vous apprend à comprendre le filtrage réseau, lire les règles iptables et diagnostiquer les blocages — compétences essentielles pour déployer des applications accessibles.
TL;DR — L’essentiel en 30 secondes
Section intitulée « TL;DR — L’essentiel en 30 secondes »- Pare-feu = filtre qui décide quel trafic passe (par IP, port, protocole)
- Timeout = pare-feu DROP (silencieux), Refused = pare-feu REJECT ou port fermé
- Cloud : double filtrage (Security Group + pare-feu OS)
- Stateful = les réponses aux connexions sortantes passent automatiquement
3 règles mentales à retenir
Section intitulée « 3 règles mentales à retenir »- Blocage par défaut : un pare-feu bien configuré bloque tout sauf ce qui est explicitement autorisé
- Stateful : si vous autorisez une connexion sortante, les réponses rentrent automatiquement
- Timeout ≠ Refused : timeout = DROP (silencieux), refused = service absent ou REJECT
Je sais que c’est bon si…
Section intitulée « Je sais que c’est bon si… »- Je sais distinguer timeout (filtré) de refused (port fermé)
-
sudo iptables -L -nme montre les règles actives - Je pense à vérifier le Security Group en plus du pare-feu OS (cloud)
Commandes minimales à retenir
Section intitulée « Commandes minimales à retenir »# 1. Voir les règles iptablessudo iptables -L -n --line-numbers
# 2. Tester si un port est filtré ou ferménc -zv -w 3 serveur 22
# 3. Voir les connexions suivies (stateful)sudo conntrack -L 2>/dev/null | head -10Prérequis
Section intitulée « Prérequis »- Module 6 complété : vous comprenez TCP/UDP et les ports
- Module 8 complété : vous savez comment une machine obtient son IP (DHCP)
- Accès root sur une machine Linux
Diagnostic rapide (aide-mémoire)
Section intitulée « Diagnostic rapide (aide-mémoire) »| Symptôme | Hypothèse #1 | Hypothèse #2 | Commandes |
|---|---|---|---|
| Timeout | DROP / Security Group / route | Service down | tcpdump, ss -tlnp, nc -zv -w 5 |
| Connection refused | Service absent | REJECT —reject-with tcp-reset | ss -tlnp, iptables -S |
| Marche en local, pas remote | Binding sur 127.0.0.1 | Pare-feu/SG | ss -tlnp, docker ps, iptables -L |
| ICMP unreachable | REJECT avec ICMP | Route manquante | traceroute, iptables -S |
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Le rôle d’un pare-feu : filtrer qui peut parler à qui
- Ingress vs egress : trafic entrant vs sortant
- Stateful vs stateless : pare-feu à mémoire de connexion
- Iptables/nftables : les chaînes INPUT, OUTPUT, FORWARD
- Symptômes de blocage : timeout, connection refused, ICMP unreachable
- Diagnostic pratique : tester si un port est filtré
Qu’est-ce qu’un pare-feu ?
Section intitulée « Qu’est-ce qu’un pare-feu ? »Un pare-feu est un gardien qui décide quel trafic réseau peut passer et lequel est bloqué. Il applique des règles basées sur :
- L’adresse IP source/destination
- Le port source/destination
- Le protocole (TCP, UDP, ICMP)
- La direction (entrant ou sortant)
Principe de base : tout bloquer par défaut, autoriser seulement ce qui est nécessaire.
| Sans pare-feu | Avec pare-feu |
|---|---|
| Tous les ports accessibles | Seuls les ports autorisés |
| Vulnérable aux scans | Protection contre les intrusions |
| Pas de contrôle | Journalisation des tentatives |
Ingress vs Egress : la direction du trafic
Section intitulée « Ingress vs Egress : la direction du trafic »Le pare-feu distingue deux directions de trafic :
Ingress (trafic entrant)
Section intitulée « Ingress (trafic entrant) »Le trafic qui arrive vers votre serveur depuis l’extérieur.
Exemples :
- Un client qui accède à votre site web (port 443)
- Une requête SSH depuis votre poste (port 22)
- Un scan de port malveillant
Egress (trafic sortant)
Section intitulée « Egress (trafic sortant) »Le trafic qui part de votre serveur vers l’extérieur.
Exemples :
- Votre serveur qui télécharge une mise à jour
- Une requête vers une API externe
- L’envoi d’emails (port 25/587)
Stateful vs Stateless : avec ou sans mémoire
Section intitulée « Stateful vs Stateless : avec ou sans mémoire »Pare-feu stateless
Section intitulée « Pare-feu stateless »Chaque paquet est évalué indépendamment. Le pare-feu ne sait pas si un paquet fait partie d’une connexion établie.
Problème : vous devez créer des règles pour les deux sens (requête ET réponse).
Pare-feu stateful
Section intitulée « Pare-feu stateful »Le pare-feu mémorise les connexions établies. Si vous autorisez une connexion sortante, les réponses entrantes sont automatiquement autorisées.
Avantage : règles plus simples et plus sécurisées.
┌─────────────────────────────────────────────────────────────┐│ PARE-FEU STATEFUL │├─────────────────────────────────────────────────────────────┤│ Connexion sortante autorisée (port 443) ││ └── Réponse entrante : AUTOMATIQUEMENT acceptée ││ ││ Connexion entrante non sollicitée : BLOQUÉE │└─────────────────────────────────────────────────────────────┘Voir la table d’états (conntrack)
Section intitulée « Voir la table d’états (conntrack) »Le comportement stateful repose sur conntrack (connection tracking). Pour voir les connexions suivies :
# Avec conntrack-tools installésudo conntrack -L | head -20
# Sans conntrack-toolssudo cat /proc/net/nf_conntrack | head -20
# Compter les connexions activessudo conntrack -CExemple de sortie :
tcp 6 431999 ESTABLISHED src=192.168.1.10 dst=93.184.216.34 sport=54321 dport=443 src=93.184.216.34 dst=192.168.1.10 sport=443 dport=54321Cette ligne montre une connexion HTTPS établie : le pare-feu sait que les paquets retour (443 → 54321) font partie de cette connexion.
Pare-feu Linux : iptables et nftables
Section intitulée « Pare-feu Linux : iptables et nftables »Linux dispose de deux outils de pare-feu :
- iptables : l’outil historique, encore très répandu
- nftables : le successeur moderne (depuis kernel 3.13)
Les deux utilisent le même sous-système kernel (netfilter).
Surcouches : UFW et firewalld
Section intitulée « Surcouches : UFW et firewalld »En production, beaucoup d’administrateurs n’utilisent pas iptables/nftables directement mais une surcouche :
| Distribution | Outil par défaut | Backend |
|---|---|---|
| Ubuntu/Debian | ufw | iptables ou nftables |
| RHEL/Fedora/Rocky | firewalld | nftables |
Commandes UFW (Ubuntu/Debian) :
# État et règlessudo ufw status verbose
# Autoriser un portsudo ufw allow 22/tcp
# Voir les règles numérotéessudo ufw status numberedCommandes firewalld (RHEL/Fedora) :
# État du servicesudo firewall-cmd --state
# Lister toutes les règles de la zone activesudo firewall-cmd --list-all
# Lister les services autoriséssudo firewall-cmd --list-services
# Ouvrir un port (temporaire)sudo firewall-cmd --add-port=8080/tcp
# Ouvrir un port (permanent)sudo firewall-cmd --add-port=8080/tcp --permanentsudo firewall-cmd --reloadLes chaînes iptables
Section intitulée « Les chaînes iptables »Un paquet traverse différentes chaînes selon sa destination :
| Chaîne | S’applique à | Exemple |
|---|---|---|
| INPUT | Trafic destiné à cette machine | Connexion SSH vers ce serveur |
| OUTPUT | Trafic généré par cette machine | Requête curl vers une API |
| FORWARD | Trafic qui traverse (routage) | Paquet relayé par un routeur |
Actions possibles
Section intitulée « Actions possibles »| Action | Comportement | Symptôme côté client |
|---|---|---|
| ACCEPT | Paquet autorisé | Connexion établie |
| DROP | Paquet jeté silencieusement | Timeout (pas de réponse) |
| REJECT | Paquet refusé avec notification | ”Connection refused” ou ICMP |
Voir les règles actuelles
Section intitulée « Voir les règles actuelles »# Lister toutes les règles (format lisible)sudo iptables -L -n -v
# Lister avec numéros de lignesudo iptables -L -n --line-numbers
# Voir les règles brutes (format exact)sudo iptables -SExemple de sortie :
Chain INPUT (policy DROP)num pkts bytes target prot opt in out source destination1 1234 56K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/02 5678 890K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED3 123 12K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:224 45 2K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:805 89 8K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443Lecture :
policy DROP: tout ce qui n’est pas explicitement autorisé est bloqué- Règle 1 : tout trafic sur loopback (
lo) est accepté - Règle 2 : les connexions établies sont acceptées (stateful)
- Règles 3-5 : ports SSH, HTTP et HTTPS autorisés
Équivalent nftables
Section intitulée « Équivalent nftables »# Lister tout le rulesetsudo nft list ruleset
# Lister une chaîne spécifiquesudo nft list chain inet filter inputExemple de sortie nftables :
table inet filter { chain input { type filter hook input priority 0; policy drop; iif "lo" accept ct state established,related accept tcp dport 22 accept tcp dport { 80, 443 } accept }}Lecture nftables :
table inet filter: table filter pour IPv4 et IPv6chain input: équivalent de la chaîne INPUT iptablespolicy drop: tout bloquer par défautct state established,related: connexions établies (stateful)tcp dport { 80, 443 }: syntaxe concise pour plusieurs ports
Symptômes de blocage par pare-feu
Section intitulée « Symptômes de blocage par pare-feu »Quand un pare-feu bloque votre connexion, le symptôme dépend de la règle :
Timeout (DROP)
Section intitulée « Timeout (DROP) »nc -zv 192.168.1.100 22# Aucune réponse... attend indéfinimentLe paquet est jeté silencieusement. Le client attend une réponse qui ne viendra jamais (jusqu’au timeout, souvent 30-60 secondes).
Connection refused (RST TCP)
Section intitulée « Connection refused (RST TCP) »nc -zv 192.168.1.100 22# Connection refusedLe serveur envoie un paquet TCP RST (Reset). Cela signifie :
- Aucun service n’écoute sur ce port (RST envoyé par la stack TCP), OU
- Le pare-feu a une règle
REJECT --reject-with tcp-reset
Exemple de règle REJECT avec RST :
# Cette règle envoie un RST au lieu de DROP silencieuxiptables -A INPUT -p tcp --dport 8080 -j REJECT --reject-with tcp-resetICMP unreachable (REJECT avec ICMP)
Section intitulée « ICMP unreachable (REJECT avec ICMP) »nc -zv 192.168.1.100 22# Message selon l'outil et l'OS :# - "No route to host"# - "Host unreachable"# - "Network unreachable"# - "Administratively prohibited"Le pare-feu a explicitement rejeté avec un message ICMP. Le message exact dépend du type d’ICMP envoyé et de l’outil utilisé.
Types de REJECT ICMP courants :
# ICMP port-unreachable (défaut)iptables -A INPUT -p tcp --dport 8080 -j REJECT
# ICMP host-unreachableiptables -A INPUT -p tcp --dport 8080 -j REJECT --reject-with icmp-host-unreachable
# ICMP admin-prohibitediptables -A INPUT -p tcp --dport 8080 -j REJECT --reject-with icmp-admin-prohibitedTableau récapitulatif
Section intitulée « Tableau récapitulatif »| Symptôme | Paquet TCP | Cause probable | Vérification |
|---|---|---|---|
| Timeout | Rien | DROP par pare-feu | tcpdump pour voir si SYN arrive |
| Connection refused | RST | Pas de service OU REJECT tcp-reset | ss -tlnp sur le serveur |
| ICMP unreachable | ICMP | REJECT avec ICMP | iptables -S, nft list ruleset |
| Connexion lente puis échec | SYN sans SYN-ACK | Pare-feu intermédiaire | traceroute, tcpdump |
Diagnostiquer un blocage pare-feu
Section intitulée « Diagnostiquer un blocage pare-feu »-
Vérifiez que le service écoute localement
Sur le serveur, vérifiez que votre service tourne :
Fenêtre de terminal # Le service écoute-t-il ?ss -tlnp | grep :80# LISTEN 0 128 0.0.0.0:80 *:* users:(("nginx",pid=1234,fd=6))Si rien ne s’affiche, le problème n’est pas le pare-feu mais le service.
-
Testez localement
Fenêtre de terminal curl http://localhost# Si ça marche en local, le service fonctionne -
Testez depuis l’extérieur
Depuis une autre machine :
Fenêtre de terminal nc -zv <ip-serveur> 80# Timeout ? → Probablement le pare-feu -
Vérifiez les règles pare-feu
Fenêtre de terminal sudo iptables -L -n | grep 80# Le port 80 est-il autorisé en INPUT ? -
Capturez le trafic avec tcpdump
Sur le serveur, vérifiez si les paquets arrivent :
Fenêtre de terminal sudo tcpdump -i eth0 port 80 -n- Paquets visibles : ils arrivent, le pare-feu local les bloque
- Aucun paquet : bloqué avant (routeur, cloud, etc.)
Diagnostic avancé : SYN / SYN-ACK
Section intitulée « Diagnostic avancé : SYN / SYN-ACK »Pour un diagnostic précis, capturez les flags TCP :
# Voir uniquement SYN et SYN-ACKsudo tcpdump -ni eth0 'tcp port 80 and (tcp[tcpflags] & (tcp-syn|tcp-ack) != 0)'Interprétation :
| Vous voyez | Signification | Action |
|---|---|---|
| SYN entrant, pas de SYN-ACK | Pare-feu local DROP ou service ne répond pas | ss -tlnp, iptables -L |
| SYN entrant, SYN-ACK sortant | Serveur répond ! Problème sur le chemin retour | SG egress, NACL, route asymétrique |
| Aucun SYN | Bloqué avant d’arriver | Security Group, NACL, routeur |
| SYN + RST | REJECT ou service absent | ss -tlnp, `iptables -S |
Tester un port depuis l’extérieur
Section intitulée « Tester un port depuis l’extérieur »Plusieurs outils permettent de vérifier si un port est accessible :
# Test rapide d'un port TCPnc -zv <ip> <port>
# Avec timeout de 5 secondesnc -zv -w 5 <ip> <port>-z: mode scan (pas de données envoyées)-v: verbose-w: timeout
# Scanner un port spécifiquenmap -p 80 <ip>
# Scanner une plage de portsnmap -p 1-1000 <ip>
# Détecter le type de filtragenmap -sA -p 80 <ip>Nmap distingue :
- open : port accessible et service actif
- closed : port accessible mais pas de service
- filtered : bloqué par pare-feu (timeout)
# Test basiquetelnet <ip> 80
# Ctrl+] puis quit pour sortirFonctionne partout mais moins pratique que nc.
Cas pratiques DevOps
Section intitulée « Cas pratiques DevOps »Security Groups (AWS, Azure, GCP)
Section intitulée « Security Groups (AWS, Azure, GCP) »Dans le cloud, le pare-feu s’appelle Security Group. C’est un pare-feu stateful qui s’applique aux instances.
Exemple AWS :
- Par défaut : tout l’egress autorisé, tout l’ingress bloqué
- Vous devez ajouter des règles pour chaque port à ouvrir
Inbound Rules: Type Protocol Port Source SSH TCP 22 Mon IP HTTP TCP 80 0.0.0.0/0 HTTPS TCP 443 0.0.0.0/0Stateful vs Stateless dans le cloud
Section intitulée « Stateful vs Stateless dans le cloud »| Cloud | Composant | Comportement | Piège courant |
|---|---|---|---|
| AWS | Security Group | Stateful | — |
| AWS | Network ACL (NACL) | Stateless | Retour bloqué si egress non configuré |
| Azure | NSG | Stateful | — |
| GCP | VPC Firewall Rules | Stateful | — |
Docker et iptables
Section intitulée « Docker et iptables »Docker manipule automatiquement iptables pour le port mapping (-p 8080:80).
Voir les règles Docker :
# Table nat (port mapping)sudo iptables -t nat -S | grep -E "(DOCKER|PREROUTING|POSTROUTING)"
# Table filter (FORWARD, DOCKER-USER)sudo iptables -S DOCKER-USER 2>/dev/nullsudo iptables -S FORWARD | head -10Problème courant : vous ajoutez une règle iptables, Docker la contourne avec ses propres règles.
Solution : utilisez la chaîne DOCKER-USER pour ajouter vos règles :
# Bloquer un IP spécifique vers les conteneurssudo iptables -I DOCKER-USER -s 192.168.1.100 -j DROPDocker : port publié mais inaccessible
Section intitulée « Docker : port publié mais inaccessible »Problème fréquent : un port est publié (-p 8080:80) mais inaccessible depuis l’extérieur.
Checklist diagnostic :
# 1. Vérifier le binding (127.0.0.1 vs 0.0.0.0)docker ps --format "table {{.Names}}\t{{.Ports}}"# Si vous voyez 127.0.0.1:8080->80/tcp, c'est bindé sur localhost uniquement !
# 2. Vérifier que le service dans le conteneur écoutedocker exec <container> ss -tlnp | grep :80# Si le process écoute sur 127.0.0.1 dans le conteneur, il ne sera pas accessible
# 3. Vérifier les règles iptables Dockersudo iptables -L DOCKER -n -v | grep 8080Causes fréquentes :
| Symptôme | Cause | Solution |
|---|---|---|
127.0.0.1:8080->80 | Binding localhost | Utiliser -p 8080:80 sans IP |
| Service écoute sur 127.0.0.1 | Config app | Configurer l’app pour écouter sur 0.0.0.0 |
| Pas de règle DOCKER | Docker pas démarré | systemctl status docker |
Diagnostic egress (trafic sortant bloqué)
Section intitulée « Diagnostic egress (trafic sortant bloqué) »Quand votre serveur ne peut pas joindre un service externe, suivez ce runbook :
Scénarios courants :
- Serveur ne peut pas télécharger depuis un registry Docker
- Application ne peut pas joindre une API externe
- Connexion à une base de données managée qui échoue
Runbook egress :
# 1. Tester la résolution DNSdig api.externe.com
# 2. Tester la connectivité TCPnc -zv -w 5 api.externe.com 443
# 3. Tester HTTPcurl -I --connect-timeout 5 https://api.externe.com
# 4. Vérifier les règles OUTPUTsudo iptables -L OUTPUT -n -v
# 5. Capturer le trafic sortantsudo tcpdump -ni eth0 'host api.externe.com and tcp port 443'Causes fréquentes :
| Symptôme | Cause probable | Solution |
|---|---|---|
| DNS timeout | Egress UDP 53 bloqué | Autoriser DNS sortant |
| nc timeout | Egress TCP bloqué | Autoriser le port de destination |
| curl SSL error | Proxy interceptant | Vérifier les variables proxy |
Kubernetes NetworkPolicies
Section intitulée « Kubernetes NetworkPolicies »Dans Kubernetes, les NetworkPolicies sont l’équivalent des règles pare-feu entre pods.
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: allow-nginxspec: podSelector: matchLabels: app: nginx policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: frontend ports: - protocol: TCP port: 80Cette policy autorise uniquement les pods labellisés app: frontend à accéder au port 80 des pods app: nginx.
Travaux pratiques
Section intitulée « Travaux pratiques »TP 1 : Lire les règles iptables
Section intitulée « TP 1 : Lire les règles iptables »-
Affichez les règles actuelles
Fenêtre de terminal sudo iptables -L -n -v -
Identifiez
- Quelle est la policy par défaut de INPUT ?
- Quels ports sont autorisés ?
- Y a-t-il une règle pour les connexions établies ?
-
Affichez le format brut
Fenêtre de terminal sudo iptables -SComparez avec la sortie précédente.
TP 2 : Tester un port filtré
Section intitulée « TP 2 : Tester un port filtré »-
Lancez un serveur de test
Fenêtre de terminal # Terminal 1 : serveur sur port 9999python3 -m http.server 9999 -
Testez localement
Fenêtre de terminal # Terminal 2curl http://localhost:9999# Doit fonctionner -
Testez depuis une autre machine
Fenêtre de terminal nc -zv <ip-serveur> 9999# Timeout si pare-feu bloque -
Vérifiez avec tcpdump
Fenêtre de terminal # Sur le serveursudo tcpdump -i eth0 port 9999 -nLes paquets arrivent-ils ?
TP 3 : Comparer DROP et REJECT
Section intitulée « TP 3 : Comparer DROP et REJECT »-
Testez un port DROP (timeout)
Fenêtre de terminal time nc -zv -w 5 <ip> 12345# Attend 5 secondes puis timeout -
Testez un port sans service (refused)
Fenêtre de terminal time nc -zv -w 5 localhost 12345# Immediate "Connection refused" -
Comparez les temps
- DROP : attend le timeout
- Pas de service : réponse immédiate
Testez vos connaissances
Section intitulée « Testez vos connaissances »Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »- Pare-feu : filtre le trafic selon des règles (IP, port, protocole)
- Ingress : trafic entrant (vers votre serveur)
- Egress : trafic sortant (depuis votre serveur) — souvent négligé mais critique
- Stateful : le pare-feu mémorise les connexions (conntrack) ;
ESTABLISHED,RELATEDaccepte les réponses - iptables vs nftables : sur les distros récentes,
iptablesest souvent un frontend vers nftables - UFW/firewalld : surcouches courantes, vérifiez laquelle est active
- Timeout = DROP : paquet jeté silencieusement (pas de RST, pas d’ICMP)
- Connection refused = RST : le paquet arrive, mais pas de service OU règle REJECT tcp-reset
- Cloud = multi-couches : Security Group (stateful) + NACL (stateless sur AWS) + iptables sur l’instance
- Docker DOCKER-USER : seule chaîne pour ajouter vos règles sans être contourné