31.4 OpenBSD Packet Filter (PF) 和 ALTQ

Revised and updated by John Ferrell.

  2003 年 7 月, OpenBSD 的防火墙, 也就是常说的 PF 被成功地移植到了 FreeBSD 上, 并可以通过 FreeBSD Ports Collection 来安装了; 第一个将 PF 集成到基本系统中的版本是 2004 年 11 月发行的 FreeBSD 5.3。 PF 是一个完整的提供了大量功能的防火墙软件, 并提供了可选的 ALTQ (交错队列, Alternate Queuing) 功能。 ALTQ 提供了服务品质 (QoS) 带宽整形功能。

  OpenBSD 项目非常杰出的维护着一份 PF FAQ。 就其本身而言,这一节注重于 FreeBSD 的 PF 和提供一些关于使用方面的一般常识。更详细的使用信息请参阅 PF FAQ

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

31.4.1 使用 PF 可加载的内核模块

  要加载 PF 内核模块, 可以在 /etc/rc.conf 中加入下面的设置:

pf_enable="YES"

  然后使用启动脚本来加载模块:

# /etc/rc.d/pf start

  需要说明的是, 如果系统中没有规则集配置文件, 则上述操作不会加载 PF 模块。 配置文件的默认位置是 /etc/pf.conf。 如果 PF 规则集在其他位置, 可以用下面的 /etc/rc.conf 配置来告诉 PF:

pf_rules="/path/to/pf.conf"

  pf.conf 的例子可以在 /usr/share/examples/pf/ 找到。

  PF 模块也可以手工从命令行加载:

# kldload pf.ko

  PF 的日志记录功能是由 pflog.ko 提供的, 通过在 /etc/rc.conf 中加入下面的设置:

pflog_enable="YES"

  然后使用启动脚本来加载模块:

# /etc/rc.d/pflog start

  如果您需要其他 PF 特性, 则需要将 PF 支持联编进内核。

31.4.2 PF 内核选项

  虽然你不必亲自把对 PF 的支持编译进 FreeBSD 内核,但是有时你仍然需要这么做来使用到 PF 的某些没有被收录进可加载模块的高级特性,比如 pfsync(4) 伪设备用来发送某些改变到PF 状态表。 它能配合 carp(4) 使用 PF 建立支持故障转移的防火墙。 更多有关 CARP 的详细信息可以参阅本手册的 第 32.14 节

  The PF kernel options can be found in /usr/src/sys/conf/NOTES and are reproduced below:

  有关 PF 的内核选项可以在 /usr/src/sys/conf/NOTES 中找到, 以下也略有阐述:

device pf
device pflog
device pfsync

  device pf 选项用于启用 “Packet Filter” 防火墙的支持 (pf(4))。

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

  device pfsync 选项启用可选的 pfsync(4) 支持,这是用于监视 “状态变更” 的伪网络设备。

31.4.3 可用的 rc.conf 选项

  The following rc.conf(5) statements configure PF and pflog(4) at boot:

  以下 rc.conf(5) 中的语句用于启动时配置 PFpflog(4)

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 网关

31.4.4 建立过滤规则

  PF 会从 pf.conf(5) (默认为 /etc/pf.conf) 文件中读取配置规则, 并根据那里的规则修改、丢弃或让数据包通过。 默认安装的 FreeBSD 已经提供了一些简单的例子放在 /usr/share/examples/pf/ 目录下。 请参阅 PF FAQ 获取完整的 PF 规则信息。

警告: 在浏览 PF FAQ 时, 请时刻注意不同版本的 FreeBSD 可能会使用不同版本的 PF。 目前, FreeBSD 8.X 和之前的系统使用的是与 OpenBSD 4.1 相同版本的 PF。 FreeBSD 9.X 和之后的系统使用的是与 OpenBSD 4.5 相同版本的 PF

  FreeBSD packet filter 邮件列表 是一个提有关配置使用 PF 防火墙问题的好地方。请在提问之前查阅邮件列表的归档!

31.4.5 使用 PF

  使用 pfctl(8) 可以控制 PF。 以下是一些实用的命令 (请查阅 pfctl(8) 获得全部可用的选项):

命令 作用
pfctl -e 启用 PF
pfctl -d 禁用 PF
pfctl -F all -f /etc/pf.conf 清除所有规则 (nat, filter, state, table, 等等。) 并读取 /etc/pf.conf
pfctl -s [ rules | nat | state ] 列出 filter 规则, nat 规则, 或状态表
pfctl -vnf /etc/pf.conf 检查 /etc/pf.conf 中的错误,但不加载相关的规则

31.4.6 启用 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 系统, 则必须使用它。

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

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