[Anterior: Reservas de direcciones y balanceo de carga] [Contenido] [Siguiente: Registros de bitácora]
El marcado de paquetes es una forma de etiquetar 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 «relaciones 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 etiqueta a un paquete, hay que usar la clave tag:
pass in on $int_if all tag INTERNAL_NET keep state
De este modo, la etiqueta INTERNAL_NET será añadida a cualquier paquete que concuerde con la regla anterior.
Una etiqueta también puede ser asignada usando una macro. Por ejemplo:
name = "INTERNAL_NET"
pass in on $int_if all tag $name
Hay un conjunto de macros predefinidas que también pueden usarse.
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
(2) pass in quick on $int_if proto tcp to port 80 tag INT_NET_HTTP
(3) pass in quick on $int_if from 192.168.1.5
Para comprobar las etiquetas que se hayan aplicado hay que usar la clave tagged:
pass out on $ext_if tagged INT_NET
Los paquetes salientes por $ext_if deben ir marcados con la etiqueta 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
El filtrado por política es un enfoque 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 etiqueta que se usará para esa política.
Ahora hay que escribir las reglas para clasificar los paquetes dentro de la política.
block all
pass out on $ext_if tag LAN_INET_NAT tagged LAN_INET nat-to ($ext_if)
pass in on $int_if from $int_net tag LAN_INET
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ
pass in on $ext_if proto tcp from <spamd> to port smtp \
tag SPAMD rdr-to 127.0.0.1 port 8025
A continuación hay que configurar las reglas que definen esa política.
pass in quick on $ext_if tagged SPAMD
pass out quick on $ext_if tagged LAN_INET_NAT
pass out quick on $dmz_if tagged LAN_DMZ
pass out quick on $dmz_if tagged INET_DMZ
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
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 block all pass out on $ext_if tag LAN_INET_NAT tagged LAN_INET nat-to ($ext_if) |
El marcado también se puede aplicar en el nivel de Ethernet si la máquina que está realizando el marcado/filtrado también hace la vez de puente de red (bridge(4)). 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 ifconfig(8). Ejemplo:
# ifconfig 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 de direcciones y balanceo de carga] [Contenido] [Siguiente: Registros de bitácora]