跳至正文
老丹的足迹 —— 代码写给机器,游记写给自己,感悟写给时间
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面

Ubuntu 服务器 UFW 防火墙排查实录:从一条备份命令到看清全部规则

事情的起点是一条看起来很简单、很标准的备份命令:

sudo ufw status verbose > ~/ufw-rules-backup.txt

执行后,终端上什么也没显示。于是产生了一个疑问:“这个得等启动之后才能看到吧?”

顺着这个疑问往下查,最终搞清楚了 UFW 的工作机制、规则存放位置、如何查看规则,以及为什么这台机器”看起来什么都没有”。本文把整个过程整理成一篇完整的排查笔记。

一、先澄清那条备份命令本身

sudo ufw status verbose > ~/ufw-rules-backup.txt

拆开看:

片段含义
sudo以 root 权限执行,查询防火墙必须提权
ufw status verbose详细模式查询 UFW 状态和规则
>标准输出重定向,覆盖写入文件
~/ufw-rules-backup.txt家目录下的备份文件

关键点:

  1. 它不是”启动命令”,而是”导出命令”。 执行时就把当前状态写进文件,屏幕上不显示是正常的——内容全进文件了。
  2. 想看内容得用 cat ~/ufw-rules-backup.txt。
  3. > 是覆盖,追加要用 >>。
  4. sudo cmd > file 中,重定向是**当前 shell(普通用户)**做的,文件属主通常是你;若家目录写不进去,改用 sudo ufw status verbose | sudo tee ~/ufw-rules-backup.txt。

核心结论:这条命令能不能备份到”有意义的规则”,取决于 UFW 是否处于 active 状态。

二、实际执行:UFW 是关闭的

在这台 ubuphy001 上执行:

richard@ubuphy001:~$ sudo ufw status verbose
Status: inactive

inactive 意味着:

  • UFW 没有启用,防火墙规则没有加载进内核。
  • 此时 ufw status 不会展示任何规则,只输出 Status: inactive。
  • 因此那条备份命令跑出来的文件,内容只有这一行,等于没备份到任何东西。

这里就回答了最初的疑问:对,UFW 必须先启用,ufw status verbose 才会显示规则,备份才有意义。

但要注意一个容易混淆的点:“UFW 没启用”不等于”没有配置过规则”。规则可能存在配置文件里,只是没加载、不显示。所以需要进一步去读规则源文件。

三、绕过 status,直接看规则文件

UFW 的规则持久化在 /etc/ufw/ 下,主要两个文件:

sudo cat /etc/ufw/user.rules     # IPv4 规则
sudo cat /etc/ufw/user6.rules    # IPv6 规则

3.1 IPv4 文件的实际输出

*filter
:ufw-user-input - [0:0]
:ufw-user-output - [0:0]
:ufw-user-forward - [0:0]
:ufw-user-limit - [0:0]
:ufw-user-limit-accept - [0:0]
### RULES ###
-A ufw-user-limit -m limit --limit 3/minute -j LOG --log-prefix "[UFW LIMIT BLOCK] "
-A ufw-user-limit -j REJECT
-A ufw-user-limit-accept -j ACCEPT
COMMIT

逐段解读:

(1)*filter
声明使用 iptables 的 filter 表,负责数据包过滤。整个文件本质是一段可被 iptables-restore 读取的脚本。

(2)以 : 开头的五行 —— 链声明,不是规则

:ufw-user-input - [0:0]
:ufw-user-output - [0:0]
:ufw-user-forward - [0:0]
:ufw-user-limit - [0:0]
:ufw-user-limit-accept - [0:0]

格式为 :链名 - [包计数:字节计数],[0:0] 表示计数器清零(这是静态文件,不是运行时状态)。各链含义:

链名作用
ufw-user-input存放 ufw allow/deny 产生的入站规则
ufw-user-output出站规则
ufw-user-forward转发规则(网关/路由场景)
ufw-user-limit限速规则匹配后的处理链
ufw-user-limit-accept限速规则中”放行”部分对应的链

关键:这只是声明链存在,链里有没有规则是另一回事。

