OBSD4* : wiki

Version de traduction basée sur la 6.4 officielle (v1.41 : 30/10/2018)


PF - Étiquetage de Paquets (politique de filtrage)

Introduction

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.

Attribuer des étiquettes aux paquets

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ègle

Ces macros sont élargies lorsque les règles sont chargées, PAS lors de l'exécution.

L'étiquetage suit ces règles :

  • Les étiquettes sont “collantes”. Une fois qu'une étiquette est appliquée à un paquet par une règle correspondante, elle n'est jamais retirée. Elle peut cependant être remplacée par une autre étiquette.
  • En conséquence du caractère “collant” des étiquettes, un paquet peut avoir une étiquette même si la dernière règle n'utilise pas le mot clé tag.
  • Un paquet ne peut avoir qu'une étiquette à la fois.
  • Les étiquettes sont des identifiants internes. Les étiquettes ne sont pas transmises à travers les câbles.
  • Les noms d'étiquettes peuvent être au maximum long de 63 caractères.

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
  • Les paquets arrivant sur $int_if recevront l'étiquette INT_NET par la règle #1.
  • Les paquets TCP arrivant sur $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.
  • Les paquets arrivant sur $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).

Vérifier les étiquettes appliquées

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

Politique de filtrage

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 :

  • Le trafic provenant de l'intranet vers internet est autorisé (LAN_INET) et doit être traduit (LAN_INET_NAT).
  • Le trafic de l'intranet vers la DMZ est autorisé (LAN_DMZ).
  • Le trafic venant d'internet vers les serveurs dans la DMZ est autorisé (INET_DMZ).
  • Le trafic venant d'internet qui est redirigé vers spamd(8) est autorisé (SPAMD).
  • Tout autre trafic est bloqué.

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

Étiqueter les frames ethernet

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 bridge(4) qui utilisent le mot clé tag, PF peut être configuré pour filtrer par rapport à l'adresse MAC source ou de destination. Les règles bridge(4) sont créées en utilisant la commande ifconfig(8). Exemple :

  # 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.