> For the complete documentation index, see [llms.txt](https://freebsd-journal-cn.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://freebsd-journal-cn.bsdcn.org/20170506-an-quan/freebsds-firewall-feast.md).

# FreeBSD 的防火墙盛宴

作者：Michael W Lucas

FreeBSD 因许多出色的特性而闻名，如 ZFS、Jail、bhyve 虚拟化和 Ports Collection。然而，它也因拥有三个不同的防火墙而有些“臭名昭著”：PF、IPFilter 和 IPFW。这些防火墙都是从哪里来的？为什么它们都还在系统中？IT 行业一再滥用、拉伸和折磨“防火墙”这个词，以适应各种不同的产品。当有人使用“防火墙”时，问他们具体指什么。他们指的是像 Squid 或 Varnish 那样的缓存 HTTP 代理？还是像 `relayd` 那样的通用代理？抑或 TCP/IP 包过滤器？FreeBSD 的所有防火墙都是包过滤器。它们控制哪些 TCP/IP 地址和端口可以连接到主机。如果你的 FreeBSD 主机在接口间转发数据包，那么防火墙就控制哪些流量被转发，哪些被静默丢弃，哪些连同抱怨信一起被退回给源地址。转发数据包的包过滤器是最初意义上的防火墙。

这些防火墙都有一组共同的核心功能集，被视为现代包过滤器的最低要求。它们能追踪 TCP/IP 连接的状态，并基于现有连接放行流量。它们都能返回重置包或静默丢弃连接。它们都能管理不可路由地址并执行网络地址转换。它们都通过定义规则列表来处理来自不同 IP 地址和网络端口的流量。传入的数据包与规则列表逐一比对，直到被放行或拒绝。但每个防火墙都有自己独特的功能。你如何在它们之间选择？

IPFW 是 FreeBSD 上最古老的包过滤器，可追溯到 1995 年。IPFW 以编号列表的形式维护规则。通过给定规则编号向现有规则集添加规则。规则编号范围从 1 到 65534。IPFW 规则非常动态，可以编程方式修改。但编号规则确实带来了一些限制。每次设计 IPFW 规则集时，我最终都不得不重新编号规则，因为不知怎的我需要在两条规则之间塞入太多规则。这是我创建规则集时想象力不足的局限，而非 IPFW 本身的限制。IPFW 最有趣的独特功能是 `dummynet`，它让你可以选择性地劣化流量。为什么要让连接变差？嗯，模拟一条到月球的 ADSL 链路确实有点意思。但能够对连接施加额外延迟和带宽限制，可以为全球化组织节省数天或数周的时间以及数千美元的开发者差旅费用。我不止一次设置 IPFW 设备来模拟来自世界另一端的连接，或通过多个配置文件模拟几个不同的国家。韩国用户使用千兆 Internet 线路的体验，与距离更近但带宽更少的用户的体验截然不同。`dummynet` 让你在本地就能模拟他们的体验。IPFW 也是所有 FreeBSD 防火墙中性能最高的，尽管这只有在每秒数十吉比特的吞吐量下才会显现。

IPFilter，即 IPF，是一个平台无关的防火墙，于 20 世纪 90 年代末来到 FreeBSD。你可以在 FreeBSD、Solaris、SunOS、HP-UX、NetBSD、OpenBSD 和 Linux 上使用 IPFilter。它的配置语法与 PF 类似。如果你必须在多个操作系统上运行同一防火墙，IPFilter 是你的选择。IPFilter 不在活跃开发中，但能够阻止、放行和转换数据包。它在功能上已基本完备。

PF 是 FreeBSD 上最新的防火墙，在年轻系统管理员中相当流行。它起源于 OpenBSD 项目，作为 IPFilter 的替代品。它在没有伴随 IPFW 长大的年轻系统管理员中相当流行。PF 可能是最受欢迎的 FreeBSD 防火墙。PF 的配置语法比 IPFW 更简单。虽然你可以编程方式修改规则集，但必须预先配置规则集以允许此类修改。虽然邮件列表存档中讨论过一些偶发问题，如处理 IPv6 分片，但这些问题多年前已解决。虽然 FreeBSD 的 PF 源自 OpenBSD，但那次导入发生在若干年前。FreeBSD 的 PF 已经与最初的导入版本产生了差异，而 OpenBSD 的 PF 则继续其自然演进。两者很可能会继续分化。

所有这些信息都不错，但你应该选择哪个？

在你学习 PF 配置时，务必使用与 FreeBSD 相关的文档，而非当前的 OpenBSD 文档。FreeBSD 重新导入 OpenBSD 的 PF 的可能性微乎其微。PF 还与 Jail 使用的 vimage 虚拟网络栈不兼容。所有这些信息都不错，但你应该选择哪个？这取决于你的环境。大多数使用小型服务器的系统管理员会发现 PF 的简洁性是个优势。如果你想在多个类 Unix 操作系统上使用同一防火墙软件，用 IPFilter。如果你需要每秒转发数十吉比特、模拟糟糕的连接、无限制地以编程方式修改规则，或需要高级 Jail 网络，用 IPFW。如果你已经部署了其中一个，当然继续使用即可。它们都能很好地完成过滤数据包这一基本防火墙任务。结合 Squid、`relayd` 或 Varnish 等应用代理或缓存，FreeBSD 可以与任何商业防火墙厂商正面对抗并获胜。•

***

**MICHAEL W LUCAS** 著有多本 FreeBSD 书籍，包括《Absolute FreeBSD》和《FreeBSD Mastery》系列。更多信息见 <[www.michaelwlucas.com>。](https://freebsd-journal-cn.bsdcn.org/20170506-an-quan/http:/www.michaelwlucas.com>。)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://freebsd-journal-cn.bsdcn.org/20170506-an-quan/freebsds-firewall-feast.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
