[Anterior: Primeros pasos] [Contenido] [Siguiente: Tablas]
Una lista permite especificar múltiples criterios similares dentro de una misma regla, como puedan ser múltiples protocolos, números de puertos, direcciones, etc. De este modo, en lugar de escribir una regla de filtrado para cada dirección IP que haya que bloquear, se puede escribir una sola regla e indicar las direcciones IP en una lista aparte. Las listas se definen especificando los componentes dentro de { } llaves.
Así, cuando pfctl(8) está cargando el grupo de reglas y se encuentra con una lista, crea automáticamente múltiples reglas, una para cada uno de los elementos de la lista. Por ejemplo:
block out on fxp0 from { 192.168.0.1, 10.5.32.6 } to any
se expande a:
block out on fxp0 from 192.168.0.1 to any
block out on fxp0 from 10.5.32.6 to any
Además, se pueden incluir varias listas dentro de una misma regla:
match in on fxp0 proto tcp to port { 22 80 } rdr-to 192.168.0.6
block out on fxp0 proto { tcp udp } from { 192.168.0.1, \
10.5.32.6 } to any port { ssh telnet }
Nótese que las comas entre los componentes de las listas son opcionales.
Las listas pueden contener también listas anidadas:
trusted = "{ 192.168.1.2 192.168.5.36 }"
pass in inet proto tcp from { 10.10.0.0/24 $trusted } to port 22
Ponga atención con las construcciones siguientes, conocidas como "listas negadas", pues constituyen un error común:
pass in on fxp0 from { 10.0.0.0/8, !10.1.2.3 }
Si bien el significado implícito es generalmente aplicar la regla citada en "cualquier dirección 10.0.0.0/8 excepto 10.1.2.3", en realidad esta regla se expande de la siguiente manera:
pass in on fxp0 from 10.0.0.0/8
pass in on fxp0 from !10.1.2.3
que corresponde a cualquier dirección posible En su lugar, debe usarse una tabla.
Las macros son variables definidas por el usuario que pueden contener direcciones IP, números de puertos, nombres de interfaces, etc. Las macros reducen la complejidad de un grupo de reglas de PF, y también facilitan mucho el mantenimiento de un grupo reglas.
Los nombres de las macros deben empezar con una letra y pueden contener letras, dígitos y guiones bajos. Los nombres de las macros no pueden ser palabras reservadas (como pass, out, o queue).
ext_if = "fxp0"
block in on $ext_if from any to any
Con la primera línea se ha creado una macro llamada ext_if. Cuando se hace referencia a una macro después de que esta haya sido creada, su nombre debe ir precedido por el carácter $.
Las macros también se pueden expandir mediante el uso de listas, como por ejemplo:
friends = "{ 192.168.1.1, 10.0.2.5, 192.168.43.53 }"
Las macros se pueden definir de forma recursiva, como componentes de una lista. Pero hay que tener en cuenta que las macros, si van entrecomilladas, no se expanden, por lo que hay que usar la siguiente sintaxis:
host1 = "192.168.1.1"
host2 = "192.168.1.2"
all_hosts = "{" $host1 $host2 "}"
Ahora, la macro $all_hosts se expandirá a 192.168.1.1, 192.168.1.2.
[Anterior: Primeros pasos] [Contenido] [Siguiente: Tablas]