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 outgoingdeny incoming 是关键部分。它表示,任何未配置显式允许规则的端口都对外关闭,即使有服务正在该端口上监听。allow outgoing 允许服务器正常访问互联网,以便更新及执行其他类似操作。这两条命令只会修改策略;在第 3 步启用 UFW 之前,这些策略不会生效。
第 2 步:放行实际需要的端口
启用前先开放 SSH,以保持当前连接:
sudo ufw allow 22/tcpUFW 还可以为 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 命令序列,然后按顺序执行:
第 3 步:启用并确认已开启
sudo ufw enable系统会警告,此命令可能中断现有的 SSH 连接。由于您在第 2 步中允许了 22/tcp,当前会话可以保持连接。确认结果:
sudo ufw status verboseStatus: 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/tcp、443/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 确认结果;该命令会在端口旁显示源地址。