[OpenBSD]

[Anterior: Redireccionamiento de Tráfico (Reenvío de Puertos)] [Contenido] [Siguiente: Opciones en Tiempo de Ejecución]

PF: Atajos para la Creación de Conjuntos de Reglas


Índice de Contenidos


Introducción

Con PF existen muchas formas para simplificar un conjunto de reglas. Algunas formas de simplificar las reglas son el uso de macros y listas. Además, el lenguaje del conjunto de reglas, o gramática, también ofrece algunos atajos para simplificar los conjunto de reglas. Como regla general, el conjunto de reglas más simple es aquél que es más fácil de entender y de mantener.

Uso de Macros

Las macros son útiles por que ofrecen un modo alternativo de fijar direcciones, números de puertos, nombres de interfaces, etc... dentro de un mismo conjunto de reglas. ¿Ha cambiado la dirección IP del servidor? No hay problema, basta con actualizar la macro; no es necesario cambiar las reglas de filtrado que nos han costado tanto perfeccionar.

Una convención común en los conjuntos de reglas de PF es la de definir una macro por cada interfaz de red. Si una tarjeta de red tuviera que ser reemplazada con otra que usara un controlador diferente, por ejemplo si cambiáramos una de 3Com por una de Intel, se podría actualizar la macro y las reglas de filtrado seguirían funcionando como antes. Otra ventaja de las macros es cuando hay que instalar un mismo conjunto de reglas en varias máquinas. Unas máquinas pueden tener unas tarjetas de red diferentes a las de otras máquinas, y el uso de macros para definir las interfaces de red permitiría instalar los conjuntos de reglas realizando unos cambios mínimos de edición. El uso de macros para definir información en un conjunto de reglas que está sujeto a cambios, como pueden ser los números de puertos, direcciones IP, y nombres de interfaces, es una práctica recomendada.

# definir macros para cada interfaz de red
IntIF = "dc0"
ExtIF = "fxp0"
DmzIF = "fxp1"

Otra convención común es la de usar macros para definir direcciones IP y bloques de red. Con esta práctica se puede reducir bastante el mantenimiento de un conjunto de reglas cuando cambien las direcciones IP.

# definir nuestras redes
IntNet = "192.168.0.0/24"
ExtAdd = "24.65.13.4"
DmzNet = "10.0.0.0/24"

Si alguna vez hubiera que expandir la red interna o se renumerara en un bloque IP diferente, bastaría con actualizar la macro:

IntNet = "{ 192.168.0.0/24, 192.168.1.0/24 }"

Una vez que se volviera a cargar el conjunto de reglas, todo volvería a funcionar como antes.

Uso de Listas

Veamos unas cuantas reglas convenientes para nuestro conjunto de reglas que sirven para el manejo de direcciones RFC 1918; estas direcciones no deberían estar por Internet, y cuando lo están suele ser para crear problemas:

block in  quick on tl0 inet from 127.0.0.0/8 to any
block in  quick on tl0 inet from 192.168.0.0/16 to any
block in  quick on tl0 inet from 172.16.0.0/12 to any
block in  quick on tl0 inet from 10.0.0.0/8 to any
block out quick on tl0 inet from any to 127.0.0.0/8
block out quick on tl0 inet from any to 192.168.0.0/16
block out quick on tl0 inet from any to 172.16.0.0/12
block out quick on tl0 inet from any to 10.0.0.0/8

Ahora veamos una simplificación de lo anterior:

block in  quick on tl0 inet from { 127.0.0.0/8, 192.168.0.0/16, \
   172.16.0.0/12, 10.0.0.0/8 } to any
block out quick on tl0 inet from any to { 127.0.0.0/8, \
   192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }

El conjunto de reglas se ha reducido de ocho a dos líneas. Y todavía puede mejorar si usamos macros en conjunción con una lista:

NoRouteIPs = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
   10.0.0.0/8 }"
ExtIF = "tl0"
block in  quick on $ExtIF from $NoRouteIPs to any
block out quick on $ExtIF from any to $NoRouteIPs

Nótese que las macros y las listas simplifican el fichero pf.conf, aunque en realidad pfctl(8) expande las líneas en reglas múltiples. Por lo tanto, el ejemplo anterior se expandiría a las siguientes líneas:

