适用场景与准备工作
UFW(Uncomplicated Firewall)是 Ubuntu、Debian 系统默认的防火墙管理工具,底层封装 iptables,用几条命令就能完成端口放行、IP 限制等操作,特别适合不熟悉 iptables 复杂语法的站长和运维人员。本文适合这样几类场景:新买的云服务器需要对外开放 80、443 端口;数据库、Redis、phpMyAdmin 等管理端口只允许指定 IP 访问;服务器每天被大量陌生 IP 扫描,想从防火墙层限制来源。
动手之前需要确认三件事:系统为 Ubuntu 或 Debian(CentOS 系列默认使用 firewalld,命令不同);当前用户有 root 权限或可以通过 sudo 执行命令;已经能正常 SSH 登录服务器,并且知道自己的 SSH 端口(默认 22,改过端口的要记住改后的端口号)。另外,如果服务器上同时安装了宝塔面板或 firewalld,建议只保留一种防火墙方案,否则多层规则互相覆盖,后期排查端口问题会非常困难。
第一步:确认 UFW 安装与当前状态
登录服务器后,先执行下面的命令查看 UFW 是否已安装、是否处于启用状态:
sudo ufw status
如果提示 command not found,说明尚未安装,执行以下命令安装:
sudo apt update
sudo apt install ufw
正常情况下,新系统装好 UFW 后状态是 inactive(未启用),此时防火墙规则不会拦截任何流量。需要特别说明的是:inactive 状态下添加的规则会被保留下来,一旦执行 enable 就会全部生效。利用这个特性,我们可以"先把规则配好,最后统一启用",避免边配边把自己挡在门外的风险。
第二步:设置默认策略并开放常用端口
UFW 的核心思路是"先设默认策略,再按需放行":默认拒绝所有入站连接,只开放业务真正需要的端口。首先设置默认策略:
sudo ufw default deny incoming
sudo ufw default allow outgoing
第一条命令表示默认拒绝所有入站流量,第二条表示允许服务器主动访问外网(很多程序如下载更新、发送邮件都依赖出站连接,建议保持允许)。设置完成后,先放行 SSH 端口,这是整个流程中最关键的一条规则,顺序上一定要在启用防火墙之前完成:
sudo ufw allow OpenSSH
# 如果修改过 SSH 端口,例如改为 2222,则执行:
sudo ufw allow 2222/tcp
接着放行 Web 服务端口。以常见的 LNMP 环境为例,80 提供 HTTP 访问、443 提供 HTTPS 访问:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
如果需要开放一段连续的端口,例如本地测试用的 8000 到 8010,可以用冒号写法:sudo ufw allow 8000:8010/tcp。此外 UFW 同时管理 IPv4 和 IPv6 规则,如果服务器只使用 IPv4,可以编辑 /etc/default/ufw 将 IPV6 的值改为 no,减少无效规则,这一步不是必须的,保持默认即可。

第三步:按 IP 和网段精细放行与限制
开放端口只是第一步,更安全的做法是对敏感服务做 IP 白名单。例如 MySQL 的 3306 端口只允许公司服务器访问,其他人一律拒绝:
# 仅允许指定 IP 访问 3306
sudo ufw allow from 203.0.113.10 to any port 3306
# 仅允许整个网段访问 PostgreSQL 的 5432
sudo ufw allow from 192.168.1.0/24 to any port 5432
# 直接封禁一个恶意 IP
sudo ufw deny from 45.155.205.233
这里有一个容易踩的坑:UFW 的规则是按添加顺序逐条匹配的,先匹配到的规则先生效。如果先执行了 allow 80/tcp,再执行 deny from 某个 IP,那么来自该 IP 的 80 端口访问会优先命中前面的 allow 规则,封禁就不会生效。正确的做法是先写具体的限制规则,再写通用的放行规则,或者直接用 sudo ufw status numbered 查看规则顺序后调整。
典型应用场景:phpMyAdmin、Redis 桌面管理器、Windows 远程桌面(3389)这类不面向公众的服务,都可以用"allow from 指定 IP to any port 端口号"的方式保护起来,既不影响自己使用,又能避免暴露在公网上被扫描攻击。
第四步:规则查看、删除、重置与启用前检查
规则配好后,建议先用带序号的列表全面检查一遍,确认 SSH 放行规则存在、没有多余或顺序错误的规则:
sudo ufw status numbered
删除规则有两种方式:按规则内容删除,例如 sudo ufw delete allow 80/tcp;或按序号删除,例如 sudo ufw delete 3(删除上一步列表中编号为 3 的规则)。如果规则变动较频繁,修改后执行 sudo ufw reload 重新加载即可,不需要重启服务器。确认规则无误后,正式启用防火墙:
sudo ufw enable
sudo ufw status verbose
启用前还有一项重要的安全检查,强烈建议按顺序核对:第一,SSH 端口(或 OpenSSH 应用规则)已在放行列表中;第二,如果使用云服务器,云厂商控制台的"安全组"是否也放行了对应端口——安全组在云平台侧生效,UFW 管不到它,两层都放行才能真正访问;第三,启用后不要急着关闭当前终端,先新开一个 SSH 窗口验证能正常登录,确认无误后再关旧会话;第四,生产环境的变更尽量安排在业务低峰期,并提前通过云控制台的 VNC 登录留一条应急通道,它不受服务器防火墙影响。
常见问题与总结
问题一:启用 UFW 后 SSH 突然连不上了怎么办?不要慌张,通过云厂商控制台的 VNC 网页终端登录(该通道不经过服务器防火墙),执行 sudo ufw status 查看规则,确认 SSH 端口已放行;如果一时定位不清,可先执行 sudo ufw disable 临时关闭防火墙恢复访问,补上规则后再重新 enable。
问题二:规则明明加了,端口还是不通?按三层排查:先看云控制台安全组是否放行该端口;再用 ss -lntp | grep 端口号 确认程序本身监听在 0.0.0.0 而不是 127.0.0.1;最后用 sudo ufw status numbered 确认规则存在且没有被后面的 deny 规则抢先匹配。UFW 只能控制本机流量,安全组的问题要在云平台解决。
问题三:UFW 和宝塔面板能一起用吗?不建议。宝塔面板会自行写入 iptables 规则,与 UFW 同时启用会出现规则互相覆盖、难以排查的问题。建议二选一:习惯图形界面就用宝塔的防火墙插件,习惯命令行就用 UFW;从宝塔切换到 UFW 前,先在宝塔里清空它添加的端口规则,避免两套规则并存。
问题四:如何临时关闭防火墙做测试?sudo ufw disable 只是停用规则,已添加的规则全部保留,之后 sudo ufw enable 即可恢复。而 sudo ufw reset 会清空所有自定义规则并恢复默认设置,执行前建议先 sudo ufw status numbered 把现有规则截图留存,以便恢复。
总结:UFW 的价值在于用最简单的命令把服务器端口收进可控状态——默认拒绝入站、按需放行、敏感服务绑定来源 IP。整个配置过程十分钟内即可完成,真正需要注意的是启用前的 SSH 与安全组检查,以及保留一条应急登录通道。按本文步骤操作,就可以在保证业务正常访问的前提下,把服务器的暴露面降到最低。











暂无评论内容