SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 更新于 2026-08-27

UFW 防火墙配置指南:安全设置 VPS 防火墙

了解 UFW 如何在 Ubuntu 和 Debian VPS 上设置默认拒绝策略,仅开放 SSH、HTTP 和 HTTPS 等必要端口,并避免启用防火墙后失去 SSH 连接。

UFW 是什么,以及为什么需要它

UFW 是 Uncomplicated Firewall 的缩写,这个名称很准确。它是 Linux 内核现有防火墙的友好前端,因此无需编写底层规则,只需输入类似 ufw allow 22/tcp 的简短命令即可。在全新的 VPS 上,所有正在监听的服务默认都可从互联网访问。防火墙会反转这一默认行为:拒绝所有连接,然后仅允许实际使用的少数端口。这一项修改只需大约 4 条命令,即可消除大部分暴露面。UFW 是 Ubuntu 和 Debian 使用的工具,因此如果 VPS 运行 Rocky 或 AlmaLinux,应改用 firewalld,它会将规则组织到区域中

在操作防火墙之前,先确认有哪些服务正在监听,因为防火墙决定的就是这些服务的网络访问权限。使用 ss -tlnp 查看正在监听的服务是正确的第一步。

避免锁死远程访问的唯一规则

防火墙最容易让人却步的原因,就是这个常见错误:您将 UFW 设置为默认拒绝策略,却没有先允许 SSH。防火墙启用后,当前 SSH 连接会立即中断,您也无法重新登录。始终在启用 UFW 之前允许 SSH,即可避免此问题。关键只有这一点,下面的步骤会按安全顺序执行。

即使发生了锁死,您也不必束手无策:服务商提供的 Web 控制台通过 VNC 或串行连接访问,不经过 SSH。您可以从那里登录,然后运行 ufw disable 或添加缺失的规则。防火墙导致的锁死也有明显特征:被丢弃的数据包会使 SSH 客户端一直等待,直到连接超时;而已停止的 SSH daemon 会立即拒绝连接。这就是连接被拒绝与连接超时的区别

第 1 步:设置默认策略

首先配置 UFW,拒绝所有入站流量,并允许所有出站流量:

sudo ufw default deny incoming
sudo ufw default allow outgoing

deny incoming 是关键部分。它表示,任何未配置显式允许规则的端口都对外关闭,即使有服务正在该端口上监听。allow outgoing 允许服务器正常访问互联网,以便更新及执行其他类似操作。这两条命令只会修改策略;在第 3 步启用 UFW 之前,这些策略不会生效。

第 2 步:放行实际需要的端口

启用前先开放 SSH,以保持当前连接:

sudo ufw allow 22/tcp

UFW 还可以为 SSH 设置速率限制:sudo ufw limit 22/tcp 会放行该端口,但会阻止在三十秒内发起六次或更多连接的地址。这样无需额外软件即可降低暴力破解脚本的影响。

如果运行 Web 服务器,还应放行 HTTP 和 HTTPS:

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

只放行向公网提供的服务。例如,Postgres 使用的 5432 端口几乎不应添加 allow 规则。应将其绑定到 127.0.0.1,使其只能在本机访问。每开放一个端口,就需要对其进行防护,因此应尽量缩短端口列表。

也可以在这里为服务器构建完整的 ufw 命令序列,然后按顺序执行:

ToolUFW rule generator

第 3 步:启用并确认已开启

sudo ufw enable

系统会警告,此命令可能中断现有的 SSH 连接。由于您在第 2 步中允许了 22/tcp,当前会话可以保持连接。确认结果:

sudo ufw status verbose
Status: active
Default: deny (incoming), allow (outgoing)

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)
80/tcp                     ALLOW IN    Anywhere

这里需要查看两点。Status: active 表示防火墙正在运行。每条规则都会显示两次,一次为普通规则,另一次带有 (v6);这表示 UFW 同时覆盖 IPv6 和 IPv4。如果缺少 (v6) 行,则说明 IPv6 侧未受管理,这是一个独立的问题,IPv6 防火墙文章对此有详细说明。

稍后管理规则

查看带编号的规则,以便删除其中一条:

sudo ufw status numbered
sudo ufw delete 3

仅允许一个地址访问某个端口。这是只向您自己的 IP 暴露管理服务的有效方法:

sudo ufw allow from 10.0.0.24 to any port 5432 proto tcp

当您自己的地址发生变化,或需要让多台机器接入时,这种方法就会失效。通常的解决方案是完全停止向公网开放端口,改为通过私有网络访问服务;这正是将服务器的私有子网发布到您的 tailnet的用途。

防火墙只是其中一层。它控制哪些连接可以访问端口,但无法减缓针对已开放端口的持续尝试,例如 SSH。为此,请在 SSH 前部署 Fail2ban,封禁重复违规的来源。纵深防御意味着每一层都弥补其他层无法覆盖的部分。

只有了解 端口是什么以及服务如何监听 后,防火墙才有意义;配置防火墙也是 新 VPS 上线后前 10 分钟内的操作之一。

FAQ

启用 UFW 会断开我的 SSH 会话吗?

只要先允许 SSH,就不会。先运行 sudo ufw allow 22/tcp,再运行 sudo ufw enable。防火墙现在允许端口 22,因此连接会保持不变。危险在于启用默认拒绝的防火墙,却没有添加 SSH 允许规则,这会切断您的连接。如果发生这种情况,请通过服务商提供的 VNC 或串行控制台登录,然后运行 ufw disable

VPS 应开放哪些端口?

只开放您要向公网提供服务的端口。开放 SSH(22/tcp)以管理服务器;如果运行网站,则开放 HTTP 和 HTTPS(80/tcp443/tcp)。其他端口全部保持拒绝。数据库等内部服务应绑定到 127.0.0.1,完全不添加防火墙规则,这样它们永远无法从网络访问。

UFW 支持 IPv6 吗?

在较新的 Ubuntu 中支持:IPV6=yes/etc/default/ufw 中设置,因此每条规则都会同时应用于两种协议栈,而 ufw status 会显示带有 (v6) 后缀的 IPv6 规则。可能导致其仍然失效的情况已在IPv6 防火墙陷阱中说明。

如何删除 UFW 规则?

运行 sudo ufw status numbered,列出带索引编号的规则,然后运行 sudo ufw delete N,其中 N 是要删除的规则编号。您也可以按规则定义删除,例如 sudo ufw delete allow 80/tcp

如何仅允许一个 IP 地址访问端口?

使用 from 规则,而不是普通的 allow。若只允许办公室地址访问 PostgreSQL,请运行 sudo ufw allow from 10.0.0.10 to any port 5432 proto tcp。在默认拒绝策略下,端口在规则放行前会对所有人关闭,因此该 from 规则是唯一的访问路径:整个互联网都会被阻止,只有您指定的地址可以通过。不要再添加普通的 allow 5432/tcp,否则端口会对所有人开放。这是公开数据库或管理面板时最安全的方式。使用 sudo ufw status verbose 确认结果;该命令会在端口旁显示源地址。