Post

UFW & iptables : firewall Linux en pratique

UFW & iptables : firewall Linux en pratique

La plupart des serveurs compromis que j’ai vus avaient un point commun : pas de firewall, ou un firewall mal configuré. UFW rend ça trivial. Voici comment verrouiller ton serveur en 5 minutes.

UFW vs iptables

iptables est le firewall natif du noyau Linux. Puissant mais verbeux.

UFW (Uncomplicated Firewall) est un front-end simplifié pour iptables. Même résultat, 10x moins de syntaxe.

1
2
3
4
5
# Règle iptables classique
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Équivalent UFW
ufw allow 22/tcp

Règle : utilise UFW par défaut, passe à iptables directement uniquement si tu as besoin de règles avancées (rate limiting par IP, NAT, routing).

Setup de base

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Installer UFW (souvent pré-installé)
sudo apt install ufw -y

# Politique par défaut : tout bloquer en entrée, tout autoriser en sortie
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Autoriser SSH AVANT d'activer (sinon tu te coupes l'accès)
sudo ufw allow 22/tcp

# Activer
sudo ufw enable

# Vérifier
sudo ufw status verbose

Règles essentielles

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# SSH (port custom)
sudo ufw allow 2222/tcp

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

# Limiter le SSH (rate limiting — max 6 connexions en 30s)
sudo ufw limit 2222/tcp

# Autoriser un sous-réseau spécifique
sudo ufw allow from 192.168.1.0/24 to any port 3306

# Autoriser une IP spécifique
sudo ufw allow from 203.0.113.42

# Bloquer une IP
sudo ufw deny from 198.51.100.0/24

# Autoriser un port range
sudo ufw allow 6000:6100/tcp

# Autoriser un service par nom
sudo ufw allow OpenSSH

Règles par interface

1
2
3
4
5
# Autoriser le port 80 uniquement sur l'interface VPN
sudo ufw allow in on wg0 to any port 80

# Autoriser le SSH uniquement sur le LAN
sudo ufw allow in on eth0 from 192.168.1.0/24 to any port 22

iptables directement (cas avancés)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Rate limiting par IP (plus fin que ufw limit)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

# Loguer les paquets rejetés (debug)
iptables -A INPUT -j LOG --log-prefix "UFW-REJECT: " --log-level 4

# NAT (forward port 8080 → container Docker 172.17.0.2:80)
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
iptables -A FORWARD -p tcp -d 172.17.0.2 --dport 80 -j ACCEPT

# Anti-scan de ports
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

Docker et UFW — le piège classique

Problème : Docker manipule iptables directement et contourne UFW. Les ports exposés via -p 8080:80 sont accessibles même si UFW les bloque.

Solution :

1
2
3
4
# /etc/docker/daemon.json
{
  "iptables": false
}

Puis redémarrer Docker et gérer les règles manuellement via UFW. Ou utiliser docker-proxy avec des binds sur localhost uniquement :

1
2
3
4
5
# docker-compose.yml
services:
  app:
    ports:
      - "127.0.0.1:8080:80"  # accessible uniquement en local

Ensuite Nginx reverse proxy vers 127.0.0.1:8080.

Checklist

  • Politique deny incoming par défaut
  • SSH autorisé avant activation
  • Rate limiting sur SSH (ufw limit)
  • Seuls les ports nécessaires sont ouverts
  • Docker ne contourne pas UFW
  • Logs activés pour les paquets rejetés
  • Règles par interface si multi-NIC

Monitoring

1
2
3
4
5
6
7
8
9
10
11
# Voir les règles actives
sudo ufw status numbered

# Voir les connexions actives
ss -tlnp

# Compter les connexions par IP
ss -tn | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head 10

# Logs UFW
sudo journalctl -u ufw -f

Références :

Besoin d’un audit de la configuration réseau de tes serveurs ? Contacte-moi.

This post is licensed under CC BY 4.0 by the author.