[OpenBSD]

[Précédent : Scrub (Normalisation de Paquets)] [Index] [Suivant : Gestion de La Bande Passante]

PF : Ancres


Table des Matières


Introduction

En plus de la base de règles principale, PF peut aussi évaluer des bases de règles secondaires. Vu que les bases de règles secondaires ("sub rulesets" en anglais) peuvent être manipulées à la volée en utilisant pfctl(8), elles fournissent un bon moyen de modifier dynamiquement l'ensemble des règles actives. Alors qu'une table est utilisée pour contenir une liste dynamique d'adresses, une base de règle secondaire est utilisée pour contenir un ensemble dynamique de règles de filtrage, nat, rdr, et binat.

Les bases de règles secondaires sont attachées à la base de règles principale à l'aide d'ancres. Il existe quatre types de règles anchor (ancre en anglais) :

Les ancres peuvent être imbriquées, ce qui permet aux sous-règles d'êtres enchainées ensembles. Les règles d'ancres seront évaluées par rapport à l'ancre depuis laquelle elles sont chargées. Par exemple, les règles d'ancres de la base de règles principales peuvent créer des points d'ancrage avec la base de règles principale comme parent, et les règles d'ancres chargées à partir de fichiers à l'aide de la directive load anchor créeront des points d'ancrage définissant cette ancre comme parent.

Ancres

Une ancre est une collection de règles de filtrage et/ou de traduction, des tables et d'autres ancres auxquelles un nom a été affecté. Lorsque PF lit une règle anchor dans le jeu de règles principal, il va évaluer les règles contenues dans ce point d'ancre de la même manière qu'il évalue des règles dans la base de règles principale. Le traitement de la base de règles principale se poursuivra ensuite à moins que le paquet en cours de traitement ne corresponde à une règle de filtrage qui utilise le mot-clé quick ou à une règle de traduction dans l'ancre, auquel cas la correspondance est déclarée comme finale et l'évaluation sera arrêtée aussi bien dans les bases de règles rattachées à l'ancre que dans la base de règles principale.

Par exemple :

ext_if = "fxp0"

block on $ext_if all
pass  out on $ext_if all keep state
anchor goodguys

