Filtrage du trafic réseau, NAT et règles de pare-feu sous Linux.

Sujets associés : NAT, Pile réseau — Vue d’ensemble, Interfaces et routage


Architecture iptables

iptables opère via des tables contenant des chaînes de règles :

Tables :
  filter  ← filtrage par défaut (INPUT, FORWARD, OUTPUT)
  nat     ← translation d'adresses (PREROUTING, POSTROUTING, OUTPUT)
  mangle  ← modification des paquets (TTL, TOS, mark)
  raw     ← désactiver le suivi de connexion

Chaînes principales (table filter) :
  INPUT    ← paquets à destination de la machine locale
  FORWARD  ← paquets traversant la machine (routage)
  OUTPUT   ← paquets émis par la machine locale

Politiques par défaut : ACCEPT ou DROP

iptables — commandes essentielles

Lister les règles

# Lister les règles de la table filter
sudo iptables -L
sudo iptables -L -v              # avec compteurs (paquets/octets)
sudo iptables -L -n              # sans résolution DNS
sudo iptables -L -n --line-numbers  # avec numéros de ligne
 
# Lister une chaîne spécifique
sudo iptables -L INPUT -n -v
 
# Lister la table NAT
sudo iptables -t nat -L -n -v

Politique par défaut

# Tout bloquer par défaut puis autoriser explicitement (whitelist)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
 
# Tout autoriser (permissif)
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

Règles de base — INPUT (trafic entrant)

# Autoriser les connexions déjà établies (CRITIQUE — à mettre en premier)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
 
# Autoriser le loopback
sudo iptables -A INPUT -i lo -j ACCEPT
 
# Autoriser SSH (port 22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
 
# Autoriser SSH depuis un réseau spécifique seulement
sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
 
# Autoriser HTTP / HTTPS
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
 
# Autoriser ICMP (ping)
sudo iptables -A INPUT -p icmp -j ACCEPT
 
# Bloquer une IP spécifique
sudo iptables -A INPUT -s 203.0.113.5 -j DROP
 
# Limiter le débit (rate limiting) — protection contre les scans
sudo iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/min --limit-burst 5 -j ACCEPT
 
# Journaliser avant de bloquer
sudo iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: " --log-level 4
sudo iptables -A INPUT -j DROP

Supprimer des règles

# Supprimer par numéro de ligne
sudo iptables -L INPUT -n --line-numbers
sudo iptables -D INPUT 3        # supprimer la règle n°3
 
# Supprimer en spécifiant la règle exacte
sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT
 
# Vider toutes les règles d'une chaîne
sudo iptables -F INPUT           # flush INPUT
sudo iptables -F                 # flush toutes les chaînes
 
# Remettre à zéro les compteurs
sudo iptables -Z

NAT (table nat)

# MASQUERADE : SNAT dynamique (pour partager une connexion Internet)
# Activer le forwarding IP d'abord
sudo sysctl -w net.ipv4.ip_forward=1
 
# Trafic sortant via eth0 → masquer l'IP source
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
 
# SNAT statique (IP publique fixe)
sudo iptables -t nat -A POSTROUTING -o eth0 \
    -j SNAT --to-source 203.0.113.1
 
# DNAT : redirection de port entrant (port forwarding)
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
    -j DNAT --to-destination 192.168.1.10:8080
# → le port 80 de la machine est redirigé vers 192.168.1.10:8080
 
# Redirection locale (OUTPUT) — utile pour rediriger localhost
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 \
    -j REDIRECT --to-port 8080

FORWARD (routeur / passerelle)

# Permettre le forwarding entre deux interfaces
sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth0 -m conntrack \
    --ctstate ESTABLISHED,RELATED -j ACCEPT
 
# Permettre le trafic vers un réseau spécifique seulement
sudo iptables -A FORWARD -s 192.168.1.0/24 -d 10.0.0.0/8 -j ACCEPT

Persister les règles

# Debian/Ubuntu
sudo apt install iptables-persistent
sudo netfilter-persistent save     # sauvegarder
sudo netfilter-persistent reload   # recharger
 
# Sauvegarder manuellement
sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6
 
# Restaurer
sudo iptables-restore < /etc/iptables/rules.v4

ufw — interface simplifiée (Ubuntu)

ufw (Uncomplicated Firewall) est une couche d’abstraction au-dessus d’iptables.

# Activer / désactiver
sudo ufw enable
sudo ufw disable
sudo ufw status verbose
 
# Politique par défaut
sudo ufw default deny incoming
sudo ufw default allow outgoing
 
# Autoriser / refuser par service ou port
sudo ufw allow ssh                  # utilise /etc/services
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443
sudo ufw deny 23                    # bloquer Telnet
 
# Autoriser un port depuis une IP spécifique
sudo ufw allow from 192.168.1.0/24 to any port 22
sudo ufw allow from 10.0.0.5 to any port 5432
 
# Limiter les tentatives de connexion (fail2ban-like)
sudo ufw limit ssh
 
# Supprimer une règle
sudo ufw delete allow 80
sudo ufw status numbered            # voir les numéros
sudo ufw delete 3                   # supprimer par numéro
 
# Voir les règles iptables générées par ufw
sudo iptables -L -n -v

nftables — successeur d’iptables (moderne)

# Afficher les règles actuelles
sudo nft list ruleset
 
# Afficher une table spécifique
sudo nft list table inet filter
 
# Exemple de configuration complète
sudo nft -f - <<'EOF'
table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;
 
        ct state established,related accept
        iif lo accept
        ip protocol icmp accept
 
        tcp dport 22 accept
        tcp dport { 80, 443 } accept
    }
 
    chain forward {
        type filter hook forward priority 0; policy drop;
    }
 
    chain output {
        type filter hook output priority 0; policy accept;
    }
}
EOF
 
# Ajouter une règle
sudo nft add rule inet filter input tcp dport 8080 accept
 
# Supprimer la ruleset complète
sudo nft flush ruleset
 
# Persister
sudo nft list ruleset > /etc/nftables.conf
sudo systemctl enable nftables

Recettes complètes

# Pare-feu serveur web minimal
sudo iptables -F
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
 
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -p icmp -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT  # SSH restreint
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
 
# NAT pour partager la connexion Internet du serveur
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
 
# Bloquer une IP après trop de tentatives (exemple manuel)
sudo iptables -A INPUT -s 203.0.113.5 -j DROP

En relation avec