---
title: "Règles Firewall"
domain: network
subdomain: firewall
type: snippet
tags: [firewall, iptables, nftables, pfsense, security, règles]
difficulty: intermediate
status: stable
updated: "2025-05-10"
---
## iptables

### Structure des chaînes

```
Tables :   filter | nat | mangle | raw
Chaînes :  INPUT | OUTPUT | FORWARD (table filter)
           PREROUTING | POSTROUTING (tables nat/mangle)

Politique par défaut : ACCEPT ou DROP
Ordre : les règles sont évaluées de haut en bas — première correspondance gagne
```

### Règles de base

```bash
# Voir les règles actuelles
iptables -L -n -v
iptables -L -n -v --line-numbers   # avec numéros de ligne

# Politique par défaut — DROP tout, autoriser explicitement
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

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

# Autoriser les connexions établies / liées
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH depuis une IP spécifique
iptables -A INPUT -p tcp -s {{SERVER_IP}} --dport 22 -j ACCEPT

# HTTP / HTTPS public
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# ICMP (ping)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# Log les refus
iptables -A INPUT -j LOG --log-prefix "IPT-DROP: " --log-level 4
iptables -A INPUT -j DROP
```

### Gestion des règles

```bash
# Insérer à une position spécifique
iptables -I INPUT 3 -p tcp --dport 8080 -j ACCEPT

# Supprimer une règle (par numéro)
iptables -D INPUT 3

# Supprimer une règle (par contenu)
iptables -D INPUT -p tcp --dport 8080 -j ACCEPT

# Vider toutes les règles
iptables -F
iptables -X   # supprimer les chaînes personnalisées

# Sauvegarder / restaurer
iptables-save > /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4
```

### NAT

```bash
# SNAT — masquerading (IP dynamique)
iptables -t nat -A POSTROUTING -o {{INTERFACE}} -j MASQUERADE

# SNAT — IP statique
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source {{SERVER_IP}}

# DNAT — redirection de port (port forwarding)
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80

# Activer le forwarding IP
echo 1 > /proc/sys/net/ipv4/ip_forward
# Persistant :
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
```

## nftables (remplace iptables)

```bash
# Voir la config actuelle
nft list ruleset

# Config de base
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }
nft add chain inet filter output { type filter hook output priority 0 \; policy accept \; }

# Règles
nft add rule inet filter input iif lo accept
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input tcp dport 22 accept
nft add rule inet filter input tcp dport { 80, 443 } accept
nft add rule inet filter input icmp type echo-request accept
nft add rule inet filter input log prefix "nft-drop: "
```

```bash
# Fichier de config /etc/nftables.conf
flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;
        iif lo accept
        ct state established,related accept
        tcp dport 22 accept
        tcp dport { 80, 443 } accept
        icmp type echo-request accept
        log prefix "nft-drop: "
    }
    chain forward {
        type filter hook forward priority 0; policy drop;
    }
    chain output {
        type filter hook output priority 0; policy accept;
    }
}

# Appliquer
nft -f /etc/nftables.conf
systemctl enable nftables
```

## UFW (Ubuntu / Debian)

```bash
# Activer UFW
ufw enable
ufw status verbose

# Politique par défaut
ufw default deny incoming
ufw default allow outgoing

# Règles
ufw allow 22/tcp
ufw allow from {{SERVER_IP}} to any port 22
ufw allow 80/tcp
ufw allow 443/tcp
ufw deny from 192.168.1.100

# Supprimer une règle
ufw delete allow 80/tcp
ufw delete 3   # par numéro (ufw status numbered)

# App profiles
ufw allow 'Nginx Full'
ufw app list
```

## pfSense — bonnes pratiques

```
Structure des règles pfSense :
- Règles par interface (LAN, WAN, DMZ...)
- Ordre d'évaluation : de haut en bas
- Règle "block" implicite en bas de chaque interface

Zones recommandées :
  WAN     → Internet (tout bloquer par défaut)
  LAN     → Réseau interne (autoriser sortant, bloquer inter-VLAN)
  DMZ     → Serveurs exposés (autoriser ports publiés seulement)
  MGMT    → Administration (très restrictif, MFA)
  USERS   → Postes utilisateurs (filtrage DNS, web)
```

```bash
# Règles type DMZ
# DMZ → WAN : autoriser HTTP/HTTPS sortant
# WAN → DMZ : autoriser 80, 443 entrant vers les serveurs
# DMZ → LAN : BLOQUER (isolation DMZ)
# LAN → DMZ : autoriser les ports de gestion nécessaires uniquement
```

<Tip>
Toujours appliquer le principe du moindre privilège : tout bloquer par défaut, n'autoriser que ce qui est explicitement nécessaire. Documenter chaque règle avec une description (source, destination, port, raison).
</Tip>
