在 Proxmox VE (PVE) 环境中,ufw 和 PVE 自带的防火墙(基于 iptables/nftables)本质上是在争夺对 Linux 内核数据包过滤规则的控制权。
核心结论:为了系统的稳定性、网络的可追溯性和管理的便捷性,强烈建议“二选一”,并且在 PVE 环境下,首选 PVE 自带防火墙。
以下是避免冲突的深度建议和具体操作方案:
1. 为什么不建议两者并存?
- 执行顺序混乱:
ufw和 PVE 防火墙都会向iptables插入链(Chains)。如果ufw处于“默认拒绝”状态,它可能会在 PVE 规则生效前就拦截掉关键流量(如集群心跳)。 - 管理冲突: 你在 PVE 面板上放行了端口,但发现依然无法访问,结果是因为后台
ufw悄悄拦截了它。这会极大增加故障排查的难度。 - 桥接流量处理: PVE 防火墙专门为处理网桥(Linux Bridge)和虚拟机/容器流量进行了优化,而
ufw在处理复杂的桥接和转发规则时表现较弱。
2. 推荐方案:停用 UFW,全面启用 PVE 防火墙
PVE 的防火墙不仅可以管理宿主机(Node),还可以精确控制每一个虚拟机(VM)和容器(CT),是集群级、自顶向下的管理模式。
操作步骤:
- 迁移规则: 将你在
ufw中设置的自定义规则,在 PVE Web 界面的 数据中心 -> 防火墙 或 节点 -> 防火墙 中重新创建。 禁用 UFW:
sudo ufw disable sudo systemctl stop ufw sudo systemctl disable ufw- 开启 PVE 防火墙: 在 Web UI 中确保
Datacenter -> Firewall -> Enable设置为Yes。
3. 进阶方案:如果你必须使用 UFW(不推荐)
如果你因为特殊习惯或特定应用依赖必须运行 ufw,请务必遵循以下原则以防“锁死”服务器:
A. 保护集群核心服务
PVE 集群依赖特定端口进行通信(如 Corosync, API, SSH)。在启用 ufw 之前,必须先手动放行:
- Web UI/API: 8006 (TCP)
- SSH: 22 (TCP)
- 集群通信 (Corosync): 5405 (UDP) - 若有集群,此项必选,否则节点会掉线
- 存储通信: 根据你的存储类型(Ceph, NFS, iSCSI)放行对应端口。
B. 调整 UFW 的默认行为
为了不干扰 PVE 的网桥转发逻辑,你需要修改 ufw 的转发策略:
- 编辑文件:
/etc/default/ufw - 将
DEFAULT_FORWARD_POLICY改为"ACCEPT":
DEFAULT_FORWARD_POLICY="ACCEPT"
- 重载
ufw:sudo ufw reload
4. 冲突排查工具箱
如果你怀疑规则发生了冲突,可以使用以下命令查看内核中实际生效的规则“全貌”:
查看当前的 iptables 链(含 PVE 生成的规则):
iptables -L -n -v | less
查找带有 PVEFW- 前缀的链,那是 PVE 生成的;查找 ufw- 前缀的是 ufw 生成的。
查看 nftables 规则(新版 PVE 默认):
nft list ruleset
💡 总结建议
作为一名 PVE 用户,你应该把 PVE 防火墙视为“一等公民”。
- 宿主机安全: 在
节点 -> 防火墙里配置。 - 虚拟机/容器安全: 在
VM/CT -> 防火墙里配置。 - 批量管理: 利用
Security Groups(安全组)功能。
强行同时运行 ufw 就像是在一辆车上装了两个方向盘,即便能走,迟早也会在紧急时刻让你措手不及。直接禁用 ufw,在 PVE UI 里配置规则,你的运维生活会轻松得多。