如何在 Ubuntu 22.04 服务器上使用 UFW 配置防火墙

在 Ubuntu 22.04 服务器上,您可以使用 UFW(简单防火墙)管理入站和出站网络流量。对于远程服务器,请确保在启用防火墙之前允许您当前使用的 SSH 端口,并确认您可以通过另一个终端或控制台恢复访问。

开始之前需要检查的事项

UFW 是用于管理 Linux 防火墙的工具。即使防火墙中允许某个端口,连接也只有在该服务已安装、正在运行并监听正确的地址和端口时才能建立。如果有云安全组或外部防火墙,也应单独检查它们的规则。

不要随意更改正在运行的服务器上的现有策略。首先,检查当前防火墙状态、注册的规则、所需的服务和访问端口,并准备一种即使 SSH 断开也可以使用的访问方法,例如通过云控制台或服务器管理控制台。命令需要管理员权限。

sudo ufw status verbose
sudo ufw show added
sudo ss -lntup

status verbose 显示活动的 UFW 策略和规则。如果 UFW 未激活,仅通过此界面无法检查所有已注册的规则,因此还请参阅 show added。ss 有助于识别监听套接字,但不能确定服务是否可以从外部访问。

允许 SSH 后激活

以下是新服务器在默认 TCP 端口 22 上运行 SSH 的示例。如果端口不同,请更改为实际端口。此规则允许该端口,但不限制特定的 IP,因此请考虑访问范围较广。在已激活的服务器上,请先审查现有规则和优先级。

sudo ufw allow 22/tcp

检查其他必需的服务规则和默认策略,然后打开防火墙。当你开启 UFW 时,现有的 SSH 连接可能会因规则重新应用而中断。通过单独的终端测试新的 SSH 连接,同时保持当前会话,如果连接失败,请使用准备好的控制台访问以修改规则。

sudo ufw enable
sudo ufw status verbose

验证状态是否为 active,并确保显示了预期的 SSH 规则。然后,测试从允许和不允许的网络对实际必需服务的连接。此过程及例外情况也可以在 Ubuntu 22.04 UFW 文档 的远程管理部分检查。

基本策略和端口规则

新安装的 UFW 的默认设置通常拒绝传入连接并允许传出连接,但这可能因服务器而异。使用 status verbose 检查实际策略。例如,要在已检查所有所需服务的新服务器上默认拒绝传入连接,可以使用以下命令。在已运行的服务器上,首先需要审查策略更改将如何影响现有服务和连接。

sudo ufw default deny incoming

如果需要对外提供 Web 服务器,请允许实际使用的端口和协议。以下是 HTTP 和 HTTPS 的 TCP 端口示例,无需在不运行 Web 服务的服务器上普遍应用。

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

如果服务器提供 DNS 服务,您可以根据需要允许端口 53 的 UDP 和 TCP。不要因为只是示例而在不提供 DNS 服务的服务器上开放端口。

sudo ufw allow 53/udp
sudo ufw allow 53/tcp

allow 添加允许规则,deny 添加拒绝规则。没有指定协议的端口规则可以同时适用于 TCP 和 UDP,所以明确指定所需的协议会更清楚。规则的顺序很重要,第一个匹配的规则可能会被应用,因此在已有允许规则的情况下添加拒绝规则并不一定会阻止访问。

仅允许来自特定 IP 的访问

以下是只允许来自单个 IPv4 地址的 TCP 端口 22 连接的示例。192.0.2.10 是用于说明的占位地址,因此请将其替换为实际的管理员访问 IP,如果该 IP 可以更改,请先准备恢复方法。

sudo ufw allow from 192.0.2.10 to any port 22 proto tcp

即使您添加了此规则,如果仍存在允许来自所有地址的端口 22 的规则,访问可能仍不会受到限制。使用编号列表检查现有规则及其顺序,并仅保留实际必要的规则。如果服务器启用了 IPv6,不要假设仅针对 IPv4 的规则能限制 IPv6 访问;也要检查 IPv6 的策略和规则。

sudo ufw status numbered

删除规则和禁用防火墙

要删除您添加的具有完全相同内容的规则,请在原始命令中使用delete。例如,以下命令删除允许UDP端口53的规则,而TCP规则是分开的。

sudo ufw delete allow 53/udp

您也可以按编号删除,但如果删除一条规则,编号会发生变化。始终使用sudo ufw status numbered再次检查当前编号和内容。基于编号的删除只会删除显示的单个IPv4或IPv6规则,因此也要检查另一种IP版本对应的规则。删除后,请再次检查状态并测试实际连接。

要关闭防火墙,请使用以下命令。禁用后,UFW提供的保护将被移除,因此不要仅因为存在其他防火墙就假设它是安全的;首先检查影响范围。

sudo ufw disable

当规则未按预期运行时

检查服务是否正在运行,检查正确的端口和协议是否被允许,规则的顺序,以及默认策略。同时,查看云防火墙、路由器和上游网络的规则,以及用于连接的IPv4或IPv6地址。由于容器或单独管理的网络规则,仅使用UFW状态列表可能难以判断整体行为。

在实际更改规则之前,可以使用--dry-run预览更改。例如,以下命令显示对TCP 80允许规则的更改而不实际应用它们。

sudo ufw --dry-run allow 80/tcp

UFW 状态屏幕主要显示由 UFW 命令管理的规则,并不代表系统上的所有防火墙设置。有关更多说明和命令格式,请参阅 Ubuntu 服务器防火墙文档。