[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

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
(2) pass in quick on $int_if proto tcp to port 80 tag INT_NET_HTTP
(3) pass in quick on $int_if from 192.168.1.5

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

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

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.

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

block all
pass out on $ext_if tag LAN_INET_NAT tagged LAN_INET nat-to ($ext_if)
pass in on $int_if from $int_net tag LAN_INET
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ
pass in on $ext_if proto tcp from <spamd> to port smtp \
   tag SPAMD rdr-to 127.0.0.1 port 8025

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

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

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

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
block all
pass out on $ext_if tag LAN_INET_NAT tagged LAN_INET nat-to ($ext_if)
pass in on $int_if from $int_net tag LAN_INET
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ pass in on $ext_if proto tcp from <spamd> to port smtp \
   tag SPAMD rdr-to 127.0.0.1 port 8025
# filtrage -- autoriser/bloquer suivant la politique. pass in quick on $ext_if tagged SPAMD pass out quick on $ext_if tagged LAN_INET_NAT pass out quick on $dmz_if tagged LAN_DMZ pass out quick on $dmz_if tagged INET_DMZ

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 ifconfig(8). Exemple :
# ifconfig 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.27 2011/01/29 15:46:37 ajacoutot Exp $