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 | 家目录下的备份文件 |
关键点:
- 它不是”启动命令”,而是”导出命令”。 执行时就把当前状态写进文件,屏幕上不显示是正常的——内容全进文件了。
- 想看内容得用
cat ~/ufw-rules-backup.txt。 >是覆盖,追加要用>>。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/tcp | enable 后默认拒绝所有入站,不放行 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 额外显示默认策略、日志级别,信息更全,备份更完整。
七、几个容易踩的坑
inactive时ufw status看不到规则,不代表没配过规则。 规则在/etc/ufw/user.rules里,要用cat读。ufw enable前忘记放行 SSH。 这是最致命的,远程机器会直接失联,只能靠云控制台/VNC 救援。allow 80不写/tcp会同时放行 TCP 和 UDP,通常没必要。- 把
ufw-user-limit*那几条当成”自己的规则”。 它们是 UFW 自带模板,装了就存在。 >覆盖、>>追加。 备份脚本里写错会丢数据。- 备份
status文本 ≠ 可恢复的备份。 真要恢复,备份/etc/ufw/user.rules和user6.rules。
八、总结
sudo ufw status verbose > ~/ufw-rules-backup.txt是一条导出命令,不是启动命令;屏幕无输出是正常的。- 只有 UFW 处于
active时,status verbose才会显示规则,备份才有内容。 - 这台
ubuphy001当前是inactive+ 零规则:user.rules里只有 UFW 自带的 3 条限速模板,user6.rules全空,ufw-user-input链为空。 - 想查规则,不依赖
status,直接cat /etc/ufw/user.rules或用iptables -S | grep ufw。 - 想让防火墙真正生效并能备份,顺序是:放行 SSH → 放行其他服务 → enable → status → 备份,核心逻辑就是”先确保自己不被关在门外,再让规则生效,最后才有内容可查可备份”。
一句话收尾:你贴出的这两段输出,不是”有哪些规则”的答案,而是”确认没有任何规则”的证据。 这不是命令用错了,而是这台机器本来就干净——UFW 没启用,也没配过规则,所以查不到任何东西完全正常。