在 pfctl(8) 加载规则时,遇到列表后会为每个条目创建一个规则。例如:
block out on fxp0 from { 192.168.0.1, 10.5.32.6 } to any
会扩展为:
block out on fxp0 from 192.168.0.1 to any
block out on fxp0 from 10.5.32.6 to any
可以在规则中使用多个列表:
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 }
注意在列表条目之间的逗号是可选的。
列表可以嵌套:
trusted = "{ 192.168.1.2 192.168.5.36 }"
pass in inet proto tcp from { 10.10.0.0/24 $trusted } to port 22
构造如下的“否定列表”时要小心,它是一个常见错误:
pass in on fxp0 from { 10.0.0.0/8, !10.1.2.3 }
通常的意图是匹配“网段 10.0.0.0/8 中除了 10.1.2.3 的全部地址",但是这个规则会扩展为:
pass in on fxp0 from 10.0.0.0/8
pass in on fxp0 from !10.1.2.3
它匹配了任意可能的地址。此处应该使用表。
宏的名称以字母开始,可以包含字母,数字和下划线。 宏的名称不能是保留字,例如 pass,out 或 queue。
ext_if = "fxp0"
block in on $ext_if from any to any
它创建了名称为 ext_if 的宏。 在创建宏之后,引用的时候它的名称前要增加字符 $。
宏也可以用来展开列表,例如:
friends = "{ 192.168.1.1, 10.0.2.5, 192.168.43.53 }"
宏可以递归定义。由于在引号中的宏不能展开,必须使用下述语法:
host1 = "192.168.1.1"
host2 = "192.168.1.2"
all_hosts = "{" $host1 $host2 "}"
现在宏 $all_hosts 展开为 192.168.1.1,192.168.1.2。