(3)### RULES ###
UFW 自己的分隔注释,标记”下面开始是真正的规则”。

(4)三条实际内容

-A ufw-user-limit -m limit --limit 3/minute -j LOG --log-prefix "[UFW LIMIT BLOCK] "
-A ufw-user-limit -j REJECT
-A ufw-user-limit-accept -j ACCEPT
  • 第一条:追加到 ufw-user-limit 链,用 limit 模块限制每分钟最多匹配 3 次,匹配到就记日志,前缀 [UFW LIMIT BLOCK]。
  • 第二条:同链,动作 REJECT(拒绝并回错误)。与上一条配合——超速的包记日志后拒绝。
  • 第三条:在 ufw-user-limit-accept 链放行,供 ufw limit 这类限速规则使用。

(5)COMMIT
规则段结束,提交给内核,是 iptables-restore 语法的必需结尾。

这段说明了什么?

### RULES ### 下面只有 3 条”限速模板”,没有任何 -A ufw-user-input ... 规则。也就是说:

  • ufw-user-input 链是空的 → 没有配置任何 allow/deny 规则。
  • 那 3 条 ufw-user-limit* 是 UFW 安装时自带的固定模板,跟”你配过什么”无关。

3.2 IPv6 文件的实际输出

*filter
:ufw6-user-input - [0:0]
:ufw6-user-output - [0:0]
:ufw6-user-forward - [0:0]
### RULES ###
COMMIT

### RULES ### 和 COMMIT 之间什么都没有——IPv6 这边零规则,纯空壳。

3.3 综合结论

项目状态
UFW 服务inactive(未启用)
IPv4 自定义规则无
IPv6 自定义规则无
ufw-user-input 链空
文件里那 3 条 -A ufw-user-limit*UFW 自带模板,不是你的规则

这台机器从没配过任何 UFW 规则。 之前备份出来只有 Status: inactive,完全正常,本来就没东西可备份。

四、如何区分”模板”和”你的规则”

方法很简单,看 ### RULES ### 之后的行:

  • 你的规则会操作 ufw-user-input:-A ufw-user-input -p tcp --dport 22 -j ACCEPT
  • 模板只操作 ufw-user-limit / ufw-user-limit-accept:-A ufw-user-limit ... -A ufw-user-limit-accept ...

只要没看到 -A ufw-user-input ...,就说明没有入站规则。

五、查看 UFW 规则的几种方式对比

方法inactive 可用显示内容
sudo ufw status verbose❌(只显示 inactive)启用后才有意义
sudo cat /etc/ufw/user.rules✅原始规则(最全)
sudo cat /etc/ufw/user6.rules✅IPv6 原始规则
sudo iptables -L ufw-user-input -n --line-numbers✅已写入内核的入站规则
sudo iptables -S | grep ufw✅规则的可复用语法
ls /etc/ufw/applications.d/✅应用 profile 模板

提示:iptables -L 加 -n 不解析域名/端口名,更快更准;加 --line-numbers 带行号便于定位。

六、如果要让这台机器”有规则可查、可备份”

按正确顺序操作(远程 SSH 操作时第 1 步绝不能漏):

# 1. 先放行 SSH,防止 enable 后把自己关在门外
sudo ufw allow 22/tcp

# 2. 放行其他真正需要的服务
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 3. 启用(这一步规则才加载进内核)
sudo ufw enable

# 4. 查看
sudo ufw status verbose

# 5. 备份(人类可读文本)
sudo ufw status verbose > ~/ufw-rules-backup.txt

# 6. 备份(可直接恢复的规则源文件)
sudo cp /etc/ufw/user.rules  ~/user.rules.bak
sudo cp /etc/ufw/user6.rules ~/user6.rules.bak

# 7. 验证备份内容
cat ~/ufw-rules-backup.txt

每一步为什么这么排

顺序原因
先 allow 22/tcpenable 后默认拒绝所有入站,不放行 SSH 会导致远程连接永久断开
先 allow 再 enable规则先写好,启用时一并加载,避免中间空窗
先 enable 再 status/备份inactive 时 status 只输出 Status: inactive,备份无意义
备份分两种status 文本便于查看;user.rules 文件便于恢复

