Linux pour les devs - 11 - Le firewall : contrôler qui entre et qui sort

ufw et iptables : configurer un firewall Linux pour protéger tes services sans te couper l'acces SSH.

  1. 01 Linux pour les devs - 00 - Pourquoi Linux meme si tu codes sur Mac ou Windows
  2. 02 Linux pour les devs - 01 - Le terminal, bash et zsh
  3. 03 Linux pour les devs - 02 - Fichiers et répertoires
  4. 04 Linux pour les devs - 03 - Permissions et droits d'acces
  5. 05 Linux pour les devs - 04 - Utilisateurs, groupes et sudo
  6. 06 Linux pour les devs - 05 - nano, vim, sed et awk
  7. 07 Linux pour les devs - 06 - Pipes et redirections
  8. 08 Linux pour les devs - 07 - grep et find en profondeur
  9. 09 Linux pour les devs - 08 - Les processus : comprendre ce qui tourne sur ta machine
  10. 10 Linux pour les devs - 09 - systemd : gerer tes services comme un pro
  11. 11 Linux pour les devs - 10 - Le réseau : comprendre ce qui passe par le fil
  12. 12 Linux pour les devs - 11 - Le firewall : contrôler qui entre et qui sort
  13. 13 Linux pour les devs - 12 - SSH : l'acces distant sécurisé
  14. 14 Linux pour les devs - 13 - Les variables d'environnement : configurer sans hardcoder
  15. 15 Linux pour les devs - 14 - Scripts bash : automatiser pour ne plus se répéter
  16. 16 Linux pour les devs - 15 - cron : les taches planifiees
  17. 17 Linux pour les devs - 16 - Les logs : lire, filtrer, comprendre
  18. 18 Linux pour les devs - 17 - Stockage et disques
  19. 19 Linux pour les devs - 18 - Les gestionnaires de paquets
  20. 20 Linux pour les devs - 19 - Les conteneurs sans Docker
  21. 21 Linux pour les devs - 20 - Securiser un serveur Linux
  22. 22 Linux pour les devs - 21 - Performance et diagnostic
  23. 23 Linux pour les devs - 22 - tmux : le multiplexeur de terminal
  24. 24 Linux pour les devs - 23 - Glossaire Linux

11 - Le firewall : contrôler qui entre et qui sort

Ce que tu vas apprendre

  • Pourquoi un firewall est indispensable meme derrière un reverse proxy
  • Configurer ufw rapidement et efficacement
  • Comprendre les bases d'iptables (chaînes, regles, politique par défaut)
  • Ouvrir les bons ports pour tes services sans tout laisser passer

Prerequisites

Connaitre les bases du réseau Linux, notamment les ports et ss. Avoir un acces sudo.


Ma première mise en prod, j'avais un VPS tout neuf avec PostgreSQL qui ecoutait sur le port 5432... ouvert au monde entier. Il m'a fallu trois jours pour remarquer des connexions suspectes dans les logs. Depuis, la première chose que je fais sur un nouveau serveur, c'est configurer le firewall.

Pourquoi un firewall

Par défaut, un serveur Linux accepte les connexions sur tous les ports ou un service écoûte. Si tu lances PostgreSQL, il est accessible depuis Internet. Si tu lances Redis, pareil. Meme si ces services demandent une authentification, les exposer inutilement augmente la surface d'attaque.

Le principe est simple : tout bloquer par défaut, puis ouvrir uniquement ce qui est nécessaire.

ufw : le firewall pour les humains

ufw (Uncomplicated Firewall) est une surcouche a iptables qui rend la configuration lisible. C'est l'outil par défaut sur Ubuntu et Debian.

bash# Installer si necessaire
sudo apt install ufw

# Voir le statut actuel
sudo ufw status verbose

# Regle numero un : autoriser SSH AVANT d'activer le firewall
# Sinon tu te coupes l'acces a ton serveur
sudo ufw allow 22/tcp

# Activer le firewall
sudo ufw enable

