在 Linux 中列出和删除 UFW 防火墙规则

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 访问规则。