外观
防火墙规则:安全组、IP 集合、别名与 nftables 后端
看完三级开关与默认策略,这篇讲怎么高效地写规则——用安全组避免重复劳动,用 IP 集合管理一批地址,以及了解正在从 iptables 迁移到 nftables 的新后端目前是什么状态。
改规则和切换后端都会影响正在运行的流量
新增/删除规则通常即时生效;但切换防火墙后端(iptables ↔ nftables)需要重启受影响的虚拟机和容器才能完全生效,期间这些客户机的网络过滤方式会发生变化。写规则时一个疏忽(比如把默认策略改成 DROP 却忘了放行管理端口)足以让你失去访问。
前置条件:改动前确认有物理控制台或 IPMI 这类不经过网络的退路;先在测试虚拟机或测试安全组上验证规则效果。
回退方法:规则改错了,在控制台上编辑对应的 .fw 文件改回去并 reload;nftables 后端切换出问题,把 host.fw 里的 nftables 值改回 0(或 Web UI 对应位置改成 No)即可切回 legacy 后端。
安全组:把重复规则收进一个模板
多台客户机需要同一套规则(比如「只允许 80/443 进入」)时,逐台写规则既繁琐又容易改漏。安全组(Security Group) 是定义在集群级别的一组规则,可以在任意客户机的规则列表里引用。
在 cluster.fw 里定义:
text
[group webserver]
IN ACCEPT -p tcp -dport 80
IN ACCEPT -p tcp -dport 443在某台客户机的规则里引用:
text
# /etc/pve/firewall/<vmid>.fw
[RULES]
GROUP webserver改安全组的定义会同时影响所有引用它的客户机,这是它的优点(批量维护)也是风险点(改错影响面大)。
IP 集合:管理一批地址
IP 集合(IPSet)用 +名字 的方式在规则里引用,几个内置的名字有特殊含义:
| IP 集合名 | 作用范围 | 用途 |
|---|---|---|
management | 只作用于节点(主机)防火墙,不影响客户机 | 放行 Web UI、VNC、SPICE、SSH 的来源地址;集群网络会自动加入其中的 cluster_network 别名 |
blacklist | 所有主机和客户机的防火墙 | 列进去的地址会被所有层级一律丢弃 |
ipfilter-net* | 对应编号的客户机网卡 | 给这块网卡设一个地址白名单,防止内部地址被伪造,细节见客户机网络 |
创建自定义集合并在规则里引用:
text
# cluster.fw
[IPSET trusted-admins]
203.0.113.10
203.0.113.0/28
[RULES]
IN ACCEPT -source +trusted-admins -dport 8006别名:给地址起个名字
别名(Alias)把一个地址或网段和一个名字绑定,可以在 IP 集合和规则的 source/dest 里直接引用。PVE 会自动创建一个 local_network 别名,代表当前检测到的本地网段,节点防火墙用它来判断哪些流量算「集群内部」。需要覆盖它时(比如宿主机直接暴露在公网,自动检测的网段不对),在 cluster.fw 的 [ALIASES] 段里显式声明:
text
[ALIASES]
local_network 192.168.1.0/24公网环境下的别名要格外小心
如果这台宿主机直接连接公网(没有前置路由器做 NAT),local_network 判断错了范围可能导致本该只信任内网的规则被放大到公网,这属于网络暴露风险——务必先核实自己的网络拓扑,再决定要不要覆盖这个别名。
nftables 后端:proxmox-firewall
PVE 的防火墙传统上基于 iptables,由 pve-firewall 服务生成规则(日志部分由 pvefw-logger 处理)。官方也在开发一套基于 nftables 的新实现,叫 proxmox-firewall(用 Rust 编写)。
截至可查证的官方资料,nftables 后端仍是技术预览
Proxmox 官方文档和路线图(roadmap)明确写着:nftables 防火墙自 PVE 8.2 起是技术预览(technology preview),路线图里的目标是「逐步推向生产可用,最终取代基于 iptables 的旧实现」,截至目前尚未完成这个替换。是否适合在你的生产环境启用,请对照你安装版本的官方文档和发行说明再决定,不要仅凭第三方文章的结论。
两种后端的差异
| 方面 | legacy(iptables,pve-firewall) | nftables(proxmox-firewall) |
|---|---|---|
| 管理命令 | pve-firewall start/stop/status | systemctl start/stop/status proxmox-firewall |
| 查看生成的规则 | iptables-save | nft list ruleset |
| Linux Bridge 上的实现 | 会为每个客户机接口建一个 fwbrX 桥 | 不会额外建桥 |
| 客户机流量的 REJECT | 支持 | 不支持,REJECT 会退化成 DROP |
| DHCP/NDP/路由通告规则 | 按需生成 | 无论默认策略是什么,总是生成对应放行规则 |
| VNet(SDN)级别防火墙 | 不支持,转发和 VNet 规则会被忽略 | 支持 |
怎么切换
text
# /etc/pve/nodes/<节点名>/host.fw
[OPTIONS]
nftables: 1或者在 Web UI:节点 → 防火墙 → Options → nftables。两种后端读取同一套 .fw 配置文件,切换不需要重写规则,但切换后正在运行的虚拟机和容器需要重启才能让新后端接管其网络过滤。想切回旧实现,把 nftables 的值改回 0(或 Web UI 里改成 No)即可。
安装新后端:
sh
# 宿主机 shell
apt install proxmox-firewall停止 proxmox-firewall 服务会清空它生成的所有规则
systemctl stop proxmox-firewall 会移除它创建的 proxmox-firewall 和 proxmox-firewall-guests 两张 nftables 表,相当于对使用这个后端的流量完全放行。这在排障时是有用的应急手段,但要清楚这意味着防护暂时消失。
检查结果
sh
# legacy 后端,查看生效的 iptables 规则
iptables-save | grep -i <vmid或规则关键字>
# nftables 后端,查看生效的 nftables 规则
nft list ruleset
# 确认 proxmox-firewall 服务状态(切换到 nftables 后端时)
systemctl status proxmox-firewall改完规则后,用一台测试客户机模拟放行和拒绝两种场景(比如从允许的地址和不允许的地址分别发起连接),确认结果符合预期,而不是只看规则列表「看起来对」。
常见问题
安全组改了之后,好几台客户机同时出问题。 这是安全组的固有特性——一次改动影响所有引用它的客户机。改安全组前最好先在一台测试客户机上单独验证。
IP 集合 management 加了地址,但客户机还是连不上。 提醒一下,management 集合只作用于宿主机的防火墙,对客户机的防火墙没有效果,客户机要用自己的规则或 ipfilter-netN 集合。
切到 nftables 后端之后 REJECT 规则好像不起作用了。 这是已知差异,nftables 后端的客户机流量目前只能 DROP,不支持 REJECT,官方文档已明确说明这个限制。
停用 proxmox-firewall 之后感觉「更安全」,但其实规则都没了。 停止服务会移除它生成的全部规则表,等于放行所有流量,不是更安全,而是防护暂时消失,只应作为临时应急手段。
参考资料
- Firewall - Proxmox VE Wiki
- Proxmox VE Administration Guide - Firewall
- proxmox/proxmox-firewall - GitHub
- Proxmox VE Roadmap