UFW 防火墙基础:为 VPS 配置防火墙
UFW 是在 VPS 上运行防火墙最简单的方式。设置默认拒绝策略,只放行您需要的端口,并在不锁死 SSH 的前提下启用它。
UFW 是什么,以及为什么您需要它
UFW 是 Uncomplicated Firewall(简易防火墙)的缩写,这个名字名副其实。它是 Linux 内核已经自带的防火墙之上的一个友好前端,因此您不必编写原始规则,只需输入像 ufw allow 22/tcp 这样的简短命令。在一台全新的 VPS 上,每一个正在监听的服务默认都能从互联网访问到。防火墙把这一点反了过来:您先拒绝一切,然后只放行真正会用到的少数几个端口。仅这一处改动,就能用大约四条命令消除您大部分的暴露面。
在动手之前,先弄清楚有哪些服务在监听,因为它们正是防火墙要决定其去留的对象。用 ss -tlnp 查看哪些服务在监听是正确的第一步。
让您不至于把自己锁在门外的那一条规则
下面就是那个把人吓得远离防火墙的错误。您启用了 UFW 并采用默认拒绝策略,却从未放行 SSH,于是防火墙一启动,您自己的连接就被切断,再也回不去了。避免它的办法是:在启用 UFW 之前,永远先放行 SSH。这就是全部诀窍,下面的步骤会按安全的顺序来做。
万一还是发生在您身上,您也并非束手无策:您服务商的网页控制台,通过 VNC 或串口,不经过 SSH,因此您可以从那里登录,运行 ufw disable 或补上缺失的规则。
第 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 会放行该端口,但会封锁任何在三十秒内发起六次或以上连接的地址,这在不额外安装软件的情况下削弱了暴力破解脚本。
如果您运行网页服务器,也请放行 HTTP 和 HTTPS:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp只放行您对外提供的服务。像运行在 5432 端口上的 Postgres 这样的数据库,几乎永远不应该有放行规则。应改为把它绑定到 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防火墙只是其中一层。它控制什么可以到达某个端口,但它并不会减慢那些不停敲打您留开的端口(比如 SSH)的人。为此,请在 SSH 前面加上 Fail2ban 拦在 SSH 前面,封禁屡次作案者。纵深防御意味着每一层都覆盖其他层覆盖不到的地方。
只有当您了解端口是什么、服务如何监听之后,防火墙才有意义,而配置防火墙是新 VPS 上头 10 分钟里的一个步骤。
FAQ
启用 UFW 会断开我的 SSH 会话吗?
如果您先放行 SSH 就不会。在 sudo ufw enable 之前运行 sudo ufw allow 22/tcp,您的连接就能存活,因为防火墙现在允许 22 端口。危险的是在没有 SSH 放行规则的情况下启用默认拒绝的防火墙,那会把您切断。如果发生了这种情况,请通过服务商的 VNC 或串口控制台登录,运行 ufw disable。
VPS 上应该开放哪些端口?
只开放您对外提供的那些。SSH(22/tcp)用于管理这台机器,如果您运行网站,还有 HTTP 和 HTTPS(80/tcp、443/tcp)。其余一律保持拒绝。像数据库这样的内部服务应该绑定到 127.0.0.1,完全不设防火墙规则,这样它们永远无法从网络访问到。
UFW 处理 IPv6 吗?
在现代 Ubuntu 上,会:/etc/default/ufw 里设置了 IPV6=yes,因此每条规则都同时应用于两个协议栈,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 确认,它会在端口旁显示来源地址。