[上页: 列表与宏]
[索引]
[下页: 包过滤]
PF: 表
目录
介绍
表用来保存 IPv4 和 IPv6 地址组。查询表非常快,而且比列表消耗的内存和处理器时间少。
所以,表用来保存大地址组非常完美,保存 50,000
个地址的表的查询时间比保存 50 个地址的列表稍多。
表可以用于下列场合:
- 规则中的中的源地址或目标地址。
- NAT 和端口重定向地址规则选项,分别是 nat-to 和 rdr-to。
- 用于 route-to, reply-to 和 dup-to 的目标地址 规则选项。
表可以在
pf.conf 中创建或者用
pfctl(8) 。
配置
在 pf.conf中,使用 table 关键字创建表。下述属性可以为每个表指定:
- const - 表的内容在创建后不能修改。当不指定此属性时,
pfctl(8) 可能被用在任意时间对表增加或删除地址,即使系统运行在
securelevel(7) 2 或更高的安全级别。
- persist - 导致即使没有规则引用此表,内核也会把它保留在内存中。
如果没有指定这个属性,当最后引用表的规则被取消后,内核会自动把表从内存中删除。
例子:
table <goodguys> { 192.0.2.0/24 }
table <rfc1918> const { 192.168.0.0/16, 172.16.0.0/12, \
10.0.0.0/8 }
table <spammers> persist
block in on fxp0 from { <rfc1918>, <spammers> } to any
pass in on fxp0 from <goodguys> to any
地址也可以用“非”来指定,例如:
table <goodguys> { 192.0.2.0/24, !192.0.2.5 }
goodguys 表将匹配除 192.0.2.5 以外 192.0.2.0/24 网段的所有地址。
注意表名总是在符号 < > 的里面。
表也可以由包含 IP 地址和网段地址列表的文本文件输入:
table <spammers> persist file "/etc/spammers"
block in on fxp0 from <spammers> to any
文件 /etc/spammers 将包含 IP 地址列表和/或
CIDR
网段地址,每行一个。以 # 开始的行被看做注释,将被忽略。
pfctl 操作
表可以使用
pfctl(8) 进行灵活的操作。例如,向上面创建的表 <spammers> 增加条目:
# pfctl -t spammers -T add 218.70.0.0/16
如果表 <spammers> 不存在,它将被创建。列出表中的地址:
# pfctl -t spammers -T show
参数 -v 可以与 -T show 一起使用,来显示每个地址的统计数据。
从表中删除地址:
# pfctl -t spammers -T delete 218.70.0.0/16
要获得更多使用 pfctl 操作表的信息,请参阅
pfctl(8) 手册页。
指定地址
除了使用 IP 地址来指定主机外,也可以使用主机名。当主机名被解析成 IP 地址时,
所有的 IPv4 和 IPv6 地址都会被插进表中。IP 地址也可以通过合法的接口名称,接口组,或者
self 关键字输入表中。这样的表会分别包含接口,接口组,或者机器上(包括 loopback
地址)上配置的所有 IP 地址。
一个限制就是当指定的地址是 0.0.0.0/0 或 0/0 时不能用于表。
替代方法是明确输入该地址或者使用宏。
匹配地址
表中的地址查询会返回最精确的匹配条目。例如:
table <goodguys> { 172.16.0.0/16, !172.16.1.0/24, 172.16.1.100 }
block in on dc0
pass in on dc0 from <goodguys>
任何进入 dc0 的数据包都会把它的源地址和表 <goodguys> 中的地址进行匹配:
- 172.16.50.5 - 精确匹配是 172.16.0.0/16; 数据包匹配表,可以通过
- 172.16.1.25 - 精确匹配是 !172.16.1.0/24; 数据包匹配表中的否定条目(使用 “!” 修饰); 数据包不匹配表,会被阻塞
- 172.16.1.100 - 准确匹配 172.16.1.100; 数据包匹配表,可以通过
- 10.1.4.55 - 不匹配表,会被阻塞
[上页: 列表与宏]
[索引]
[下页: 包过滤]
www@openbsd.org
$OpenBSD: tables.html,v 1.8 2010/12/02 14:19:45 ajacoutot Exp $