[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.
- $if - L'interface
- $srcaddr - L'adresse IP source
- $dstaddr - L'adresse IP destination
- $srcport - Le port source
- $dstport - Le port destination
- $proto - Le protocole
- $nr - Le numéro de la règle
Ces macros sont interprétées lors du chargement des règles, PAS en
"runtime".
L'affectation de balises observe les règles suivantes :
- Les balises sont adhérentes ("sticky"). Une fois qu'une balise est
appliquée à un paquet par une règle correspondante, elle n'est
jamais supprimée. Cependant, elle peut être remplacée par une balise
différente.
- A cause de cette forte adhérence d'une balise, un paquet peut avoir
une balise même si la dernière règle correspondante n'utilise pas le
mot-clé tag.
- Un paquet ne peut avoir qu'une seule balise à un moment donné.
- Les balises sont des identifiants internes. Elles ne sont pas
envoyées sur le réseau.
- Les noms de balise peuvent contenir jusqu'à 63 caractères. Sous
OpenBSD 4.0 et inférieur ces noms étaient limités à 15 caractères.
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
- Les paquets arrivant sur l'interface $int_if se verront
attribuer une balise INT_NET par la règle #1.
- Les paquets TCP arrivant sur l'interface $int_if et
destinés au port 80 se verront d'abord attribuer une balise
INT_NET par la règle #1. Cette balise sera ensuite
remplacée par la balise INT_NET_HTTP à cause de la règle
#2.
- Les paquets arrivant sur l'interface $int_if et en
provenance de 192.168.1.5 seront tagués d'une ou deux façons.
Si le paquet est destiné au port 80, il correspondra à la règle #2
et sera tagué avec INT_NET_HTTP. Sinon le paquet
correspondra à la règle #3 et sera tagué avec INT_NET.
Parce que le paquet correspond à la règle #1, le tag
INT_NET sera ajouté et ne sera pas supprimé à moins qu'une
autre règle correspondante spécifie un tag (on dit que le tag est
"collant")
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 :
- Le trafic provenant du LAN interne et à destination d'Internet est
permis (LAN_INET) et doit être réécrit (LAN_INET_NAT)
- Le trafic provenant du LAN interne et à destination de la DMZ est
autorisé (LAN_DMZ)
- Le trafic provenant d'Internet et à destination de serveurs dans la
DMZ est autorisé (INET_DMZ)
- Le trafic provenant d'Internet et redirigé vers
spamd(8)
est autorisé (SPAMD)
- Tout autre trafic est bloqué
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]
www@openbsd.org
$OpenBSD: tagging.html,v 1.27 2011/01/29 15:46:37 ajacoutot Exp $