Pare-feu OpenBSD PF : guide de configuration et exemples
- Mise à jour le 02 mai 2026
Cette page regroupe des notes pratiques et des exemples pour Packet Filter (PF), le pare-feu d’OpenBSD, ainsi que pour le NAT et le filtrage du trafic réseau.
Les règles PF sont définies dans /etc/pf.conf et gérées avec pfctl. Les exemples ci-dessous servent de base : testez toujours une configuration avant de l’appliquer sur un système distant.
Informations
- Fichier de configuration principal :
/etc/pf.conf
- Fichier de configuration d’exemple :
/etc/examples/pf.conf
- Documentation officielle :
man pf man pf.conf man pfctl
Commande pfctl
- Vérifier la syntaxe du fichier de configuration sans le charger :
OpenBSD# pfctl -nf /etc/pf.conf
- Vérifier le fichier de configuration et afficher les règles interprétées :
OpenBSD# pfctl -nvf /etc/pf.conf
- Charger les règles depuis le fichier de configuration :
OpenBSD# pfctl -f /etc/pf.conf
- Activer PF :
OpenBSD# pfctl -e
- Désactiver PF :
OpenBSD# pfctl -d
- Vider uniquement les règles de filtrage. Attention : sans règles chargées, le pare-feu ne filtrera plus le trafic :
OpenBSD# pfctl -F rules
- Tout vider (règles, états, tables, sources et statistiques) :
OpenBSD# pfctl -F all
- Afficher les règles de filtrage actuellement chargées :
OpenBSD# pfctl -s rules
- Afficher l’état de PF et ses compteurs :
OpenBSD# pfctl -s info
- Afficher toutes les informations PF disponibles :
OpenBSD# pfctl -s all
- Afficher le contenu de la table d’états :
OpenBSD# pfctl -s state
- Supprimer tous les états provenant d’un hôte ou d’un réseau :
OpenBSD# pfctl -k host
OpenBSD# pfctl -k network
Macros
Les macros facilitent la lecture et la maintenance des règles. Elles sont particulièrement utiles pour définir des interfaces, des réseaux ou des listes de ports.
- Exemple :
tcp_services = "{ ssh, domain, www, https }"
- La macro peut ensuite être utilisée dans une règle :
pass out proto tcp to any port $tcp_services keep state
Activer PF au démarrage
- Modifier le fichier
/etc/rc.conf.local:
pf=YES
pf_rules=/etc/pf.conf
L’utilisation de /etc/rc.conf.local permet de conserver les modifications locales séparées du fichier par défaut /etc/rc.conf.
Mode routeur
Activer le mode routeur temporairement
- Activer le transfert IPv4 :
OpenBSD# sysctl net.inet.ip.forwarding=1
- Activer le transfert IPv6 :
OpenBSD# sysctl net.inet6.ip6.forwarding=1
Activer le mode routeur de façon permanente
Modifier le fichier /etc/sysctl.conf :
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1
Exemples
NAT du LAN vers le WAN, autoriser tout le trafic sortant
# MACROS
ext_if = "re0"
int_if = "re1"
localnet = $int_if:network
# NAT
match out on $ext_if from $localnet to any nat-to $ext_if
# RÈGLES DE FILTRAGE
set skip on lo
block all
pass from { self, $localnet } to any keep state
NAT du LAN vers le WAN avec filtrage réseau de base
# MACROS
ext_if = "re0"
int_if = "re1"
localnet = $int_if:network
tcp_services = "{ ssh, domain, www, https, pop3, nntp, cvspserver, 2628, 5999, 8000, 8080 }"
udp_services = "{ domain, ntp }"
# NAT
match out on $ext_if from $localnet to any nat-to $ext_if
# RÈGLES DE FILTRAGE
set skip on lo
block all
pass in on $int_if inet proto tcp from $localnet to any port $tcp_services keep state
pass in on $int_if inet proto udp from $localnet to any port $udp_services keep state
pass out on $ext_if inet from $localnet to any keep state
NAT, redirection de ports et filtrage de paquets
Cet exemple autorise les protocoles HTTP, HTTPS et DNS depuis le réseau 192.168.2.0/24. Il redirige également les connexions RDP entrantes vers un hôte du réseau local.
# MACROS
ext_if = "em0"
lan_if = "em1"
lan_net = "192.168.2.0/24"
rdp_host = "192.168.2.200"
tcp_services = "{ domain, www, https }"
udp_services = "{ domain }"
# OPTIONS
set skip on lo
# POLITIQUE PAR DÉFAUT
block return
# NAT
match out on $ext_if inet from $lan_net to any nat-to $ext_if
# REDIRECTION : rediriger le trafic RDP entrant vers l’hôte interne
pass in quick on $ext_if inet proto tcp from any to ($ext_if) port 3389 rdr-to $rdp_host port 3389
# RÈGLES DE FILTRAGE
pass in on $lan_if inet proto tcp from $lan_net to any port $tcp_services modulate state
pass in on $lan_if inet proto udp from $lan_net to any port $udp_services keep state
pass out on $ext_if inet from $lan_net to any keep state
pass out on $lan_if inet proto tcp to $rdp_host port 3389 keep state
# Autoriser l’accès SSH au pare-feu OpenBSD lui-même
pass in inet proto tcp from any to self port ssh keep state
# Par défaut, ne pas autoriser les connexions distantes vers X11
block return in on ! lo0 proto tcp to port 6000:6010
Exemple de redirection SSH
Règle de redirection
- Rediriger le trafic SSH entrant vers
10.0.0.2:
pass in quick on $ext_if proto tcp from any to ($ext_if) port ssh rdr-to 10.0.0.2 port ssh
- Autoriser la connexion SSH redirigée :
pass out on $int_if proto tcp to 10.0.0.2 port ssh keep state