分页: 1 / 1

《The BOOK Of PF》中文版 —— 14. 利用表格简化规则

发表于 : 2010-07-13 9:29
whoami
利用表格简化规则
现在您可能觉得创建规则集的系统有些过分的死板和僵化。总之,在一个给定的时间内有一些相关过滤和重定向的类似数据并没有必要在配置文件里重新为它们写类似的规则! 非常正确, 而PF也提供了处理这类情况的方法。
表格(Tables)就具有这样的特性, 它被用来表示一些IP地址的列表,使用表格避免了重新导入整个的规则集,而且它便于快速检查。
Table名称总是用“<”和“>”括起来 (< Table name >), 像这样:

代码: 全选

table <clients> persist { 192.168.2.0/24, !192.168.2.5 }
这里的192.168.2.0/24网络是这个表格的一部分,而一个例外就是地址192.168.2.5不包含在这个表格里,这里的操作符 ! 表示逻辑NOT。
这里的关键字 persist 用来确认该表格的存在,即便当前没有任何规则引用它。值得一提的是你也可以从文件里导入表格,在这些文件中每项单独占用一行, 就像这个文件 /etc/clients

代码: 全选

192.168.2.0/24
!192.168.2.5
按次序在文件 /etc/pf.conf 里初始化该表格:

代码: 全选

table <clients> persist file "/etc/clients"
那么, 举个例子, 你可以将我们前面的规则修改一下以便从你的客户端计算机上阅读管理出站通讯。

代码: 全选

pass inet proto tcp from <clients> to any port $client_out
你可以通过它灵活地操控表格的内容, 例如

代码: 全选

$ sudo pfctl -t clients -T add 192.168.1/16
说明: 这些变化仅发生在内存中的表格拷贝里, 意思就是除非将这些变化保存在系统内,否则如果发生突然断电或系统重启,这些变化将不复存在。

你可以通过一个cron任务opt维护这个表格的在磁盘上的拷贝,也就是在一个固定的时间后将这个表格的内容写入(dump)磁盘, 可以通过命令

代码: 全选

$ sudo pfctl -t clients -T show >/etc/clients
你还可以编辑文件 /etc/clients ,然后用这个文件的数据替换内存中表格的内容:

代码: 全选

$sudo pfctl -t clients -T replace -f /etc/clients
从运行的角度上,你可能会频繁地进行操作各种表格, 迟早你要自己写shell脚本以便完成诸如在一个表格里插入、删除或替换其内容。

一个很常见的例子就是你可以通过cron任务在指定的时间内替换表格的内容以便实现根据IP地址对网络访问进行强制性限制。在某些网络内你甚至可能为每周的每一天设置不同访问规则。所有的限制全基于你的要求以及规则编写。

我们将马上回来介绍一些方便的表格应用, 包括表格与其它一些程序相互呼应的好用法。详说明5
说明5 一个可以与PF的table配合很好的程序就是 DHCP 的进程 dhcpd. 在OpenBSD里, 请参阅dhcpd的用户手册,并着重看一下 -A 和 -L 选项。