《3. OpenBSD PF用户指南之基本配置——表格》

OpenBSD FAQ中文版、PF指南中文版、OpenBSD用户手册...
主题已锁定
头像
leo
帖子: 2465
注册时间: 2010-01-21 3:27

《3. OpenBSD PF用户指南之基本配置——表格》

帖子 leo » 2010-01-21 10:32

PF: 表格

--------------------------------------------------------------------------------

目录
介绍
配置
用pfctl调控
指定地址
地址匹配

--------------------------------------------------------------------------------

介绍
一个表格被用来指定一组 IPv4 和/或 IPv6 地址。查询一个表格比查询几个列表快很多并且消耗更少的内存及处理器时间。基于这个原因, 表格是保存大量地址的理想方案, 当你查询一个包含50, 000个地址的表格时仅比查询包含50个地址的表格稍微多用一点时间。表格可以用于下列途径:

过滤, 净化, NAT, 和 重定向 规则中的源和/或目的地址。
NAT 规则中的转换地址。
重定向 规则中的重定向地址。
过滤规则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


地址可以使用否定(或 "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调控
表格可以在运行中使用 pfctl(8) 进行操控。例如, 为上面创建的 <spammers> 表格增加一些项目:

代码: 全选

# pfctl -t spammers -T add 218.70.0.0/16

如果这个 <spammers> 表格不存在, 上面的命令也会创建它。要列出一个表格内的地址:

代码: 全选

# pfctl -t spammers -T show


-v 变量可以与 -Tshow 一同使用, 它用来显示每个表格项目的统计。从表格中删除一个地址:

代码: 全选

# 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 进入:

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 - 与表格不匹配, 被阻止。

主题已锁定

在线用户

正浏览此版面之用户: 没有注册用户 和 1 访客