
UFW(Uncomplicated Firewall,简易防火墙)是一个用于管理 Linux 防火墙(netfilter)规则的用户友好型前端。它是 Ubuntu 默认的防火墙配置工具,也可用于 Debian 等其他 Linux 发行版。
本指南介绍如何使用命令行列出和删除 UFW 防火墙规则。
快速参考
如需可打印的快速参考,请参阅 UFW 速查表。
| Task | Command |
|---|---|
| 显示防火墙状态与规则 | sudo ufw status |
| 显示包含日志级别与默认策略的状态 | sudo ufw status verbose |
| 显示带编号的规则 | sudo ufw status numbered |
| 显示已保存规则的等价命令 | sudo ufw show added |
| 显示监听端口及匹配的规则 | sudo ufw show listening |
| 按编号删除规则 | sudo ufw delete NUMBER |
| 按编号删除规则(非交互式) | sudo ufw --force delete NUMBER |
| 按规则定义删除 | sudo ufw delete allow 80/tcp |
| 重置防火墙并移除所有规则 | sudo ufw reset |
前提条件
运行 UFW 命令的用户必须是具有 sudo 权限的用户。
列出 UFW 规则
要检查 UFW 状态并列出所有活动规则,请运行:
sudo ufw status
如果 UFW 已禁用,输出如下:
Status: inactive
如果 UFW 处于活动状态,输出会打印所有活动的防火墙规则:
Status: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere 22/tcp (v6) ALLOW Anywhere (v6)
详细信息输出
要显示日志级别、默认策略和新建配置文件等附加信息,请使用 status verbose:
sudo ufw status verbose
Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere 22/tcp (v6) ALLOW IN Anywhere (v6)
编号输出
使用 status numbered 可以显示每条规则的顺序和编号。当你需要按编号删除特定规则时,这非常有用:
sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] 8069/tcp ALLOW IN Anywhere
使用 ufw show 显示规则
status 命令报告正在运行的防火墙。show 命令则打印关于防火墙配置本身的报告。其中最有用的一个是 added,它会列出与你所保存规则等价的命令:
sudo ufw show added
Added user rules (see 'ufw status' for running firewall): ufw allow 22/tcp ufw allow 80/tcp ufw allow 443/tcp
每一行规则都是一个完整的命令,因此你可以复制其中一行,在另一台机器上重建该规则。UFW 会对规则进行规范化,因此这些命令可能看起来与你最初输入的不太一样。它也不会保留原始的命令顺序,而是使用一种等价排序,将仅 IPv6 的规则排在其他规则之后。
该报告读取的是你添加的规则,而非实时生效的 netfilter 表,这意味着即使 UFW 处于非活动状态、而 ufw status 只报告 Status: inactive 时,它仍然会列出你的规则。
show 命令接受一个报告名称:
• added - 已保存规则的等价命令 • listening - 处于监听状态的端口及适用于它们的规则 • raw - 以原始 iptables 格式呈现的完整防火墙 • builtins - 内置链 • before-rules - 在用户规则之前应用的规则 • user-rules - 用户规则 • after-rules - 在用户规则之后应用的规则 • logging-rules - 日志规则
要了解哪些服务是暴露的,以及防火墙如何处理它们,请使用 listening 报告:
sudo ufw show listening
它会打印每个监听端口,以及其接口地址和背后的可执行程序,随后列出任何与之匹配的 UFW 规则。除 added 和 listening 之外的所有报告都是原始 iptables 输出,因此它们反映的是正在运行的防火墙,而非你保存的配置。
删除 UFW 规则
UFW 没有 remove 子命令。对应的命令是 ufw delete,它有两种使用方式:
• 按规则编号:当规则较多时更方便。先列出带编号的规则,再指定要删除的编号。• 按规则定义:指定完整的规则定义来移除它。
按规则编号删除
首先,列出带编号的规则:
sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] 8069/tcp ALLOW IN Anywhere
要删除第 4 号规则(端口 8069),请运行:
sudo ufw delete
4
UFW 会在删除前要求确认:
Deleting: allow 8069/tcp Proceed with operation (y|n)? y Rule deleted
输入 y 并按回车键确认。每当你移除一条规则,其余规则的编号都会发生偏移。因此在删除下一条规则之前,务必重新列出规则。
启用 IPv6 后,一条通用规则可能分别拥有 IPv4 和 IPv6 两个条目。按编号删除只会移除所选条目。若要用一条命令同时移除两个条目,请按规则定义删除该通用规则。
如果你需要非交互式删除(用于脚本),请使用:
sudo ufw --force delete
4
按规则定义删除
你也可以指定规则的完整定义来删除它。这种方式无需先列出带编号的规则。
例如,如果你之前添加了一条允许 2222 端口的规则:
sudo ufw allow
2222
你可以在 ufw delete 后重复该规则来将其删除:
sudo ufw delete allow
2222
这也适用于更具体的规则。要删除一条允许来自特定子网的 80 端口 TCP 流量的规则:
sudo ufw delete allow from 192.168.1.0/24 to any port
80
proto tcp
重置 UFW 并移除所有规则
重置 UFW 会禁用防火墙并移除所有活动规则。当你想撤销所有更改并从干净的配置重新开始时会很有用:
sudo ufw reset
UFW 在重置前会为当前规则创建备份文件。备份文件的路径会显示在输出中。
故障排查
“Could not delete non-existent rule”(无法删除不存在的规则):UFW 找不到消息中所示 IP 版本对应的匹配规则。运行 sudo ufw show added 查看已保存的规则命令,并在 ufw delete 后重复匹配的完整定义。启用 IPv6 后,删除一条通用规则会同时尝试 IPv4 和 IPv6 的删除,因此如果缺少对应的 IPv6 规则,在 IPv4 删除成功后可能会紧接着出现 “Could not delete non-existent rule (v6)”。
错误:Could not find rule 'N'(找不到规则 'N'):你传给 ufw delete 的编号超出了范围。每次删除后规则都会重新编号,因此在重试前请用 sudo ufw status numbered 重新列出它们。
错误:Could not find a profile matching 'NAME'(找不到匹配 'NAME' 的配置档):应用程序配置档名称有误。该错误来自配置档查找而非规则列表。运行 sudo ufw app list 查看已安装的配置档名称,并使用准确的名称重试。
规则编号在删除后发生变化:UFW 会在每次删除后对所有规则重新编号。在删除下一条规则之前,务必再次运行 sudo ufw status numbered。
删除规则后被锁定 SSH 访问:如果你不小心删除了 SSH 规则,需要控制台或带外方式访问服务器。连接成功后,使用 sudo ufw allow 22/tcp 然后 sudo ufw enable 重新启用 SSH 访问。
ufw: command not found(找不到命令):UFW 未安装。在 Ubuntu、Debian 及其衍生版上使用 sudo apt install ufw 安装,在 Fedora 上使用 sudo dnf install ufw 安装。RHEL 兼容系统通常使用 firewalld;如果你在那里选择 UFW,可能需要先启用 EPEL 或其他合适的软件源。
常见问题
如何只列出 IPv4 或 IPv6 规则?UFW 没有内置的 IP 版本过滤器。你可以将输出通过管道传给 grep:使用 sudo ufw status | grep -v '(v6)' 只显示 IPv4 规则,或使用 sudo ufw status | grep '(v6)' 只显示 IPv6 规则。
我可以一次删除多条规则吗?UFW 每条命令只删除一条规则。当按编号删除多条规则时,请按降序删除,这样重新编号就不会影响你尚未处理到的规则。要清空全部,请使用 sudo ufw reset。
删除规则时,已有连接会怎样?在默认的 UFW 规则下,删除一条规则时,已经建立的连接不会被立即断开。新的连接会根据剩余规则与默认策略进行评估。删除一条允许(allow)规则可能会阻断新的连接,而删除一条拒绝(deny)规则则可能会放行它们。
如何在指定位置插入规则?使用 sudo ufw insert NUMBER RULE。例如,sudo ufw insert 1 allow from 10.0.0.0/8 会将规则插入到位置 1,即所有其他规则之前。
ufw disable 与 ufw reset 有什么区别?ufw disable 会关闭防火墙,但保留所有规则不变。ufw reset 会禁用防火墙并删除所有规则,恢复到默认配置。
结论
你可以使用 sudo ufw status numbered 列出 UFW 防火墙规则,并按编号或按定义将其删除。删除前务必核对带编号的规则列表,并注意不要在远程服务器上误删你的 SSH 访问规则。