[OpenBSD]

[Précédent : Principes de Base] [Index] [Suivant : Tables]

PF : Listes et Macros


Table des Matières


Listes

Une liste permet d'utiliser plusieurs critères similaires dans une même règle PF. Par exemple, plusieurs protocoles, plusieurs numéros de ports, plusieurs adresses IP, etc... Ainsi, au lieu d'écrire une règle de filtrage pour chaque adresse IP qui doit être bloquée, une seule règle peut être écrite en créant une liste avec les adresses IP à bloquer. Les listes sont définies en mettant des éléments entre accolades {}.

Quand pfctl(8) rencontre une liste durant le chargement de la base de règles, il crée de multiples règles : une règle pour chaque élément de la liste. Par exemple :

block out on fxp0 from { 192.168.0.1, 10.5.32.6 } to any

devient :

block out on fxp0 from 192.168.0.1 to any
block out on fxp0 from 10.5.32.6 to any

Plusieurs listes peuvent être utilisées dans une même règle. Elles ne sont pas limitées aux règles de filtrage :

rdr on fxp0 proto tcp from any to any port { 22 80 } -> \
   192.168.0.6
block out on fxp0 proto { tcp udp } from { 192.168.0.1, \
   10.5.32.6 } to any port { ssh telnet }

Les virgules entre les éléments d'une même liste sont optionnelles.

Les listes peuvent également inclurent d'autres listes :

trusted = "{ 192.168.1.2 192.168.5.36 }"
pass in inet proto tcp from { 10.10.0.0/24 $trusted } to port 22

Attention aux expressions suivantes connues sous le nom de "listes négatives", elles constituent une erreur commune :

pass in on fxp0 from { 10.0.0.0/8, !10.1.2.3 }

A l'origine, le but recherché est d'appliquer la règle précitée à n'importe quelle adresse du réseau 10.0.0.0/8 à l'exception de 10.1.2.3. Mais en réalité, cette règle est interprétée de la façon suivante :

pass in on fxp0 from 10.0.0.0/8
pass in on fxp0 from !10.1.2.3

Ce qui correspond à accepter le trafic de n'importe quelle adresse. Pour éviter cela, utilisez une table.

Macros

Les macros sont des variables définies par l'utilisateur pouvant contenir des adresses IP, des numéros de ports, des noms d'interfaces, etc... Les macros peuvent réduire la complexité d'une base de règles PF et faciliter sa maintenance.

Les noms de macros doivent commencer par une lettre et peuvent contenir des lettres, des chiffres et des barres de soulignement "_". Les noms des macros ne doivent pas être des noms réservés tels que pass, out ou queue.

ext_if = "fxp0"

block in on $ext_if from any to any

L'exemple précédent montre comment créer une macro nommée ext_if. Quand une macro est appelée après avoir été créée, son nom est précédé d'un caractère $.

Les macros peuvent aussi représenter des listes tel que le montre l'exemple suivant :

friends = "{ 192.168.1.1, 10.0.2.5, 192.168.43.53 }"

Elles peuvent être définies de manière récursive. Vu qu'elles ne sont pas traduites dans des guillemets "", la syntaxe suivante doit être employée :

host1 = "192.168.1.1"
host2 = "192.168.1.2"
all_hosts = "{" $host1 $host2 "}"

La macro $all_hosts correspond maintenant à la liste d'adresses IP {192.168.1.1 192.168.1.2}.

[Précédent : Principes de Base] [Index] [Suivant : Tables]


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