# Politique par defaut : bloquer tout ce qui entre, autoriser ce qui sort
sudo ufw default deny incoming
sudo ufw default allow outgoing

Je ne peux pas insister assez : autorise SSH avant d'activer ufw. Je connais des gens qui se sont retrouves enfermes dehors sur un serveur a l'autre bout du monde. C'est un classique.

Ouvrir les ports pour tes services

bash# HTTP et HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Un port specifique pour ton app
sudo ufw allow 3000/tcp

# PostgreSQL depuis une IP precise uniquement
sudo ufw allow from 10.0.0.5 to any port 5432

# Autoriser un sous-reseau
sudo ufw allow from 10.0.0.0/24 to any port 5432

# Supprimer une regle
sudo ufw delete allow 3000/tcp

# Voir les regles numerotees (utile pour supprimer)
sudo ufw status numbered

# Supprimer par numero
sudo ufw delete 3

Sur paltemps.fr, ma config est minimaliste : SSH, HTTP, HTTPS. PostgreSQL n'écoûte que sur localhost, donc pas besoin d'ouvrir le port 5432.

Les profils d'application ufw

Certaines applications installent des profils ufw :

bash# Voir les profils disponibles
sudo ufw app list

# Autoriser un profil
sudo ufw allow "Nginx Full"

# Voir ce qu'un profil autorise
sudo ufw app info "Nginx Full"

Les profils Nginx courants : Nginx HTTP (port 80), Nginx HTTPS (port 443), Nginx Full (les deux). OpenSSH a aussi son profil.

iptables : comprendre ce qui se passe en dessous

ufw généré des regles iptables. Connaitre les bases d'iptables est utile pour debugger et pour comprendre les tutoriels que tu trouveras en ligne.

iptables organise les regles en chaînes :

  • INPUT : trafic entrant destine a la machine
  • OUTPUT : trafic sortant de la machine
  • FORWARD : trafic qui transite (routage, conteneurs Docker)

Chaque regle a une cible : ACCEPT, DROP (silencieux), ou REJECT (envoie une erreur).

bash# Voir toutes les regles
sudo iptables -L -n -v

# Voir les regles avec les numeros de ligne
sudo iptables -L --line-numbers

# Autoriser SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Autoriser HTTP
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# Autoriser HTTPS
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Autoriser les connexions deja etablies (indispensable)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Autoriser le loopback
sudo iptables -A INPUT -i lo -j ACCEPT

# Bloquer tout le reste en entree
sudo iptables -P INPUT DROP

# Supprimer une regle par numero
sudo iptables -D INPUT 3

L'ordre des regles compte. iptables parcourt les regles de haut en bas et s'arrêté a la première qui matche. Si tu mets DROP tout en haut, plus rien ne passe.

La politique "deny by default"

La bonne approche, c'est toujours :

  1. Politique par défaut : tout bloquer
  2. Autoriser explicitement ce qui doit passer
  3. Documenter chaque regle
bash# Avec ufw, c'est simple
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Ne tombe pas dans le piège de "j'ouvre temporairement le port 5432 pour tester" et oublier de le refermer. Ce "temporaire" a une facheuse tendance a devenir permanent.

Verifier que ca marche

bash# Voir les regles actives
sudo ufw status verbose

# Depuis une autre machine, scanner les ports ouverts
nmap -Pn ton-serveur.com

# Verifier qu'un port precis est ferme
nc -zv ton-serveur.com 5432
# Connection refused = bien, le port est ferme

Résumé

  • Toujours autoriser SSH avant d'activer le firewall
  • ufw est l'outil a utiliser au quotidien, iptables pour comprendre
  • Politique "deny by default" : bloquer tout, ouvrir le minimum
  • Ne jamais exposer les bases de donnees directement sur Internet
  • Verifier avec ss -tlnp et nmap que seuls les bons ports sont ouverts

Article précédent : Le réseau Article suivant : SSH

Sources

Réservez un audit gratuit de 30 minutes. Je vous montre concrètement ce qu'on peut automatiser.