rss logo

Pare-feu OpenBSD PF : guide de configuration et exemples

OpenBSD Logo

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

💡 Note : PF lit les règles de haut en bas, mais c’est la dernière règle correspondante qui est appliquée, sauf si une règle utilise le mot-clé quick. Lorsqu’un paquet correspond à une règle quick, PF cesse d’évaluer les règles suivantes pour ce paquet.

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

💡 Note : Les règles de NAT et de redirection doivent être placées avant les règles de filtrage dans la configuration.

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