block in  quick on tl0 inet from 127.0.0.0/8 to any
block in  quick on tl0 inet from 192.168.0.0/16 to any
block in  quick on tl0 inet from 172.16.0.0/12 to any
block in  quick on tl0 inet from 10.0.0.0/8 to any
block out quick on tl0 inet from any to 10.0.0.0/8
block out quick on tl0 inet from any to 172.16.0.0/12
block out quick on tl0 inet from any to 192.168.0.0/16
block out quick on tl0 inet from any to 127.0.0.0/8

Como se puede ver, la expansión de PF no es más que una conveniencia para quien escribe y mantiene el fichero pf.conf, y no una simplificación real de las reglas procesadas por pf(4).

Las macros se pueden usar para definir algo más que direcciones y puertos; se pueden usar en cualquier parte de un fichero de reglas de PF:

pre = "pass in quick on ep0 inet proto tcp from "
post = "to any port { 80, 6667 } keep state"

# la clase de David
$pre 21.14.24.80 $post

# la casa de Nick
$pre 24.2.74.79 $post
$pre 24.2.74.178 $post

Se expandirían a:

pass in quick on ep0 inet proto tcp from 21.14.24.80 to any \
   port = 80 keep state
pass in quick on ep0 inet proto tcp from 21.14.24.80 to any \
   port = 6667 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.79 to any \
   port = 80 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.79 to any \
   port = 6667 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.178 to any \
   port = 80 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.178 to any \
   port = 6667 keep state

Gramática de PF

La sintaxis usada por Packet Filter es bastante flexible, lo que a su vez permite una gran flexibilidad en los juegos de reglas. PF es capaz de deducir ciertas claves, lo que significa que no es necesario mantener el estado de forma explícita en una regla, y el orden que siguen las claves es lo suficientemente sencillo como para que no sea necesario memorizar la sintaxis completamente.

Eliminación de Claves

Para definir una política de denegación predeterminada, se usan dos reglas:

block in  all
block out all

Que se pueden reducir a:

block all

Cuando no se especifica la dirección, PF asume que la regla es aplicable a los paquetes que van en ambas direcciones.

De forma parecida, las cláusulas from any to any y all se pueden dejar fuera de una regla; por ejemplo:

block in on rl0 all
pass  in quick log on rl0 proto tcp from any to any port 22 keep state

que se puede simplificar en:

block in on rl0
pass  in quick log on rl0 proto tcp to port 22 keep state

La primera regla bloquea el paso a todos los paquetes entrantes desde cualquier origen hacia cualquier destino en rl0, y la segunda regla permite el paso al tráfico TCP entrante en rl0 hacia el puerto 22.

Simplificación de Return

Un conjunto de reglas que se usara para bloquear paquetes y responder con un TCP RST o con un ICMP Unreachable sería así:

block in all
block return-rst in proto tcp all
block return-icmp in proto udp all
block out all
block return-rst out proto tcp all
block return-icmp out proto udp all

Esto se puede simplificar a:

block return

Cuando PF ve la clave return, es lo suficientemente listo como para enviar la respuesta correcta o ninguna respuesta, dependiendo del protocolo del paquete que se esté bloqueando.

Orden de las Claves

El orden en el que se especifican las claves es flexible en la mayoría de los casos. Por ejemplo, una regla escrita como:

pass in log quick on rl0 proto tcp to port 22 \
   flags S/SA keep state queue ssh label ssh

También se puede escribir como:

pass in quick log on rl0 proto tcp to port 22 \
   queue ssh keep state label ssh flags S/SA

Otras variaciones similares también funcionarán.

[Anterior: Redireccionamiento de Tráfico (Reenvío de Puertos)] [Contenido] [Siguiente: Opciones en Tiempo de Ejecución]


[Índice] www@openbsd.org
Originally [OpenBSD: shortcuts.html,v 1.10 ]
$OpenBSD: shortcuts.html,v 1.9 2004/01/04 22:29:12 horacio Exp $
$Translation: shortcuts.html,v 1.10 2004/01/04 21:32:07 horacio Exp $