[上一小节: 列表和宏] [总目录] [下一小节: 包过滤]
一个表格被用来保存一组 IPv4 和/或 IPv6 地址。查询一个表格比查询几个列表快很多,并且消耗更少的内存及处理器时间。基于这个原因, 表格是保存大量地址的理想方案, 当你查询一个包含50, 000个地址的表格时仅比查询包含50个地址的表格稍微多用一点时间。表格可以被用于以下方式:
表格可以在 pf.conf 中或通过使用 pfctl(8) 创建。
例子:
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
地址可以使用否定(或 "not") 修饰符来指定, 例如:
table <goodguys> { 192.0.2.0/24, !192.0.2.5 }
goodguys表格将匹配所有 192.0.2.0/24 网络内的地址, 除了192.0.2.5。
注意, 表格名总是在< > 符号内。
表格也可以放置在一个包含了一系列IP地址和网络地址的文本文件中:
table <spammers> persist file "/etc/spammers"
block in on fxp0 from <spammers> to any
这个 /etc/spammers 文件包含了一系列将被阻止的IP地址和/或 CIDR 网络地址, 一个地址用一行。所有以 # 开头的行会被认为是注释并忽略。
# pfctl -t spammers -T add 218.70.0.0/16
如果这个 <spammers> 表格不存在, 上面的命令也会创建它。要列出一个表格内的地址:
-v 变量可以与 -Tshow 一同使用, 它用来显示每个表格项目的统计。从表格中删除一个地址:# pfctl -t spammers -T show
# pfctl -t spammers -T delete 218.70.0.0/16
使用pfctl调控表格的更多信息请参阅 pfctl(8) 用户手册。
除了用IP地址进行指定外, 主机也可以通过它们的主机名来进行指定。当主机名被解析成一个IP地址后, 所有的IPv4 和 IPv6地址全被置入这个表格内。也可以通过一个有效的接口名或self关键字将IP地址加入到一个表格中, 那么这个表格就会 分别包含那个接口或机器(包含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 all pass in on dc0 from <goodguys> to any
只有来自与表格<goodguys>相匹配的那些地址的数据包才可以通过 dc0 进入:
[上一小节: 列表和宏] [总目录] [下一小节: 包过滤]