> 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/20150506-ce-liang-liang-ci-dai-ma-yi-ci-xie-hao/book-review.md).

# 书评：The Book of PF: A No-Nonsense Guide to the OpenBSD Firewall

* 原文：[Book Review](https://freebsdfoundation.org/our-work/journal/browser-based-edition/measure-twice-code-once/)
* 作者：**Steven Kreuzer**

*The Book of PF: A No-Nonsense Guide to the OpenBSD Firewall*

* Peter N.M. Hansteen
* No Starch Press，2014 年第 3 版
* ISBN 159-3275897
* 248 页

常常有人问我，为什么我更喜欢用 FreeBSD，它相比 Linux 又有什么优势。原因之一是 FreeBSD 自带了一款现代化、高性能的防火墙，并且由专注安全开发的开发者持续维护。自 2001 年发布以来，OpenBSD 的 PF 包过滤器为系统和网络管理员提供了一套设计严谨、有状态的防火墙，其语法极为简洁，规则编写与调试都十分轻松。如果到目前为止还不明显的话——我是 PF 的铁杆粉丝，因此我对《The Book of PF：OpenBSD 防火墙实战指南》的书评可能略显偏颇。但如果你从未接触过 PF，却不幸在 Linux 上用过 `iptables`，你很快就能理解我偏爱的由来。

Peter N. M. Hansteen 的《The Book of PF》确实是一本“OpenBSD 防火墙实战指南”，内容涵盖从配置基础一路到构建高可用、冗余网络的全部要点。如今已是第 3 版，全书经过彻底修订，覆盖了 OpenBSD 5.6、FreeBSD 10.0 与 NetBSD 6.1 中的最新进展。本书还扩充了篇幅，深入讲解了 OpenBSD 5.5 中取代旧 ALTQ 系统的全新优先级与队列机制。

前两章面向初学者，专注于让读者快速上手 PF。本书只要求读者具备基本的 Unix 管理经验和少许 TCP/IP 网络知识，内容以教程风格呈现，通俗易懂、便于跟进。从第三章起，本书涵盖多种部署场景，从保护工作站的简单防火墙，一直到足以媲美数十万美元商业方案的高可用网络。

我格外欣赏本书的一点（这在技术书中并不多见）：在简短介绍之后，Hansteen 直奔主题、毫不拖沓。你还在为必须运行 FTP 服务器而苦恼吗？这里有你需要做的。想在办公室内网主机与连接互联网的主机之间做些隔离？这里有一个可按需调整的配方。所有内容都直击要害，没有冗余，也不浪费篇幅去讲解如何在七大 Linux 发行版上编译软件——后者在当今技术书中实在太过常见。本书仅 248 页，读起来很快，但我猜你的书很快就会被翻卷——因为你需要反复阅读各章，并不断回过头来当作参考查阅。

我对 PF 格外欣赏的一点，也是 Hansteen 表现出色的地方，在于 PF 是一个很好的基础，可在此基础上借助其他软件构建简单而高效的解决方案，大幅扩展 PF 的能力。《The Book of PF》用整整一章讨论“主动防御”，给出了简单示例，演示如何搭建自适应防火墙来应对监听服务上的暴力破解攻击。如果你曾把运行 SSH 的机器直接连到互联网，相信你一定见过无数暴力破解尝试塞满日志文件的场景。现有许多方案试图解决这些问题，但大多数都需要你以 root 身份运行某个文档匮乏的 Perl 脚本，解析日志文件并添加规则来封禁违规 IP。我热爱 PF 的原因之一，是它拥有大量与之无缝集成的附加工具，能以极为优雅的方式处理这些麻烦。

也许你运营着自己的邮件服务器，每天都会看到无数试图中继垃圾邮件的机器发来的连接。应对垃圾邮件几乎和电子邮件本身一样古老，人们提出了数不清的方案，成效各异。分析邮件内容或检查发件人是否被列入黑名单，往往只能在短期内奏效，垃圾邮件发送者很快会变聪明并更换手法。你会陷入一场无休止的军备竞赛——这也正是 OpenBSD 开发者在网络层面用 PF 与 spamd 应战的原因。Hansteen 花了大量篇幅介绍各种让垃圾邮件发送者难堪的方法，甚至还能以每秒 1 字节的速度回应他们、最终再拒收邮件，从中取乐。即使你不运营邮件服务器，搭建 spamd 并看着垃圾邮件发送者因为等待 EHLO 而被困数小时，也是一件令人十分愉悦的事。

一旦把 PF 部署到生产环境，时刻关注其动态总是明智之举。视配置复杂程度而定，你可能会产生海量数据，从中筛选信息会成为一项艰巨任务。所幸作者用整整一章讨论日志、监控与统计收集。它不仅涵盖内置的分析手段，还介绍了一些可从 Ports 树安装的第三方工具，能提供额外的实时洞察与历史趋势，助你掌控网络。

撰写本书时，我相信 Hansteen 的初衷是让你在调试时手边常备一本。本书结尾部分帮助你在部署到生产环境前把配置调试到位。虽然 PF 开箱即用的默认配置已足够健全，能覆盖典型部署场景，但他仍就一些可调参数给出了实用建议，也指出另一些参数最好别动。纵览全书，Hansteen 始终提供各种建议与技巧，帮助构建普通人也能调试的网络；而最后一章则深入探讨了测试与调试规则集的进阶方法——当情况看似不如预期运转时，这些方法会派上用场。

本书主要聚焦 OpenBSD 上 PF 的功能集，但在必要时，作者也十分详尽地描述了在 FreeBSD 与 NetBSD 上使用 PF 时会遇到的不同之处。所举示例均基于现实问题——这些是你迟早要解决的难题——因此便于跟进，也为你在实际将 PF 部署到生产环境时打下了扎实基础。

Hansteen 为《The Book of PF》设定的目标是“帮助你构建所需的网络”：从少许理论起步，逐步推进到越来越复杂的配置，并配有大量示例，演示如何在一个数据包试图穿越你的网络时控制它。我相信他不仅达成了目标，而且超额完成。我强烈向所有系统或网络管理员推荐本书。本书会带你走过常见的坑，为你节省时间、避免挫败。如果你在任何平台上使用 PF，都该在书架上放一本。如果你有朋友整日与 `iptables` 苦战，这本书是送给他们的绝佳礼物——正好让他们见识一下自己错过了什么。

**Steven Kreuzer** 是 FreeBSD 开发者兼 Unix 系统管理员，对复古计算与风冷大众汽车情有独钟。他与妻子和狗住在纽约皇后区。


---

# 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/20150506-ce-liang-liang-ci-dai-ma-yi-ci-xie-hao/book-review.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.
