[Anterior: Reservas (pools) de Direcciones y Balanceo de Carga] [Contenido] [Siguiente: Logging: Registros de Bitácora]
El marcado de paquetes es una forma de marcar paquetes con un identificador interno que más tarde se puede usar para el criterio de las reglas de filtrado y traducción. Mediante el marcado se pueden realizar tareas como la creación de «anillos de confianza» entre interfaces y determinar si los paquetes han sido procesados por las reglas de traducción. También es posible alejarse del filtrado basado en reglas e iniciar un filtrado basado en políticas.
Para añadir una marca a un paquete, hay que usar la clave tag:
pass in on $int_if all tag INTERNAL_NET keep state
De este modo, la marca INTERNAL_NET será añadida a cualquier paquete que concuerde con la regla. Nótese que se ha usado keep state; para marcar los paquetes es necesario usar keep state (o modulate state, o synproxy state) en las reglas pass.
Una marca también puede ser asignada usando una macro. Por ejemplo:
name = "INTERNAL_NET"
pass in on $int_if all tag $name keep state
Hay un conjunto de macros predefinidas que también pueden ser usadas.
Estas macros son expandidas al momento de cargar las reglas y NO en tiempo de ejecución.
El proceso de marcado sigue estas reglas:
Tomemos el siguiente conjunto de reglas como ejemplo:
(1) pass in on $int_if tag INT_NET keep state
(2) pass in quick on $int_if proto tcp to port 80 tag \
INT_NET_HTTP keep state
(3) pass in quick on $int_if from 192.168.1.5 keep state
Además de aplicar marcas con reglas de filtrado, con las reglas de traducción de nat, rdr y binat también se puede aplicar marcas a los paquetes si se usa la clave tag.
Para comprobar las marcas que se hayan aplicado hay que usar la clave tagged:
pass out on $ext_if tagged INT_NET keep state
Outgoing packets on $ext_if must be tagged with the INT_NET tag in order to match the above rule. Inverse matching can also be done by using the ! operator: Los paquetes salientes por $ext_if deben ir marcados con la marca INT_NET para que coincidan con la regla anterior. También se pueden realizar comprobaciones a la inversa usando el operador `!':
pass out on $ext_if tagged ! WIFI_NET keep state
La política de filtrado es un acercamiento diferente al de los conjuntos de reglas de filtrado. Para empezar se define una política que configura las reglas según las cuales se dejará pasar a unos tipos de tráfico y se bloqueará a otros. Entonces se clasifican los paquetes dentro de esta política en base al criterio tradicional de dirección/puerto IP de origen/destino, protocolo, etc. Por ejemplo, examinemos la siguiente política de cortafuegos:
Nótese que la política cubre todo el tráfico que pasará a través del cortafuegos. La palabra que va entre paréntesis indica la marca que se usará para esa política.
Ahora hay que escribir las reglas de filtrado y traducción para clasificar los paquetes dentro de la política.
rdr on $ext_if proto tcp from <spamd> to port smtp \
tag SPAMD -> 127.0.0.1 port 8025
block all
pass in on $int_if from $int_net tag LAN_INET keep state
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state
A continuación hay que configurar las reglas que definen esa política.
pass in quick on $ext_if tagged SPAMD keep state
pass out quick on $ext_if tagged LAN_INET keep state
pass out quick on $dmz_if tagged LAN_DMZ keep state
pass out quick on $dmz_if tagged INET_DMZ keep state
Ahora que ya se ha configurado el conjunto de reglas, para efectuar cualquier cambio basta con modificar las reglas de clasificación. Por ejemplo, si se añade un servidor de POP3/SMTP a la DMZ, habrá que añadir reglas de clasificación para el tráfico tipo POP3 y SMTP, como lo siguiente:
mail_server = "192.168.0.10"
...
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
tag INET_DMZ keep state
Con esto se permitirá el paso al tráfico de correo electrónico como parte de la entrada de política INET_DMZ.
Finalmente, el conjunto completo de reglas:
# macros
int_if = "dc0"
dmz_if = "dc1"
ext_if = "ep0"
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"
# clasificación -- clasificar los paquetes basándose en la política
# definida del cortafuegos
rdr on $ext_if proto tcp from <spamd> to port smtp \
tag SPAMD -> 127.0.0.1 port 8025
block all
pass in on $int_if from $int_net tag LAN_INET keep state
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
tag INET_DMZ keep state
# imposición de la política -- pasar/bloquear basándose en la política
# definida del cortafuegos
pass in quick on $ext_if tagged SPAMD keep state
pass out quick on $ext_if tagged LAN_INET keep state
pass out quick on $dmz_if tagged LAN_DMZ keep state
pass out quick on $dmz_if tagged INET_DMZ keep state
|
Si la máquina que está realizando el marcado/filtrado también hace la vez de puente de red (bridge(4)), el marcado también se puede aplicar a nivel de la Ethernet. Creando reglas de filtrado para bridge(4) que usen la clave tag, se puede hacer que PF filtre basándose en la dirección MAC de origen/destino. Las reglas para bridge(4) se crean usando la orden brconfig(8). Ejemplo:
# brconfig bridge0 rule pass in on fxp0 src 0:de:ad:be:ef:0 \
tag USER1
Y a continuación, en el fichero pf.conf:
pass in on fxp0 tagged USER1
[Anterior: Reservas (pools) de Direcciones y Balanceo de Carga] [Contenido] [Siguiente: Logging: Registros de Bitácora]