跳转到内容

PVE 防火墙:三级开关与默认策略 ​

Linux Bridge 是什么里提过一句:PVE 防火墙有三层开关,是与的关系。这篇把三层分别在哪、默认策略是什么、怎么安全地打开讲透。

打开总开关前必须确认放行规则,并留好退路

数据中心级防火墙默认是完全禁用的(enable: 0)。一旦打开,未被规则放行的入站流量默认会被丢弃。如果没有提前确认管理端口(Web UI 的 8006、SSH 的 22)被放行,你会把自己关在门外。

影响范围:打开数据中心级开关,影响集群内所有节点和已开防火墙的客户机;只打开某个客户机的开关,只影响这台客户机。

前置条件:打开任何一级之前,先确认放行规则列表无误,并保证你有以下至少一条退路:物理控制台、IPMI/BMC,或者机器就在手边。

回退方法:在物理控制台或 IPMI 里执行 systemctl stop pve-firewall(或对应 proxmox-firewall,见 nftables 后端),或者把 /etc/pve/firewall/cluster.fw 里的 enable 改回 0 再重载。具体自救流程见防火墙把自己锁在门外了怎么办。

三层开关,缺一不可 ​

层级配置文件默认状态作用范围
数据中心/etc/pve/firewall/cluster.fwenable: 0(完全禁用)集群范围的总开关
节点(主机)/etc/pve/nodes/<节点名>/host.fwenable: 1(但数据中心总开关没开时不生效)保护宿主机自己
客户机/etc/pve/firewall/<vmid>.fw,加上每块网卡自己的 Firewall 勾选enable: 0保护单台虚拟机/容器

三层是与的关系:数据中心关着,节点和客户机的规则都不生效;客户机总开关开了,但某块网卡的 Firewall 勾选框没打开,那块网卡照样不过滤。网卡开关的细节见客户机网络。

这也是为什么很多人「防火墙开了却没用」

最常见的误解是「只要在数据中心页面点了启用,所有东西都受保护了」。实际上还需要在每一层分别确认状态,尤其是客户机层面默认是关闭的,需要显式打开。

默认策略 ​

启用后,各级都可以设置入站/出站(以及客户机的转发)流量的默认策略:

层级可设置的策略取值
数据中心policy_in / policy_outACCEPT / DROP / REJECT
数据中心policy_forwardACCEPT / DROP
客户机policy_in / policy_outACCEPT / DROP / REJECT

官方文档明确提示:一旦启用防火墙,到所有主机的流量默认会被阻断,具体阻断到什么程度取决于你设置的策略值。客户机层面即使策略是 DROP/REJECT,PVE 也会自动放行一些必要的流量(DHCP、NDP、路由通告,以及 MAC/IP 过滤所需的流量),但这些例外不会延伸到宿主机自己的规则里。

节点层面默认保留的放行规则 ​

打开节点防火墙后,即使策略是 DROP,以下流量在默认情况下仍然被自动放行,用来保证你不会立刻失联(具体列表以你版本的官方文档为准):

  • 回环流量、已建立的连接、IGMP。
  • 来自 management IP 集合里地址的:Web UI(TCP 8006)、VNC(TCP 5900-5999)、SPICE(TCP 3128)、SSH(TCP 22)、迁移(TCP 60000-60050)。
  • 集群内部:corosync(UDP 5405-5412)及集群网络内的组播流量。
  • 部分 ICMP 类型(如目标不可达、超时等)。

「默认保留放行」不是万能保险

这份自动放行列表基于一个前提:你的管理地址已经在 management 这个 IP 集合或 local_network 别名的范围内。如果你从一个不在范围内的地址访问(比如换了一个新的管理网段),默认放行规则不会覆盖到你,一样会被关在门外。启用前先确认这一点。

安全打开的顺序 ​

  1. 先确认自己是谁:从当前用来管理这台机器的地址,检查它是否已经落在 local_network(自动生成的别名)或后续要配置的 management IP 集合范围内。
  2. 准备一个 SSH/控制台会话留着不关:官方建议在打开防火墙前,保持一个已经登录的会话,即使配置出问题,这个已建立的连接通常不受新规则影响,可以用来修复。
  3. 先在节点层面配好放行规则,确认规则列表无误。
  4. 最后再打开数据中心总开关(enable: 1)。
  5. 给客户机开防火墙时,同样遵循「先加规则,再打开总开关」的顺序,并且记得网卡上的 Firewall 勾选框也要打开。

检查结果 ​

sh
# 宿主机 shell,查看当前生效的防火墙状态(legacy iptables 后端)
pve-firewall status

# 查看本机被识别的 local_network 范围
pve-firewall localnet

# 查看实际生成的 iptables 规则
iptables-save | less

打开数据中心开关之后,不要立刻关闭当前的管理会话。用另一个终端或另一台设备重新发起一次连接(Web UI 和 SSH 都试一遍),确认新连接也能进来,再放心地断开旧会话。

常见问题 ​

打开数据中心开关后,Web UI 直接打不开了。 大概率是当前访问的 IP 不在放行范围内。按防火墙把自己锁在门外了怎么办里的步骤,通过物理控制台或 IPMI 关闭防火墙服务,重新检查规则。

客户机总开关和网卡开关都打开了,但规则好像没生效。 确认客户机的 .fw 文件里确实定义了规则,并检查策略值:如果 policy_in 仍是默认的 ACCEPT,看起来就像规则没起作用(因为默认本来就放行)。

为什么宿主机层面能自动放行 SSH,客户机不行。 节点层面的默认放行例外是 PVE 为了防止管理员自锁而内置的,客户机层面没有这个机制,客户机的每一条放行规则都需要显式配置。

iptables-save 里看到的规则和界面上配置的对不上。 检查是否已经切换到了 nftables 后端(proxmox-firewall),切换后规则要用 nft list ruleset 查看,不再体现在 iptables-save 里,细节见防火墙规则:安全组、IP 集合、别名与 nftables 后端。

参考资料 ​

延伸阅读 ​

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