跳转到内容

防火墙规则:安全组、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/statussystemctl start/stop/status proxmox-firewall
查看生成的规则iptables-savenft 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 之后感觉「更安全」,但其实规则都没了。 停止服务会移除它生成的全部规则表,等于放行所有流量,不是更安全,而是防护暂时消失,只应作为临时应急手段。

参考资料 ​

延伸阅读 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。