Réseau · Pare-feu
Lab · Firewall · iptables Débutant

Jimmy a Cassé le Pare-feu

Jimmy voulait 'tester un truc' avec iptables. Résultat : HTTP est bloqué sur toute la machine. Plus personne ne peut accéder au site web de l'entreprise. Jimmy est en vacances jusqu'à lundi. Bonne chance.

1
2
3
4
5
1 / 5
01 //

Concept : iptables, le videur du réseau

Concept clé
iptables, c'est le videur de votre club
Chaque paquet réseau frappe à la porte. iptables vérifie ses règles dans l'ordre : 'Port 22 ? Entre. Port 80 ? Jimmy a supprimé cette règle — DEHORS.' La règle DROP par défaut = ce qui n'est pas autorisé explicitement est bloqué. Jimmy a mis INPUT en DROP et n'a rien autorisé. Bravo Jimmy.
02 //

Inspecter les règles actuelles

Avant de corriger quoi que ce soit, voyons le désastre que Jimmy a laissé derrière lui.

⚠ COMMANDE QUI GÈLE — PAS DE PANIQUE Si vous lancez curl -I http://127.0.0.1 maintenant, le terminal va se figer — c'est normal. La politique DROP silencieuse jette les paquets sans répondre, donc curl attend indéfiniment. Appuyez sur Ctrl+C pour interrompre. C'est la preuve que le pare-feu bloque bien le trafic.
inspect_rules.sh
# Voir toutes les règles iptables
# TODO: quelle commande iptables liste les règles ?
# Indice : sudo iptables -???
sudo iptables -???

# Version détaillée avec compteurs
sudo iptables -L -v -n

# Voir aussi la politique par défaut (INPUT, OUTPUT, FORWARD)
sudo iptables -L | head -5
▸ AFFICHER LA SOLUTION (essayez d'abord !)

L'option -L de iptables liste toutes les règles :

sudo iptables -L
# Vous verrez probablement : Chain INPUT (policy DROP)
# C'est le travail de Jimmy.
03 //

Autoriser HTTP

HTTP tourne sur le port 80 en TCP. Il faut ajouter une règle iptables pour autoriser ce trafic entrant.

fix_http.sh
# HTTP c'est le port 80 en TCP
# TODO: ajouter la règle pour autoriser HTTP entrant
# Syntaxe : sudo iptables -A INPUT -p tcp --dport PORT -j ACTION
sudo iptables -A ????? -p ??? --dport ?? -j ????

# Vérifier que la règle est bien ajoutée
sudo iptables -L -n | grep 80
▸ AFFICHER LA SOLUTION (essayez d'abord !)

INPUT = chaîne d'entrée, tcp = protocole, 80 = port HTTP, ACCEPT = laisser passer :

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
04 //

Autoriser HTTPS

HTTPS tourne sur le port 443. Et il faut aussi autoriser le trafic établi — sinon les réponses aux requêtes sortantes seraient bloquées !

fix_https.sh
# HTTPS c'est le port 443 en TCP
# TODO: même chose pour HTTPS
sudo iptables -A INPUT -p tcp --dport ??? -j ACCEPT

# Autoriser aussi le trafic établi (important pour les réponses !)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
▸ AFFICHER LA SOLUTION
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
05 //

Vérifier et sauvegarder

Vérifiez que tout fonctionne, puis sauvegardez les règles pour qu'elles survivent au prochain redémarrage. (Ce que Jimmy n'a pas fait.)

Vérification et sauvegarde
# Voir toutes les règles finales
sudo iptables -L -n -v

# Tester qu'HTTP fonctionne (127.0.0.1 force IPv4 — iptables ne filtre pas IPv6)
curl -I http://127.0.0.1

# Sauvegarder les règles (pour qu'elles survivent au reboot)
sudo iptables-save > /etc/iptables/rules.v4
HTTP EST DE RETOUR ! HTTP est de retour ! Le site fonctionne. Jimmy reçoit un mail de 'félicitations' à son retour de vacances. Merci Jimmy.
✓
Lab terminé !
Vous avez réparé ce que Jimmy a cassé. Vous êtes le héros de l'équipe. Jimmy est toujours en vacances.
← Retour aux Labs