> For the complete documentation index, see [llms.txt](https://rpicn.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://rpicn.bsdcn.org/an-quan/ufw-fang-huo-qiang.md).

# 使用 UFW 的防火墙

防火墙是一种网络安全系统，它根据一组定义的安全规则监控和控制传入和传出的网络流量。本页介绍**简单防火墙（UFW）**，这是一种使用 [`iptables`](https://www.netfilter.org/projects/iptables/index.html) 简化 Linux 系统防火墙配置的防火墙工具。

UFW 也有一些可用的图形用户界面（GUI）前端，例如 GUFW，但 `ufw` 命令通常在命令行中运行。本页概述 UFW 命令行界面并提供基本操作说明。

## 简单防火墙（UFW）

网络流量按端口号组织，端口号是用于将数据定向到特定应用程序的数字标签。防火墙通过打开和关闭特定端口来控制流量，以允许或阻止某些类型的通信。

在 Linux 系统上，网络流量通过内核的防火墙子系统 **netfilter** 进行过滤。Netfilter 实现数据包过滤；它会根据源 IP 地址、目标 IP 地址、端口号、协议和方向等因素，阻止或允许数据包通过你的系统。

系统管理员使用 `iptables` 配置 netfilter，这是定义数据包过滤规则的传统命令行工具。然而，`iptables` 可能很复杂。Ubuntu 使用的防火墙工具 [UFW（简单防火墙）](https://www.linux.com/learn/introduction-uncomplicated-firewall-ufw)简化了防火墙配置和管理。它充当 `iptables` 的封装层，使系统管理员能够设置防火墙规则，而无需处理原始 `iptables` 命令的复杂性。

## UFW 命令

UFW 是一个用于定义防火墙访问规则的命令行程序。`ufw` 命令的典型语法是：`sudo ufw [--dry-run] <command> [rule]`。

* 所有 `ufw` 命令都需要超级用户权限，因此必须在前面加上 `sudo`。
* （可选）你可以添加 `--dry-run`，在不进行实际更改的情况下模拟 `ufw` 命令。
* `<command>` 是你要执行的主要操作，例如 `allow`。
* 根据命令的不同，你可以选择指定要应用于该命令的 `rule`，例如 `allow 22`。

例如，`sudo ufw --dry-run allow 22` 会显示允许端口 22 上流量的预期结果，包括进行该更改后的完整规则集。

## 安装并启用 UFW

要使用 UFW，你必须先在树莓派上安装它。安装后，UFW 已存在但处于禁用状态，这意味着它尚未阻止任何流量。这使你可以配置默认访问规则而不会把自己锁在门外。如果你通过 SSH（或任何其他远程方法）连接到树莓派设备，这一点尤为重要；为避免被锁在门外，你必须在启用 UFW 之前允许远程访问。

如果你通过 SSH 连接，建议的操作流程如下：

| 步骤 | 说明                                                                                                     | 命令                                                                                              |
| -- | ------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------- |
| 1  | 更新软件包列表。                                                                                               | `sudo apt-get update`                                                                           |
| 2  | 安装 UFW。在启用 UFW 之前，输出会显示 UFW 处于非活动状态。                                                                   | `sudo apt install ufw`                                                                          |
| 3  | 通过检查状态验证安装。有关此命令的信息，请参阅[规则管理](#规则管理)。                                                                  | `sudo ufw status`                                                                               |
| 4  | （可选，但推荐）配置默认策略，例如拒绝所有传入流量。默认策略全局适用。                                                                    | `sudo ufw default deny incoming`                                                                |
| 5  | 为保持远程访问，允许 SSH（在启用 UFW 之前），可以指定服务名（`ssh`），也可以指定默认端口（`22/tcp`）。                                         | `sudo ufw allow ssh` 或 `sudo ufw allow 22/tcp`                                                  |
| 6  | （可选）如果你运行 Web 服务器，允许 HTTP 和 HTTPS 流量，可以指定服务名（`http` 和 `https`），也可以指定它们的默认端口（分别为 `80/tcp` 和 `443/tcp`）。 | `sudo ufw allow http`、`sudo ufw allow https`，或 `sudo ufw allow 80/tcp`、`sudo ufw allow 443/tcp` |
| 7  | 启用 UFW 以激活防火墙，并将其配置为开机启动。                                                                              | `sudo ufw enable`                                                                               |
| 8  | 验证防火墙状态并查看活动规则。有关此命令的信息，请参阅[规则管理](#规则管理)。                                                              | `sudo ufw status verbose`                                                                       |

你可以随时禁用 UFW，这会阻止其开机启动。使用以下命令禁用 UFW 防火墙：

```bash
$ sudo ufw disable
```

## 使用允许和拒绝规则

本节列出通过指定服务名和端口允许和拒绝流量的基本命令。`allow` 和 `deny` 命令的通用 `ufw` 语法如下：

* 允许访问特定端口或服务：`sudo ufw allow [rule]`
* 拒绝访问特定端口或服务：`sudo ufw deny [rule]`

下表提供了具体示例。

| 命令                      | 说明                                          |
| ----------------------- | ------------------------------------------- |
| `sudo ufw allow 22`     | 允许通过防火墙访问端口 **22**。这会为该端口打开所有协议（TCP 和 UDP）。 |
| `sudo ufw allow 22/tcp` | 仅允许端口 **22** 上的 **TCP**。                    |
| `sudo ufw allow ssh`    | 允许 **SSH** 服务，而无需指定端口（SSH 通常使用端口 `22/tcp`）。 |
| `sudo ufw deny 22`      | 拒绝通过防火墙访问端口 **22**。这会为该端口关闭所有协议（TCP 和 UDP）。 |
| `sudo ufw deny 22/tcp`  | 仅拒绝端口 **22** 上的 **TCP**。                    |
| `sudo ufw deny ssh`     | 拒绝 **SSH** 服务，而无需指定端口（SSH 通常使用端口 `22/tcp`）。 |

## 高级 UFW 规则

UFW 能做的不仅仅是基本的允许和拒绝规则。它还可以：

* 针对特定端口[允许或阻止特定 IP 地址](#允许或阻止特定-ip-地址)。
* [指定流量方向](#指定流量方向)（传入和传出）。
* [限制连接尝试速率](#限制连接尝试速率)，以帮助抵御暴力破解或 DDoS 攻击。
* [指定网络接口](#指定网络接口)，将规则专门应用于有线或无线网络。

有关这些选项的更多信息，请运行以下命令：`man ufw`。这会在终端中显示 UFW 手册页，其中包含 UFW 语法、选项、规则格式和示例的文档。

### 允许或阻止特定 IP 地址

你可以允许或拒绝从特定 IP 地址访问特定端口。如果你希望阻止可疑主机或仅允许受信任的主机，这会很有用。例如，以下命令拒绝来自 IP 地址 192.168.2.1 对端口 30 的访问：

```bash
$ sudo ufw deny from 192.168.2.1 to any port 30
```

### 指定流量方向

要控制系统发送或接收网络流量的方式——例如阻止对系统的威胁（传入）或保护系统资源（传出）——你可以阻止流量从其中一个或两个方向进入。具体来说，你可以将 `out`（用于传出流量）或 `in`（用于传入流量）添加到以下命令之一：

* `allow`，允许流量按指定方向流动。
* `deny`，静默丢弃按指定方向流动的流量。
* `reject`，主动拒绝按指定方向流动的流量。

例如，以下命令阻止 SMTP 端口（通常为端口 25/TCP）上的所有传出流量：

```bash
$ sudo ufw reject out smtp
```

### 限制连接尝试速率

为抵御暴力破解和 DDoS 攻击，`limit` 命令会临时阻止在短时间内尝试建立过多连接的 IP 地址（大约 30 秒内 6 次或更多）。例如，以下命令会监视某个 IP 地址尝试向 SSH（通常为端口 `22/tcp`）打开新连接的频率，并应用速率限制。

```bash
$ sudo ufw limit ssh/tcp
```

### 指定网络接口

你可以设置仅应用于特定网络连接（有线网络为 `eth0`，Wi-Fi 为 `wlan0`）的防火墙规则。例如，以下命令仅允许 `eth0` 网络接口上端口 80 的传入 TCP 流量：

```bash
$ sudo ufw allow in on eth0 to any port 80 proto tcp
```

## 规则管理

UFW 按顺序处理规则，因此前面的规则优先于后面的规则。下表列出了有助于检查当前防火墙配置并在必要时删除规则的有用命令。

| 命令                         | 说明                                                                             |
| -------------------------- | ------------------------------------------------------------------------------ |
| `sudo ufw status`          | 显示 UFW 是否处于活动状态，并列出防火墙的所有当前设置（允许和拒绝哪些端口和服务）。                                   |
| `sudo ufw status verbose`  | 显示更多详细信息，例如默认策略和日志记录设置。                                                        |
| `sudo ufw show added`      | 仅显示用户添加的规则（不包括内部规则和系统规则）。如果你想查看更改或比较不同系统之间的配置，这会很有用。                           |
| `sudo ufw status numbered` | 显示规则及其分配的索引编号。如果你想删除特定规则，这会很有用。                                                |
| `sudo ufw delete <number>` | 根据分配的索引编号删除你指定的规则。UFW 随后会重新编号剩余条目。你可以重新运行 `sudo ufw status numbered` 以确认规则已删除。 |
