26.4 OpenBSD Packet Filter (PF) 和 ALTQ

  2003 年 7 月, OpenBSD 的防火墙, 也就是常说的 PF 被成功地移植到了 FreeBSD 上, 并可以通过 FreeBSD Ports Collection 来安装了; 第一个将 PF 集成到基本系统中的版本是 2004 年 11 月发行的 FreeBSD 5.3。 PF 是一个完整的提供了大量功能的防火墙软件, 并提供了可选的 ALTQ (交错队列, Alternate Queuing) 功能。 ALTQ 提供了服务品质 (QoS) 带宽整形功能, 这个功能能够以基于过滤规则的方式来保障不同服务的带宽。 OpenBSD Project 在维护 PF 用户指南方面已经做了非常卓越的工作, 因此我们不打算在这本使用手册中进行更进一步的阐述, 以避免不必要的重复劳动。

  更多的详细信息, 可以在 FreeBSD 版本的 PF 网站上找到: http://pf4freebsd.love2party.net/

26.4.1 启用 PF

  PF 作为 FreeBSD 5.3 和更高版本基本系统安装的一部分, 作为一个可以动态加载的模块出现。 如果在 rc.conf 中配置了 pf_enable="YES" 则系统会自动加载对应的内核模块。 可加载内核模块在构建时启用了 pflog(4)

注意: 这个模块假定 options INETdevice bpf 是存在的。 除非编译时指定了 NOINET6 (对 FreeBSD 6.0-RELEASE 之前的版本) 或 NO_INET6 (对更新一些的版本) (例如在 make.conf(5) 中定义) 它还需要 options INET6

  一旦加载了这个内核模块, 或者将 PF 支持静态联编进内核, 就可以随时通过 pfctl 来启用或禁用 pf 了。

  下面的例子展示了如何启用 pf

# pfctl -e

  pfctl 命令提供了一种与 pf 防火墙交互的方法。 要了解进一步的信息, 参考 pfctl(8) 联机手册是一个不错的办法。

26.4.2 内核选项

  将下面这些选项加入到 FreeBSD 内核的编译配置文件中并不是启用 PF 的强制性要求。 这里列出它们主要是为了介绍一些背景信息。 将 PF 编译到内核中之后, 就不再需要使用可加载内核模块了。

  如何在内核编译配置中加入对于 PF 选项的例子可以在内核源代码中的 /usr/src/sys/conf/NOTES 这个文件中找到。 这里列举如下:

device pf
device pflog
device pfsync

  device pf 用于启用 “Packet Filter” 防火墙的支持。

  device pflog 启用可选的 pflog(4) 伪网络设备, 用以通过 bpf(4) 描述符来记录流量。 pflogd(8) 服务可以用来存储信息, 并把它们以日志形式记录到磁盘上。

  device pfsync 启用可选的 pfsync(4) 伪网络设备, 用以监视 “状态变更”。 由于这不是那个可加载内核模块的一部分, 因此如果需要使用它, 就必须自行编译定制的内核了。

  这些设置只有在您使用它们构建和安装新内核之后才会生效。

26.4.3 可用的 rc.conf 选项

  您需要在 /etc/rc.conf 中添加如下配置, 以便在启动时激活 PF:

pf_enable="YES"                 # 启用 PF (如果需要的话, 自动加载内核模块)
pf_rules="/etc/pf.conf"         # pf 使用的规则定义文件
pf_flags=""                     # 启动时传递给 pfctl 的其他选项
pflog_enable="YES"              # 启动 pflogd(8)
pflog_logfile="/var/log/pflog"  # pflogd 用于记录日志的文件名
pflog_flags=""                  # 启动时传递给 pflogd 的其他选项

  如果您的防火墙后面有一个 LAN, 而且需要通过它来转发 LAN 上的包, 或进行 NAT, 还必须同时启用下述选项:

gateway_enable="YES"            # 启用为 LAN 网关

26.4.4 启用 ALTQ

  ALTQ 只有在作为编译选项加入到 FreeBSD 内核时, 才能使用。 ALTQ 目前还不是所有的可用网卡驱动都能够支持的。 请参见 altq(4) 联机手册了解您正使用的 FreeBSD 版本中的驱动支持情况。 下面这些选项将启用 ALTQ 以及一些附加的功能。

options         ALTQ
options         ALTQ_CBQ        # 基于分类的排列 (CBQ)
options         ALTQ_RED        # 随机先期检测 (RED)
options         ALTQ_RIO        # 对进入和发出的包进行 RED
options         ALTQ_HFSC       # 带等级的包调度器 (HFSC)
options         ALTQ_PRIQ       # 按优先级的排列 (PRIQ)
options         ALTQ_NOPCC      # 在联编 SMP 内核时必须使用,禁止读时钟

  options ALTQ 将启用 ALTQ 框架的支持。

  options ALTQ_CBQ 用于启用基于分类的队列 (CBQ) 支持。 CBQ 允许您将连接分成不同的类别, 或者说, 队列, 以便在规则中为它们指定不同的优先级。

  options ALTQ_RED 将启用随机预检测 (RED)。 RED 是一种用于防止网络拥塞的技术。 RED 度量队列的长度, 并将其与队列的最大和最小长度阈值进行比较。 如果队列过长, 则新的包将被丢弃。 如名所示, RED 从不同的连接中随机地丢弃数据包。

  options ALTQ_RIO 将启用出入的随机预检测。

  options ALTQ_HFSC 启用层次式公平服务平滑包调度器。 要了解关于 HFSC 进一步的信息, 请参见 http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html

  options ALTQ_PRIQ 启用优先队列 (PRIQ)。 PRIQ 首先允许高优先级队列中的包通过。

  options ALTQ_NOPCC 启用 ALTQSMP 支持。 如果是 SMP 系统, 则必须使用它。

26.4.5 建立过滤规则

  Packet Filter 会从 pf.conf(5) 文件中读取配置规则, 并根据那里的规则修改、 丢弃或让数据包通过。 默认安装的 FreeBSD 已经提供了一个默认的、 包含一些有用例子和注释的 /etc/pf.conf

  尽管 FreeBSD 提供了自己的 /etc/pf.conf, 但这个文件和 OpenBSD 中的语法是一样的。 OpenBSD 开发团队提供了一个非常好的配置 pf 资源, 它可以在 http://www.openbsd.org/faq/pf/ 找到。

警告: 在浏览 pf 用户手册时, 请时刻注意, 在 FreeBSD 中所包含的 pf 的版本和 OpenBSD 中是不一样的。 在 FreeBSD 5.X 中 pf 相当于 OpenBSD 3.5 中的版本, 而 FreeBSD 6.X 中则相当于 OpenBSD 3.7。

  关于 pf 的配置和使用问题, 可以在 FreeBSD packet filter 邮件列表 提出。 当然, 在提出问题之前, 别忘了查阅邮件列表的存档。

本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.