OpenBSD PF: Packet Tagging (Policy Filtering) : (v1.43 ; 05/05/2021)
— [ FAQ Index ] | [ Index PF ] ~ Traduction française de la page OpenBSD PF : Étiquetage de Paquets (politique de filtrage) —
L'étiquetage des paquets est une façon de les marquer avec un identifiant interne qui peut être utilisé plus tard comme critère de règles de filtrage et règles de traduction. Avec les étiquettes, il est possible de faire des choses comme la création de “confiances” entre interfaces et déterminer si les paquets ont été traités par des règles de traduction. Il est également possible de s'éloigner du filtrage basé sur des règles et de démarrer une politique de filtrage.
Pour ajouter une étiquette à un paquet, utilisez le mot clé tag
:
pass in on $int_if all tag INTERNAL_NET
L'étiquette INTERNAL_NET
sera ajoutée à chaque paquet qui correspond à la règle ci-dessus.
Une étiquette peut aussi être appliquée à une macro. Par exemple :
name = "INTERNAL_NET" pass in on $int_if all tag $name
Il existe un ensemble de macros prédéfinies qui peuvent également être utilisées :
$if
- L'interface$srcaddr
- L'adresse IP source$dstaddr
- L'adresse IP de destination$srcport
- Le port source$dstport
- Le port de destination$proto
- Le protocole$nr
- Le numéro de règleCes macros sont étendues lorsque les règles sont chargées, pas lors de l'exécution.
L'étiquetage suit ces règles :
tag
.Prenez par exemple les règles suivantes :
pass in on $int_if tag INT_NET pass in quick on $int_if proto tcp to port 80 tag INT_NET_HTTP pass in quick on $int_if from 192.168.1.5
$int_if
recevront l'étiquette INT_NET
par la règle #1.$int_if
et à destination du port 80 recevront d'abord l'étiquette INT_NET
par la règle #1. Cette étiquette sera remplacée par INT_NET_HTTP
par la règle #2.$int_if
depuis 192.168.1.5 seront étiquetés d'une des deux façons. Si le paquet est à destination du port 80 en TCP il correspondra à la règle #2 et sera étiqueté INT_NET_HTTP
. Sinon, ce paquet correspondra à la règle #3 mais sera étiqueté INT_NET
. Comme ce paquet correspond à la règle #1, l'étiquette INT_NET
est appliquée et n'est pas retirée à moins qu'une règle correspondante ne précise une autre étiquette (il s'agit du caractère “collant” des étiquettes).
Pour vérifier si une étiquette a été précédemment apposée, utilisez le mot clé tagged
:
pass out on egress tagged INT_NET
Les paquets sortants sur l'interface externe devront avoir l'étiquette INT_NET
de façon à correspondre à la règle ci-dessus. Une correspondance inverse peut aussi être réalisée avec l'opérateur !
:
pass out on egress ! tagged WIFI_NET
Une politique de filtrage appréhende différemment l'écriture de règles de filtrage. Une politique définit quel type de trafic peut passer ou quel type est bloqué. Les paquets sont ensuite classés sur la politique portant sur les critères traditionnels d'adresse IP source/destination, de port, de protocole, etc. Par exemple, examinez la politique du pare-feu suivant :
Remarquez comment la politique couvre tout le trafic qui passera au travers du pare-feu. L'élément entre parenthèses indique l'étiquette qui sera utilisée pour cet élément de la politique.
Les règles ont maintenant besoin d'être écrites pour classer les paquets dans la politique.
block all pass out on egress inet 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 egress proto tcp to $www_server port 80 tag INET_DMZ pass in on egress proto tcp from <spamd> to port smtp tag SPAMD rdr-to 127.0.0.1 port 8025
Maintenant les règles qui définissent la politique sont :
pass in quick on egress tagged SPAMD pass out quick on egress tagged LAN_INET_NAT pass out quick on $dmz_if tagged LAN_DMZ pass out quick on $dmz_if tagged INET_DMZ
Maintenant que l'ensemble des règles est paramétré, les modifications sont une question de classement des règles. Par exemple, si un serveur POP3/SMTP est ajouté à la DMZ, il sera nécessaire d'ajouter une règle de classement pour les trafics POP3 et SMTP, telle que :
mail_server = "192.168.0.10" [...] pass in on egress proto tcp to $mail_server port { smtp, pop3 } tag INET_DMZ
Le trafic des courriels passera maintenant comme une partie des entrées de la politique INET_DMZ.
Le jeu complet des règles :
int_if = "dc0" dmz_if = "dc1" 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 -- classify packets based on the defined firewall policy. block all pass out on egress inet tag LAN_INET_NAT tagged LAN_INET nat-to (egress) 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 egress proto tcp to $www_server port 80 tag INET_DMZ pass in on egress proto tcp from <spamd> to port smtp tag SPAMD rdr-to 127.0.0.1 port 8025 # policy enforcement -- pass/block based on the defined firewall policy. pass in quick on egress tagged SPAMD pass out quick on egress tagged LAN_INET_NAT pass out quick on $dmz_if tagged LAN_DMZ pass out quick on $dmz_if tagged INET_DMZ
L'étiquetage peut être réalisé au niveau Ethernet si la machine faisant l'étiquetage et le filtrage se comporte aussi comme un bridge(4). En créant des règles de filtrage pour le bridge qui utilisent le mot clé tag
, PF peut être configuré pour filtrer par rapport à l'adresse MAC source ou de destination. Les règles de bridge sont créées en utilisant la commande ifconfig(8) :
# ifconfig bridge0 rule pass in on fxp0 src 0:de:ad:be:ef:0 tag USER1
Et ensuite dans pf.conf
:
pass in on fxp0 tagged USER1
Cette page est la traduction officieuse de la page “Packet tagging (policy filtering)“ de la FAQ officielle d'OpenBSD.
En cas de doute, merci de vous y référer !
Si vous voulez participer à l'effort de traduction, merci de lire ce topic.
Contribut(rice|eur)s :