[Anterior: Scrubbing: Normalización de Paquetes)] [Contenido] [Siguiente: Formación de Colas y Prioridades de Paquetes]
Además del conjunto de reglas principal, PF también puede evaluar subconjuntos de reglas. Los subconjuntos de reglas se pueden manipular sobre la marcha 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, nat, rdr, y binat.
Estos subconjuntos de reglas van ligados al conjunto de reglas principal mediante el uso de reglas de anclaje; las reglas de anclaje se crean con la clave anchor:
Un subconjunto de reglas con nombre es una agrupación de reglas de filtrado y/o traducción a la que se ha asignado un nombre. Un punto de anclaje anchor puede contener más de uno de estos subconjuntos de reglas. Cuando PF se encuentra con una regla anchor en el conjunto principal de reglas, evalúa todos los subconjuntos de reglas adjuntas a ese punto de anclaje, en orden alfabético de acuerdo con sus nombres. 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 o con una regla de traducción dentro del mismo anclaje, 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 all
pass out on $ext_if all keep state
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 dos métodos para llenar con reglas los anclajes:
La regla load hace que pfctl llene el anclaje y el conjunto de reglas con nombre especificados leyendo las reglas desde un fichero de texto. Ejemplo:
load anchor goodguys:ssh from "/etc/anchor-goodguys-ssh"
Cuando el conjunto de reglas principal esté cargado, las reglas que aparecen en el fichero /etc/anchor-goodguys-ssh se cargarán en el conjunto de reglas con nombre ssh vinculado al anclaje goodguys.
Para añadir reglas a un anclaje usando pfctl, hay que usar una orden parecida a la siguiente:
# echo "pass in proto tcp from 192.0.2.3 to any port 22" \
| pfctl -a goodguys:ssh -f -
Con esta orden se añade una regla pass al conjunto de reglas llamado ssh, adjunto al anclaje goodguys. PF evalúa esta regla, y cualquier otra regla de filtrado que se añada, cuando llega a la línea anchor goodguys en el conjunto de reglas principal.
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:www -f /etc/anchor-goodguys-www
De este modo se cargan las reglas desde el fichero /etc/anchor-goodguys-www al subconjunto de reglas con nombre www en el anclaje goodguys.
Las reglas de filtrado y de traducción se pueden cargar en un subconjunto de reglas con nombre, 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 también se debe definir dentro del subconjunto de reglas con nombre cualquier macro que esté siendo utilizada; Las macros que se encuentran definidas en el conjunto de reglas principal no son visibles desde los subconjuntos de reglas con nombre.
Cada subconjunto de reglas con nombre, 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 subconjunto de reglas con nombre no se destruye hasta que se han limpiado todas las reglas usando pfctl(8). Cuando un punto de anclaje ya no tiene ningún conjunto de reglas adjunto, también se destruye.
De modo opcional, las reglas anchor pueden especificar una interfaz, un protocolo, una direcciуn de origen y destino, una marca, etc.. usando 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 all
pass out on $ext_if all keep state
anchor ssh in on $ext_if proto tcp from any to any port 22
Las reglas en el anclaje ssh sólo 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:allowed -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 manipulación de los subconjuntos de reglas con nombre se realiza mediante pfctl. Se puede usar pfctl para añadir y eliminar reglas de un conjunto de reglas sin recargar el conjunto de reglas principal.
Para ver una lista de todas las reglas en el conjunto de reglas allowed adjunto al anclaje ssh:
# pfctl -a ssh:allowed -s rules
Para limpiar todas las reglas de filtrado de este mismo conjunto de reglas:
# pfctl -a ssh:allowed -F rules
Si se omite el nombre del conjunto de reglas, la acción se aplicará a todas las reglas en el anclaje.
Para una lista completa de órdenes, véase pfctl(8).
[Anterior: Scrubbing: Normalización de Paquetes)] [Contenido] [Siguiente: Formación de Colas y Prioridades de Paquetes]