# 18.1 防火墙概论

防火墙用于过滤进出系统的流量。它使用一个或多个“规则”集检查网络数据包，在数据包进入或离开网络连接时决定允许通过还是阻止。规则可检查数据包的一个或多个特征，如协议类型、源地址或目标地址、源端口或目标端口。

防火墙可以增强主机或网络的安全性。它们可以执行以下一项或多项操作：

* 保护并隔离内部网络的应用程序、服务和主机，使其免受公共互联网不良流量的侵扰。
* 限制或禁用内部网络的主机访问公共互联网服务。
* 支持网络地址转换（NAT），内部网络可使用私有 IP 地址，并通过单一 IP 地址或共享地址池中的公共地址连接公共互联网。

FreeBSD 内置三种防火墙：PF、IPFW 和 IPFILTER（也称 IPF）。此外还提供两种流量整形工具以控制带宽：altq(4) 和 dummynet(4)。ALTQ 通常与 PF 紧密关联，dummynet 则与 IPFW 紧密关联。三种防火墙均通过规则控制进出 FreeBSD 系统的数据包访问，但实现方式各异，规则语法也不相同。

FreeBSD 提供多种防火墙，用户应根据自身需求选择。

> **注意**
>
> 所有防火墙均通过检查数据包控制字段的值来工作，因此规则集的编写者需要了解 TCP/IP 的工作原理、数据包控制字段中各值的含义，以及这些值在正常会话中的使用方式。

规则集包含一组规则，依据数据包中所含值决定允许通过还是阻止。主机之间的双向数据包交换构成一次会话。防火墙规则集既处理来自公共互联网的数据包，也处理系统对这些数据包作出的响应数据包。每个 TCP/IP 服务由其协议和监听端口定义。指向特定服务的数据包源自非特权端口，目标为特定地址上的服务端口。上述参数均可作为选择标准来创建规则，从而允许或阻止服务。

要查找未知的端口号，请参阅 **/etc/services**。此外，特洛伊木马也可能使用未知端口，需要额外留意。

FTP 有两种模式：主动模式和被动模式，两者的区别在于如何获取数据通道。其中，因为数据通道是由发起 FTP 会话的客户端获得的，所以被动模式更安全。

防火墙规则集可分为“排他性”与“包容性”两类。除非流量与规则集匹配，排他性防火墙对所有流量一律允许通过。包容性防火墙则反之：仅允许匹配规则的流量通过，阻止其余所有流量。

包容性防火墙能更好地控制出站流量，对提供公共互联网服务的系统是更好的选择。它同时控制来自公共互联网的流量，决定哪些流量可以访问私有网络。所有不匹配规则的流量均被阻止并记录。包容性防火墙因显著降低了允许不良流量通过的风险，通常比排他性防火墙更安全。

> **注意**
>
> 除非另有说明，本章中的所有配置和示例规则集均采用包容性防火墙规则集。

有状态防火墙可进一步加强安全性。有状态防火墙会跟踪打开的连接，仅允许与现有连接匹配的流量，或用于建立新连接的数据包。

有状态过滤将流量视作一次双向数据包交换的会话。规则中指定状态后，防火墙会动态生成每个预期数据包的内部规则，能够匹配并判定数据包是否属于该会话。若数据包不符合会话模板，即自动拒绝。

会话完成后，该会话即从动态状态表中移除。

有状态过滤使用户专注于阻止或允许新的会话。新会话一旦允许，所有后续数据包自动放行，任何伪造的数据包均自动拒绝；若阻止新会话，则任何后续数据包均不会允许通过。有状态过滤具备先进的匹配能力，可防御攻击者采用的各种攻击方法。

NAT（网络地址转换）功能使防火墙后的私有局域网可以共享 ISP 分配的单一 IP 地址（即便该地址是动态分配的）。NAT 使局域网中每台计算机均能访问互联网，无需为多个互联网账户或 IP 地址支付额外费用。

数据包经防火墙发往公共互联网时，NAT 自动将各系统的私有局域网 IP 地址转换为单一公共 IP 地址。返回的数据包则执行反向转换操作。

根据 RFC 1918，以下 IP 地址范围保留供私有网络使用，这些地址永远不会直接路由到公共互联网，故可与 NAT 配合使用：

* **10.0.0.0/8**
* **172.16.0.0/12**
* **192.168.0.0/16**

> **警告**
>
> 使用防火墙规则时，务必 **小心谨慎**。某些配置可能会导致管理员无法登录服务器。为了安全起见，建议通过本地控制台执行初始防火墙配置，而不是通过 SSH 远程配置。

## 课后习题

1. 在 FreeBSD 上分别安装 PF、IPFW 和 IPFILTER，阅读各自的默认规则文件，比较三种防火墙规则语法的差异。
2. 编写一套包容性 PF 规则集：允许 SSH（端口 22）和 HTTP/HTTPS（端口 80/443），阻止其余所有入站流量，并在本地控制台测试规则是否生效。
3. 使用 NAT 将一台 FreeBSD 主机配置为网关，使局域网内的其他设备通过该主机访问互联网，记录 **/etc/pf.conf** 中的 NAT 规则和 `sysctl` 参数设置。
4. 构造一个测试场景：在远程 SSH 会话中应用错误的防火墙规则，观察连接中断的现象，然后说明为何应在本地控制台执行防火墙配置。


---

# Agent Instructions: 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:

```
GET https://book.bsdcn.org/di-18-zhang-fang-huo-qiang/di-18.1-jie-fang-huo-qiang-gai-shu.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
