[OpenBSD]

[Précédent : Ensembles d'Adresses ("Pools") et Partage de Charge] [Index] [Suivant : Journal des Evénements]

PF : Balisage des Paquets (Filtrage par Politique)


Table des Matières


Introduction

Le balisage de paquets est une méthode pour marquer les paquets avec un identifiant interne qui peut être utilisé comme critère dans les règles de filtrage et de traduction d'adresses. Grâce au balisage, il est possible de créer des paquets dits "de confiance" entre des interfaces et de déterminer si des paquets ont été traités par les règles de traduction d'adresses. Il est aussi possible de faire du filtrage suivant une politique au lieu de faire du filtrage par règle.

Affectation de Balises aux Paquets

Pour ajouter une balise à un paquet, utilisez le mot-clé tag :
pass in on $int_if all tag INTERNAL_NET keep state

La balise INTERNAL_NET sera ajoutée à tout paquet qui correspondra à la règle précitée.

Une balise peut aussi être affectée grâce à une macro. Par exemple :

name = "INTERNAL_NET"
pass in on $int_if all tag $name keep state

On peut utiliser un ensemble de macros prédéfinies.

Ces macros sont interprétées lors du chargement des règles, PAS en "runtime".

L'affectation de balises observe les règles suivantes :

Prenons le jeu de règles suivant comme exemple :

(1) pass in on $int_if tag INT_NET keep state
(2) pass in quick on $int_if proto tcp to port 80 tag \
        INT_NET_HTTP keep state
(3) pass in quick on $int_if from 192.168.1.5 keep state

De même que pour les règles de filtrage, les balises peuvent être appliquées par des règles nat, rdr et binat en utilisant le mot-clé tag.

Vérification des Balises Appliquées

Pour vérifier les balises précédemment appliquées, utilisez le mot-clé tagged comme dans l'exemple suivant :
pass out on $ext_if tagged INT_NET keep state

Les paquets sortant à partir de $ext_if doivent être balisés avec la balise INT_NET pour que la règle ci-dessus corresponde à ces paquets. La correspondance inverse peut aussi être réalisée avec l'opérateur ! :

pass out on $ext_if ! tagged WIFI_NET keep state

Les règles de réécriture (nat/rdr/binat) peuvent aussi utiliser le mot clé tagged pour correspondre aux paquets.

Filtrage par Politique

Le filtrage par politique utilise une approche différente pour l'écriture d'un jeu de règles. Une politique est définie par rapport aux types de trafic : règles pour les types de trafic à passer, règles pour les types de trafic à bloquer. Les paquets sont ensuite classifiés au sein de la politique selon les critères traditionnels : adresse IP source/destination, protocole, etc... Examinez la politique de filtrage qui suit :

Notez que la politique couvre tout le trafic qui transite par le pare-feu. Le mot entre parenthèses indique le nom de la balise qui sera utilisée pour chaque élément de la politique.

Des règles de filtrage et de traduction doivent à présent être écrites pour classifier les paquets au sein de la politique.

rdr on $ext_if proto tcp from <spamd> to port smtp \
   tag SPAMD -> 127.0.0.1 port 8025
nat on $ext_if tag LAN_INET_NAT tagged LAN_INET -> ($ext_if)

block all
pass in on $int_if from $int_net tag LAN_INET keep state
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state

Maintenant les règles qui constituent la politique sont définies.

pass in  quick on $ext_if tagged SPAMD keep state
pass out quick on $ext_if tagged LAN_INET_NAT keep state
pass out quick on $dmz_if tagged LAN_DMZ keep state
pass out quick on $dmz_if tagged INET_DMZ keep state

Maintenant que le jeu de règles a été paramétré, les modifications futures sont à apporter uniquement dans les règles de classification. Par exemple, si un serveur POP3/SMTP est ajouté à la DMZ, il sera nécessaire d'ajouter des règles de classification pour le trafic POP3 et SMTP comme le montre l'exemple suivant :

mail_server = "192.168.0.10"
...
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
   tag INET_DMZ keep state

Le trafic mail sera autorisé car il fait partie de la classification INET_DMZ.

Voici le jeu de règles complet :

# macros int_if = "dc0" dmz_if = "dc1" ext_if = "ep0" int_net = "10.0.0.0/24" dmz_net = "192.168.0.0/24" www_server = "192.168.0.5" mail_server = "192.168.0.10" table <spamd> persist file "/etc/spammers" # classification -- classifier les paquets selon la politique # définie rdr on $ext_if proto tcp from <spamd> to port smtp \ tag SPAMD -> 127.0.0.1 port 8025 nat on $ext_if tag LAN_INET_NAT tagged LAN_INET -> ($ext_if) block all pass in on $int_if from $int_net tag LAN_INET keep state pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \ tag INET_DMZ keep state # filtrage -- autoriser/bloquer suivant la politique. pass in quick on $ext_if tagged SPAMD keep state pass out quick on $ext_if tagged LAN_INET_NAT keep state pass out quick on $dmz_if tagged LAN_DMZ keep state pass out quick on $dmz_if tagged INET_DMZ keep state

Balisage des Trames Ethernet

Le balisage peut être effectué au niveau Ethernet si la machine de balisage/filtrage est aussi un pont (bridge(4)). En créant des règles de filtrage pour bridge(4) qui utilisent le mot-clé tag, PF peut filtrer les paquets d'après leur adresse MAC source ou destination. Les règles pour bridge(4) sont créés avec la commande brconfig(8). Exemple :
# brconfig bridge0 rule pass in on fxp0 src 0:de:ad:be:ef:0 \
   tag USER1

Puis dans pf.conf :

pass in on fxp0 tagged USER1

[Précédent : Ensembles d'Adresses ("Pools") et Partage de Charge] [Index] [Suivant : Journal des Evénements]


[back] www@openbsd.org
$OpenBSD: tagging.html,v 1.24 2007/05/09 05:49:53 jufi Exp $