Cette base de règles implémente une politique dite restrictive (tout ce qui n'est pas connu est interdit par défaut) sur l'interface fxp0 aussi bien pour le trafic entrant que le trafic sortant. Le trafic sortant est ensuite autorisé et un état est gardé. Ensuite une règle d'ancrage est créée avec le nom goodguys. Les ancres peuvent être peuplées avec des règles de trois façons différentes :

La règle de chargement load est utilisée pour ordonner à pfctl de peupler l'ancre spécifiée à partir d'un fichier texte. La règle load doit être placée après la règle anchor. Par exemple :

anchor goodguys
load anchor goodguys from "/etc/anchor-goodguys-ssh"

Pour ajouter des règles à une ancre à l'aide de pfctl, le type de commandes suivant devra être employé :

# echo "pass in proto tcp from 192.0.2.3 to any port 22" \
   | pfctl -a goodguys -f -

Les règles peuvent aussi être sauvegardées et chargées à partir d'un fichier texte :

# cat >> /etc/anchor-goodguys-www
pass in proto tcp from 192.0.2.3 to any port 80
pass in proto tcp from 192.0.2.4 to any port { 80 443 }

# pfctl -a goodguys -f /etc/anchor-goodguys-www

Pour charger les règles directement à partir du jeu de règles principal, entourez les règles d'ancrage dans un bloc délimité par des accolades :

anchor "goodguys" {
   pass in proto tcp from 192.168.2.3 to port 22
}

Les ancres spécifiées de cette façon peuvent contenir d'autres ancres.

allow = "{ 192.0.2.3 192.0.2.4 }"

anchor "goodguys" {
   anchor {
      pass in proto tcp from 192.0.2.3 to port 80
   }
   pass in proto tcp from $allow to port 22
}
Lorsque les règles d'ancrage sont directement spécifiées dans le jeu de règles principal, le nom de l'ancre devient optionnel. Veuillez noter que l'ancre imbriquée dans l'exemple précité n'a pas de nom. Veuillez notez aussi que la macro $allow est créée en dehors de l'ancre (dans le jeu de règles principal) puis utilisée à l'intérieur de cette dernière.

Des règles de filtrage et de traduction peuvent être chargées dans une base de règles nommée en utilisant les mêmes syntaxes et options utilisées par les règles définies dans la base de règles principale. Une exception est à signaler cependant dans le cas des macros, sauf si vous utilisez des ancres directement dans le jeu de règles principal. Les macros utilisées dans une base de règles nommée doivent aussi être définies dans la base de règles nommée qui les utilisent; les macros définies dans la base de règles principale ne sont pas visibles par les bases de règles nommées.

Etant donné que les ancres peuvent être imbriquées, il est possible de demander l'évaluation de toutes les ancres filles :

anchor "spam/*"

Cette syntaxe cause l'évaluation de chaque règle attachée à l'ancre spam. Les ancres filles seront évaluées dans l'ordre alphabétique mais ne sont pas parcourues récursivement. Les ancres sont toujours relatives à l'ancre dans laquelle elles sont définies.

Chaque ancre, ainsi que la base de règles principale, existe séparément des autres jeux de règles. Les opérations effectuées sur une base de règles, telles que la suppression des règles, n'a aucun effet sur les autres bases. De plus, la suppression d'un point d'ancrage dans la base de règles principale ne détruit pas l'ancre ni les ancres attachées à celles- ci. Une ancre n'est détruite que lorsque toutes les ancres qu'elle contient sont supprimées à l'aide de pfctl(8).

Options d'Ancrage

Optionnellement, les règles d'ancrage anchor peuvent spécifier une interface, un protocole, un port source, un port destination, une balise, etc... en utilisant la même syntaxe que celle employée dans les règles de filtrage. Lorsque de telles informations sont fournies, les règles d'ancrage anchor sont uniquement évaluées lorsque le paquet en cours de traitement correspond à la définition de la règle anchor. Par exemple :
ext_if = "fxp0"

block on $ext_if all
pass  out on $ext_if all keep state
anchor ssh in on $ext_if proto tcp from any to any port 22

Les règles de l'ancre ssh sont uniquement évaluées pour les paquets TCP destinés au port 22 en entrée de fxp0. Ces règles sont alors ajoutées à l'ancre (anchor) de la façon suivante :

# echo "pass in from 192.0.2.10 to any" | pfctl -a ssh -f -

Ainsi, même si la règle de filtrage ne spécifie ni l'interface, ni le protocole ni d'autres paramètres tels que le port, l'hôte 192.0.2.10 sera uniquement autorisé à faire des connexions SSH vu la définition de la règle d'ancrage (anchor).

La même syntaxe peut être appliquée aux ancres spécifiées directement dans le jeu de règles principal.

allow = "{ 192.0.2.3 192.0.2.4 }"

anchor "goodguys" in proto tcp {
   anchor proto tcp to port 80 {
      pass from 192.0.2.3
   }
   anchor proto tcp to port 22 {
      pass from $allow
   }
}

Manipulation des Ancres

La manipulation des ancres se fait à l'aide de pfctl. Cette commande peut être utilisée pour ajouter ou supprimer des règles d'une ancre sans nécessiter le rechargement de la base de règles principale.

Pour lister toutes les règles de l'ancre ssh :

# pfctl -a ssh -s rules

Pour supprimer toutes les règles de filtrage de la même ancre :

# pfctl -a ssh -F rules

Pour une liste complète des commandes, veuillez consulter pfctl(8).

[Précédent : Scrub (Normalisation de Paquets)] [Index] [Suivant : Gestion de La Bande Passante]


[back] www@openbsd.org
$OpenBSD: anchors.html,v 1.18 2008/01/13 13:43:34 tobias Exp $