FreeBSD 使用手册
上一页 | 第30章 　防火墙 | 下一页

# 30.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/。

## 30.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 支持联编进内核。

## 30.4.2 PF 内核选项

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

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) 支持，这是用于监视 “状态变更” 的伪网络设备。

## 30.4.3 可用的 rc.conf 选项

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

以下 rc.conf(5) 中的语句用于启动时配置 PF 和 pflog(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 网关

## 30.4.4 建立过滤规则

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

> 警告: 在浏览 PF FAQ 时， 请时刻注意不同版本的 FreeBSD 可能会使用不同版本的 PF。 目前， FreeBSD 使用的是与 OpenBSD 4.1 相同的 PF版本。

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

## 30.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` 中的错误，但不加载相关的规则

## 30.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` 启用 ALTQ 的 SMP 支持。 如果是 SMP 系统， 则必须使用它。

上一页 | 起始页 | 下一页
防火墙软件包 | 上一级 | IPFILTER (IPF) 防火墙

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

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