[OpenBSD]

[Anterior: Opciones en tiempo de ejecución] [Contenido] [Siguiente: Formación de colas y prioridades de paquetes]

PF: Anclajes


Índice de contenidos


Introducción

Además del conjunto de reglas principal, PF también puede evaluar subconjuntos de reglas. Los subconjuntos de reglas se pueden manipular al vuelo usando pfctl(8), para lo que disponen de un modo conveniente para alterar dinámicamente un conjunto de reglas activo. Mientras que una tabla se usa para contener una lista dinámica de direcciones, un subconjunto de reglas se usa para contener un conjunto dinámico de reglas de filtrado. Estos subconjuntos de reglas van ligados al conjunto de reglas principal mediante el uso de anclajes (anchor).

Los anclajes pueden anidarse, lo que permite que al subconjunto de reglas ir encadenado juntamente. Las reglas de anclaje serán evaluadas en relación con el anclaje que las carga. Por ejemplo, las reglas de anclaje en el conjunto de reglas principal crearán puntos vinculados con el conjunto de reglas principal como padre, y las reglas de anclaje cargadas de ficheros invocados por medio de la directiva load anchor crearán puntos de anclaje definiendo ese anclaje como padre.

Anclajes

Un anclaje es una agrupación de reglas de filtrado, tablas y otros anclajes a la que se ha asignado un nombre. Cuando PF se encuentra con una regla anchor en el conjunto principal de reglas, evalúa las reglas contenidas en ese punto de anclaje tal y como evalúa las reglas en el conjunto de reglas principal. Entonces continúa el procesamiento en el conjunto de reglas principal, a menos que el paquete concuerde con una regla de filtrado que use la opción quick, en cuyo caso la búsqueda de concordancia se considerará finalizada y terminará la evaluación de las reglas, tanto en el anclaje como en el conjunto de reglas principal.

Por ejemplo:

ext_if = "fxp0"

block on $ext_if
pass  out on $ext_if
anchor goodguys

En este conjunto de reglas se ha definido una política de denegación predeterminada en fxp0, tanto para el tráfico entrante como para el saliente. A continuación se permite pasar el tráfico, manteniendo el estado, y se crea una regla de anclaje con el nombre de goodguys. Hay tres métodos para llenar con reglas los anclajes:

La regla load hace que pfctl llene el anclaje especificado leyendo las reglas desde un fichero de texto. Ejemplo:

anchor goodguys
load anchor goodguys from "/etc/anchor-goodguys-ssh"

Para añadir reglas a un anclaje con pfctl, se puede emplear una orden parecida a la siguiente:

# echo "pass in proto tcp from 192.0.2.3 to any port 22" \
   | pfctl -a goodguys -f -

También es posible guardar y cargar las reglas desde un fichero de texto:

# cat >> /etc/anchor-goodguys-www
pass in proto tcp from 192.0.2.3 to any port 80
pass in proto tcp from 192.0.2.4 to any port { 80 443 }

# pfctl -a goodguys -f /etc/anchor-goodguys-www

Para cargar las reglas directamente desde un conjunto de reglas principal, sitúe las reglas de anclaje en un bloque delimitado por llaves:

anchor "goodguys" {
   pass in proto tcp from 192.168.2.3 to port 22
}
Los anclajes delimitados de esta manera pueden contener otros anclajes:
allow = "{ 192.0.2.3 192.0.2.4 }"

anchor "goodguys" {
   anchor {
      pass in proto tcp from 192.0.2.3 to port 80
   }
   pass in proto tcp from $allow to port 22
}
Con anclajes especificados directamente, el nombre del anclaje se convierte en opcional. Nótese que el anclaje anidado del ejemplo anterior no tiene nombre. Tenga en cuenta también que la macro $allow se crea fuera del anclaje (en el conjunto de reglas principal) y entonces se utiliza dentro del anclaje.

Las reglas se pueden cargar en un anclaje, usando la misma sintaxis y opciones que para las reglas cargadas en el conjunto de reglas principal. Sin embargo, hay que tener en cuenta que, excepto que esté usando anclajes directamente, cualquier macro que esté siendo utilizada debe ser definida en el anclaje mismo; las macros que se encuentran definidas en el conjunto de reglas principal no son visibles desde el anclaje.

Dado que los anclajes pueden anidarse, es posible especificar que todos los anclajes-hijo dentro de un anclaje específico sea evaluado:

anchor "spam/*"

Esta sintaxis hace que se evalúe cada regla vinculada al anclaje spam. Los anclajes-hijo serán evaluados en orden alfabético, pero no se recorren de forma recursiva. Los anclajes se evalúan siempre relativos al anclaje en el que están definidos.

Cada anclaje, así como el conjunto de reglas principal, existe de forma independiente de los otros conjuntos de reglas. Las operaciones que se realicen en un conjunto de reglas, como la limpieza de las reglas, no afecta a ninguno de los otros conjuntos. Además, si se elimina un punto de anclaje del conjunto de reglas principal, no se destruye el anclaje ni cualquier subconjunto de reglas con nombre que esté adjunto a ese anclaje. Un anclaje no se destruye hasta que se han limpiado todas las reglas usando pfctl(8) y no existan anclajes-hijo dentro del anclaje.

Opciones de anclaje

De modo opcional, las reglas anchor pueden especificar una interfaz, un protocolo, una dirección de origen y destino, una marca, etc.. mediante la misma sintaxis que las reglas de filtrado. Cuando se da este tipo de información, las reglas anchor sólo se procesan si el paquete concuerda con la definición de la regla anchor. Por ejemplo:

ext_if = "fxp0"

block on $ext_if
pass  out on $ext_if
anchor ssh in on $ext_if proto tcp to port 22

Las reglas en el anclaje ssh solo se evalúan para los paquetes TCP destinados al puerto 22 que entran en la interfaz fxp0. Entonces se añaden las reglas al anchor, del siguiente modo:

# echo "pass in from 192.0.2.10 to any" | pfctl -a ssh -f -

Por lo tanto, aunque la regla de filtrado no especifique una interfaz, un protocolo, o un puerto, al anfitrión 192.0.2.10 sólo se le permitirá conectar usando SSH, de acuerdo con la definición de la regla anchor.

La misma sintaxis puede aplicarse a los anclajes especificados directamente:

allow = "{ 192.0.2.3 192.0.2.4 }"

anchor "goodguys" in proto tcp {
   anchor proto tcp to port 80 {
      pass from 192.0.2.3
   }
   anchor proto tcp to port 22 {
      pass from $allow
   }
}

Manipulación de anclajes

La manipulación de anclajes se realiza mediante pfctl. Se puede usar para añadir y eliminar reglas de un anclaje sin recargar el conjunto de reglas principal.

Para ver una lista de todas las reglas en un anclaje llamado ssh:

# pfctl -a ssh -s rules

Para limpiar todas las reglas de filtrado de este mismo anclaje:

# pfctl -a ssh -F rules

Para una lista completa de órdenes, véase pfctl(8).

[Anterior: Opciones en tiempo de ejecución] [Contenido] [Siguiente: Formación de colas y prioridades de paquetes]


[back] www@openbsd.org
$OpenBSD: anchors.html,v 1.11 2011/03/04 16:16:15 ajacoutot Exp $