OBSD4* : wiki

Version de traduction basée sur la 6.2 officielle


PF - Tables

Introduction

Une table est utilisée pour contenir un groupe d'adresses IPv4 et/ou IPv6. L'usage de table est très rapide, et consomme moins de mémoire et de temps processeur que les listes. Pour cette raison, une table est idéale pour contenir un grand groupe d'adresses puisque le temps de consultation d'une table contenant 50 000 adresses est seulement un peu plus long que celle contenant 50 adresses. Les tables peuvent être utilisées de la manière suivante :

  • Les adresses source et/ou destination dans les règles.
  • Les options de règles de translation et de redirection d'adresses nat-to et rdr-to, respectivement.
  • Les options de règles d'adresses de destination route-to, reply-to et dup-to.

Les tables sont créées soit dans pf.conf(5) ou soit en utilisant pfctl(8).

Configuration

Dans pf.conf, les tables sont créées en utilisant la directive table. Les attributs suivants peuvent être spécifiés pour chaque table :

  • const : le contenu de la table ne peut pas être changé une fois que la table est créée. Quand cet attribut n'est pas spécifié, pfctl(8) peut être utilisé pour ajouter ou enlever des adresses depuis la table à tout instant, même lorsque fonctionne le niveau de sécurité 'securelevel(7)' sur deux ou plus.
  • persist : oblige le noyau à garder la table en mémoire même quand aucune règle ne s'y réfère. Sans cet attribut, le noyau supprimera automatiquement la table quand la dernière règle référencée est vidée.

Exemple :

  table <goodguys> { 192.0.2.0/24 }
  table <rfc1918>  const { 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }
  table <spammers> persist
  block in on fxp0 from { <rfc1918>, <spammers> } to any
  pass  in on fxp0 from <goodguys> to any

Les adresses peuvent être aussi spécifiées par l'utilisation du modificateur de négation (ou “not”), telle que :

  table <goodguys> { 192.0.2.0/24, !192.0.2.5 }

La table goodguys correspondra maintenant à toutes les adresses du réseau 192.0.2.0/24, exceptée pour 192.0.2.5.

Notez que les noms de table sont toujours enfermés dans les chevrons < >.

Les tables peuvent aussi être remplies depuis des fichiers textes contenant une liste d'adresses IP et de réseaux :

  table <spammers> persist file "/etc/spammers"
  block in on fxp0 from <spammers> to any

Le fichier /etc/spammers devrait contenir une liste d'adresses IP et/ou des blocs de réseaux CIDR, un par ligne.

Manipulations avec pfctl

Les tables peuvent être manipulées à la volée en utilisant pfctl(8). Pour l'exemple, pour ajouter des entrées à la table <spammers> créée, ci-dessus :

  # pfctl -t spammers -T add 203.0.113.0/24

Ceci aussi créera la table <spammers> si elle n'existe toujours pas. Pour lister les adresses d'une table :

  # pfctl -t spammers -T show

L'argument -v peut aussi être utilisé avec l'option -T show pour afficher les statistiques de chaque entrée de la table. Pour supprimer des adresses d'une table :

  # pfctl -t spammers -T delete 203.0.113.0/24

Pour avoir plus d'informations sur comment manipuler les tables avec pfctl, veuillez lire la page de manuel pfctl(8).

Spécifier des adresses

En plus d'être spécifié par l'adresse IP, les hôtes peuvent aussi être spécifiés par leur nom d'hôte. Quand le nom d'hôte est résolu par une adresse IP, toutes les adresses IPv4 et IPv6 sont placées dans la table. Les adresses IP peuvent être aussi entrées dans une table en spécifiant un nom valide d'interface, un groupe d'interfaces, ou le mot clé self. La table contiendra alors toutes les adresses IP assignées à telle interface ou tel groupe, ou machine (incluant l'adresse de bouclage), respectivement.

Une limitation lors de la spécification des adresses est que 0.0.0.0/0 et 0/0 fonctionnent pas dans les tables. L'alternative est de coder en dur l'adresse ou d'utiliser une macro.

Correspondance d'adresses

Une recherche d'adresse contenue dans une table retournera l'entrée qui correspondra le plus. Cela permet la création de tables, telles que :

  table <goodguys> { 172.16.0.0/16, !172.16.1.0/24, 172.16.1.100 }
  
  block in on dc0
  pass  in on dc0 from <goodguys>

Tout paquet arrivant au-travers de dc0 qui a son adresse source correspondante à la table <goodguys> :

  • 172.16.50.5 : la correspondance la plus proche est 172.16.0.0/16 ; le paquet correspond à la table et passera.
  • 172.16.1.25 : la correspondance la plus proche est !172.16.1.0/24 ; le paquet correspond à une entrée de la table mais cette entrée est négative (elle utilise le modificateur “!”) ; le paquet ne correspond pas à la table et ne passera pas.
  • 172.16.1.100 : une exacte correspondance à 172.16.1.100 ; le paquet correspond à la table et passera.
  • 10.1.4.55 : ne correspond pas à la table et sera bloqué.

Cette page est la traduction officieuse de la page “Tables” 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.