[OpenBSD]

[上页: 起步] [索引] [下页: 表]

PF: 列表与宏


目录


列表

列表允许在一个规则中指定多个相似的条件。例如多个协议,端口,地址等。 所以,你可以在一条规则中用列表指定 IP,而不是为每个 IP 写一条过滤器规则。 指定条目的列表在花括弧 { } 中定义。

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

它匹配了任意可能的地址。此处应该使用

宏是用户定义的变量,可以保存 IP,端口,接口名称等。 宏能减少 PF 规则的复杂性,也使维护规则更容易。

宏的名称以字母开始,可以包含字母,数字和下划线。 宏的名称不能是保留字,例如 passoutqueue

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。

[上页: 起步] [索引] [下页: 表]


[back] www@openbsd.org
$OpenBSD: macros.html,v 1.8 2010/12/02 14:19:45 ajacoutot Exp $