启用后会看到什么

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)

verbose 与不加的区别:ufw status 只列规则;ufw status verbose 额外显示默认策略、日志级别,信息更全,备份更完整。

七、几个容易踩的坑

  1. inactive 时 ufw status 看不到规则,不代表没配过规则。 规则在 /etc/ufw/user.rules 里,要用 cat 读。
  2. ufw enable 前忘记放行 SSH。 这是最致命的,远程机器会直接失联,只能靠云控制台/VNC 救援。
  3. allow 80 不写 /tcp 会同时放行 TCP 和 UDP,通常没必要。
  4. 把 ufw-user-limit* 那几条当成”自己的规则”。 它们是 UFW 自带模板,装了就存在。
  5. > 覆盖、>> 追加。 备份脚本里写错会丢数据。
  6. 备份 status 文本 ≠ 可恢复的备份。 真要恢复,备份 /etc/ufw/user.rules 和 user6.rules。

八、总结

  1. sudo ufw status verbose > ~/ufw-rules-backup.txt 是一条导出命令,不是启动命令;屏幕无输出是正常的。
  2. 只有 UFW 处于 active 时,status verbose 才会显示规则,备份才有内容。
  3. 这台 ubuphy001 当前是 inactive + 零规则:user.rules 里只有 UFW 自带的 3 条限速模板,user6.rules 全空,ufw-user-input 链为空。
  4. 想查规则,不依赖 status,直接 cat /etc/ufw/user.rules 或用 iptables -S | grep ufw。
  5. 想让防火墙真正生效并能备份,顺序是:放行 SSH → 放行其他服务 → enable → status → 备份,核心逻辑就是”先确保自己不被关在门外,再让规则生效,最后才有内容可查可备份”。

一句话收尾:你贴出的这两段输出,不是”有哪些规则”的答案,而是”确认没有任何规则”的证据。 这不是命令用错了,而是这台机器本来就干净——UFW 没启用,也没配过规则,所以查不到任何东西完全正常。

作者

老丹

关注我
其他文章
上一个

firewalld 防火墙全面详解:从核心概念到高级实战

下一个

在 Ubuntu 上用 Docker Compose 部署 Nextcloud AIO

关于博主

    老丹是一名C/C++后台开发工程师,信奉“无抽象不设计,无性能不生产”。

  • 技术栈:Modern C++、Linux环境编程、多线程/并发、网络编程等。
  • 信条:能用constexpr解决的问题绝不拖到运行时,能靠RAII避免的泄漏绝不写析构。
  • 正在填坑:从解封装到渲染的C++全链路实现,正在驯服FFmpeg与H.264/H.265。
  • 输出原则:这里的每一段代码都经过-Wall -Wextra -Werror -O2的洗礼。

近期文章

  • 在 Windows 里养一只 Linux:WSL 完整指南 2026年10月24日
  • Paho MQTT C 与 C++ 客户端库完全指南:从概念到 Ubuntu 26.04 下的编译、安装与使用 2026年10月23日
  • Mosquitto $SYS 主题详解:Broker 自监控指南 2026年10月23日
  • 应用级 MQTT 服务搭建完全指南:Mosquitto + 宿主机 Nginx 2026年10月22日
  • OpenWrt 固件签名三剑客:usign、ucert 与 fwtool 深度解析 2026年10月21日

文章分类

  • C/C++开发 (22)
  • Docker容器 (5)
  • Linux工具包 (21)
  • Linux服务配置 (53)
  • Linux系统 (16)
  • MQTT技术 (6)
  • OpenWrt路由 (5)
  • Shell脚本 (3)
  • 代码管理 (1)
  • 安防技术 (4)
  • 数据安全 (36)
  • 网络协议 (25)
  • 计算机理论 (23)
  • 问题解决 (3)
  • 防火墙 (6)
  • 音视频技术 (6)
联系我们:📍 地址:中国·广东省深圳市   |   ✉️ 邮箱:support@tanglinux.com   |   💬 QQ:870866607
版权所有:老丹的足迹粤ICP备2026061170号-1       公安备案图标 粤公网安备44030002013274号