Installer et configurer UFW (Uncomplicated Firewall) pour protéger un serveur : règles, ports, sous-réseaux et logging.
On commence par installer UFW (s'il n'est pas déjà présent) et l'activer. Mais attention : il y a un piège classique qu'on va éviter.
# Installe UFW (souvent déjà présent sur Ubuntu)
sudo apt install ufw -y
# Vérifie si le pare-feu est actif ou inactif
# Au début, il affiche "Status: inactive"
sudo ufw status
# TRÈS IMPORTANT : on autorise SSH AVANT d'activer le firewall
# Si on oublie, le pare-feu bloquera notre connexion SSH et on sera enfermé dehors !
sudo ufw allow ssh
# Maintenant on peut activer le pare-feu en toute sécurité
# Il demande une confirmation (y pour oui)
sudo ufw enable
La "politique par défaut" définit ce que fait le pare-feu quand il reçoit du trafic qui ne correspond à aucune règle. La bonne pratique en sécurité est de tout bloquer par défaut, puis d'autoriser uniquement ce dont on a besoin :
# Bloque TOUT le trafic entrant par défaut
# Concrètement : si quelqu'un essaie de se connecter à un port qu'on n'a pas autorisé, c'est refusé
sudo ufw default deny incoming
# Autorise TOUT le trafic sortant par défaut
# Le serveur peut aller sur Internet (mises à jour, DNS, etc.)
sudo ufw default allow outgoing
# Affiche un résumé détaillé de la configuration actuelle
sudo ufw status verbose
Maintenant qu'on bloque tout par défaut, on va ouvrir uniquement les ports dont on a besoin. Il y a plusieurs façons de le faire :
UFW connaît les noms des services courants et sait quel port leur correspond :
# Autorise SSH (port 22) — indispensable pour la connexion à distance
sudo ufw allow ssh
# Autorise HTTP (port 80) — pour un site web non sécurisé
sudo ufw allow http
# Autorise HTTPS (port 443) — pour un site web sécurisé (avec certificat SSL)
sudo ufw allow https
# Affiche tous les services que UFW connaît
sudo ufw app list
Pour les ports personnalisés ou moins courants, on utilise le numéro directement :
# Autorise le port 2222 en TCP (ex: SSH sur un port personnalisé)
# /tcp signifie qu'on autorise uniquement le protocole TCP (pas UDP)
sudo ufw allow 2222/tcp
# Autorise le port 53 en UDP (DNS utilise principalement UDP)
sudo ufw allow 53/udp
# Autorise une PLAGE de ports (du port 8000 au port 8100)
# Le tiret (:) sépare le début et la fin de la plage
sudo ufw allow 8000:8100/tcp
On peut aussi limiter l'accès à certaines adresses IP ou réseaux. C'est plus sécurisé que d'ouvrir un port à tout le monde :
# Autorise TOUT le trafic venant du réseau 10.0.10.0/24
# /24 signifie les 256 adresses de 10.0.10.0 à 10.0.10.255
sudo ufw allow from 10.0.10.0/24
# Autorise UNIQUEMENT le port 3306 (MySQL) depuis le réseau local
# Plus sécurisé : la base de données n'est accessible que depuis les machines du LAN
sudo ufw allow from 10.0.10.0/24 to any port 3306
# Autorise UNE SEULE adresse IP à se connecter en SSH
sudo ufw allow from 10.0.10.5 to any port 22
# Bloque TOUT le trafic provenant de cette adresse IP
sudo ufw deny from 192.168.1.100
# Bloque tout un sous-réseau (toutes les IP 172.16.x.x)
sudo ufw deny from 172.16.0.0/16
# Bloque le port 25 (SMTP) en entrée
# "in" = trafic entrant uniquement
sudo ufw deny in 25/tcp
# Affiche les règles avec un numéro devant chacune
# Pratique pour savoir quelle règle supprimer ou où insérer une nouvelle
sudo ufw status numbered
# Insère une règle EN POSITION 1 (tout en haut = priorité maximale)
# Utile quand on veut qu'une règle soit évaluée avant toutes les autres
sudo ufw insert 1 allow from 10.0.10.5 to any port 22
# Supprime la règle numéro 3 (vérifiez d'abord avec "status numbered")
sudo ufw delete 3
# Supprime une règle en la décrivant (même syntaxe que quand on l'a créée)
sudo ufw delete allow 8080/tcp
# Active les logs du pare-feu (désactivés par défaut)
# Les logs permettent de voir qui tente de se connecter et ce qui est bloqué
sudo ufw logging on
# Règle le niveau de détail des logs
# "medium" est un bon compromis : on voit les connexions bloquées + les nouvelles connexions
sudo ufw logging medium
Les logs sont écrits dans /var/log/ufw.log :
# Affiche les 20 dernières lignes du fichier de log UFW
sudo tail -20 /var/log/ufw.log
# Affiche en TEMPS RÉEL les connexions bloquées
# -f = "follow" : la commande ne s'arrête pas, elle affiche chaque nouvelle ligne
# grep "BLOCK" = ne montre que les lignes contenant "BLOCK"
sudo tail -f /var/log/ufw.log | grep "BLOCK"
| Niveau | Description |
|---|---|
low | Log uniquement les paquets bloqués |
medium | Low + paquets invalides + nouvelles connexions |
high | Medium + tous les paquets avec rate limiting |
full | Tous les paquets sans rate limiting |
Configuration typique pour un serveur web :
# Réinitialiser les règles (optionnel, attention !)
# sudo ufw reset
# Politique par défaut
sudo ufw default deny incoming
sudo ufw default allow outgoing
# SSH (port personnalisé)
sudo ufw allow 2222/tcp comment "SSH"
# Web
sudo ufw allow 80/tcp comment "HTTP"
sudo ufw allow 443/tcp comment "HTTPS"
# Base de données uniquement depuis le réseau local
sudo ufw allow from 10.0.10.0/24 to any port 3306 comment "MySQL LAN"
sudo ufw allow from 10.0.10.0/24 to any port 5432 comment "PostgreSQL LAN"
# Monitoring (Prometheus)
sudo ufw allow from 10.0.10.0/24 to any port 9090 comment "Prometheus"
# Activer les logs
sudo ufw logging medium
# Activer le firewall
sudo ufw enable
# Vérifier
sudo ufw status verbose