Proxmox VE 防火墙提供了一种简单方式来保护 IT 基础设施。你可以为集群中的所有主机设置 防火墙规则,也可以为虚拟机和容器定义规则。防火墙宏、安全组、IP 集和别名等功能可使这项 工作更加轻松。

所有配置都存储在集群文件系统中,而基于 iptables 的防火墙服务会在每个集群节点上运行, 因此可在虚拟机之间提供完整隔离。该系统的分布式特性也比集中式防火墙方案提供更高带宽。

防火墙完整支持 IPv4 和 IPv6。IPv6 支持完全透明,并且默认会同时过滤两种协议的流量。 因此无需为 IPv6 维护另一套规则。

方向与区域

Proxmox VE 防火墙将网络分为多个逻辑区域。可以分别为每个区域定义规则。根据区域不同, 可以为入站、出站或转发流量定义规则。

方向

为区域定义规则时,可以从 3 个方向中选择:

In

进入某个区域的流量。

Out

离开某个区域的流量。

Forward

穿过某个区域的流量。在主机区域中,这可以是路由流量(当主机充当网关或执行 NAT 时)。 在 VNet 级别,这会影响所有经过 VNet 的流量,包括来自/发往桥接网络接口的流量。

Important 当前只有在使用新的 基于 nftables 的 proxmox-firewall 时,才能为转发流量创建规则。任何 forward 规则都会被原有 pve-firewall 忽略,且不会 产生效果!

区域

可以为 3 个不同区域定义防火墙规则:

Host

发往/来自主机的流量,或由主机转发的流量。可以在数据中心级别或主机级别为该区域定义规则。 主机级别规则优先于数据中心级别规则。

VM

发往/来自 VM 或 CT 的流量。不能为转发流量定义规则,只能为入站/出站流量定义规则。

VNet

穿过 SDN VNet 的流量,可以是客户机到客户机,也可以是主机到客户机或反向流量。由于该流量 始终属于转发流量,因此只能创建方向为 forward 的规则。

Important 当前只有在使用新的 基于 nftables 的 proxmox-firewall 时,才能在 VNet 级别创建规则。任何 VNet 级别规则都会被原有 pve-firewall 忽略,且不会 产生效果!

配置文件

所有防火墙相关配置都存储在 proxmox 集群文件系统中。因此,这些文件会自动分发到所有 集群节点,并且 pve-firewall 服务会在配置变更时自动更新底层 iptables 规则。

可以使用 GUI 配置所有内容(即 DatacenterFirewall,或在 NodeFirewall 下配置),也可以使用偏好的编辑器直接编辑配置文件。

防火墙配置文件包含由键值对组成的节。以 # 开头的行和空行视为注释。节以标题行开始, 节名用 [] 包围。

集群范围设置

集群范围的防火墙配置存储在:

/etc/pve/firewall/cluster.fw

该配置可以包含以下节:

[OPTIONS]

用于设置集群范围的防火墙选项。

ebtables: <boolean> (default = 1)

在整个集群范围内启用 ebtables 规则。

enable: <integer> (0 - N)

在整个集群范围内启用或禁用防火墙。

log_ratelimit: [enable=]<1|0> [,burst=<integer>] [,rate=<rate>]

日志限速设置

burst=<integer> (0 - N) (default = 5)

应用速率限制前始终会记录的初始突发包数量

enable=<boolean> (default = 1)

启用或禁用日志速率限制

rate=<rate> (default = 1/second)

突发 bucket 重新填充的频率

policy_forward: <ACCEPT | DROP>

转发策略。

policy_in: <ACCEPT | DROP | REJECT>

入站策略。

policy_out: <ACCEPT | DROP | REJECT>

出站策略。

[RULES]

该节包含适用于所有节点的集群范围防火墙规则。

[IPSET <name>]

集群范围 IP 集定义。

[GROUP <name>]

集群范围安全组定义。

[ALIASES]

集群范围别名定义。

启用防火墙

防火墙默认完全禁用,因此需要在此设置 enable 选项:

[OPTIONS]
# enable firewall (cluster-wide setting, default is disabled)
enable: 1
Important 如果启用防火墙,默认会阻止到所有主机的流量。唯一例外是来自本地网络的 WebGUI(8006) 和 ssh(22)。

如果希望远程管理 Proxmox VE 主机,需要创建规则,允许来自这些远程 IP 的流量访问 Web GUI (端口 8006)。你可能还希望允许 ssh(端口 22),以及可能需要的 SPICE(端口 3128)。

Tip 启用防火墙前,请先打开到某个 Proxmox VE 主机的 SSH 连接。这样即使出现问题,仍然可以访问 该主机。

为简化此任务,也可以创建名为 “management” 的 IPSet,并将所有远程 IP 添加到其中。 这样会创建从远程访问 GUI 所需的所有防火墙规则。

主机专用配置

主机相关配置读取自:

/etc/pve/nodes/<nodename>/host.fw

如果想覆盖 cluster.fw 配置中的规则,这会很有用。也可以提高日志详细程度,并设置 netfilter 相关选项。该配置可以包含以下节:

[OPTIONS]

用于设置主机相关防火墙选项。

enable: <boolean>

启用主机防火墙规则。

log_level_forward: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

转发流量的日志级别。

log_level_in: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

入站流量的日志级别。

log_level_out: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

出站流量的日志级别。

log_nf_conntrack: <boolean> (default = 0)

启用 conntrack 信息日志记录。

ndp: <boolean> (default = 0)

启用 NDP(Neighbor Discovery Protocol,邻居发现协议)。

nf_conntrack_allow_invalid: <boolean> (default = 0)

允许连接跟踪中的无效数据包。

nf_conntrack_helpers: <string> (default = ``)

为特定协议启用 conntrack helper。支持的协议:amanda, ftp, irc, netbios-ns, pptp, sane, sip, snmp, tftp

nf_conntrack_max: <integer> (32768 - N) (default = 262144)

可跟踪连接的最大数量。

nf_conntrack_tcp_timeout_established: <integer> (7875 - N) (default = 432000)

conntrack 已建立连接的超时时间。

nf_conntrack_tcp_timeout_syn_recv: <integer> (30 - 60) (default = 60)

conntrack syn recv 状态的超时时间。

nftables: <boolean> (default = 0)

启用基于 nftables 的防火墙(技术预览)

nosmurfs: <boolean>

启用 SMURFS 过滤器。

protection_synflood: <boolean> (default = 0)

启用 synflood 防护

protection_synflood_burst: <integer> (default = 1000)

按源 IP 统计的 synflood 防护突发速率。

protection_synflood_rate: <integer> (default = 200)

按源 IP 统计的 synflood 防护速率,单位为 syn/sec。

smurf_log_level: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

SMURFS 过滤器的日志级别。

tcp_flags_log_level: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

非法 TCP 标志过滤器的日志级别。

tcpflags: <boolean> (default = 0)

过滤非法的 TCP 标志组合。

[RULES]

该节包含主机专用防火墙规则。

VM/容器配置

VM 防火墙配置读取自:

/etc/pve/firewall/<VMID>.fw

并包含以下数据:

[OPTIONS]

用于设置 VM/容器相关防火墙选项。

dhcp: <boolean> (default = 0)

启用 DHCP。

enable: <boolean> (default = 0)

启用或禁用防火墙规则。

ipfilter: <boolean>

启用默认 IP 过滤器。这等同于为每个接口添加一个空的 ipfilter-net<id> ipset。 此类 ipset 隐式包含合理的默认限制,例如将 IPv6 链路本地地址限制为由接口 MAC 地址派生出的地址。对于容器,已配置的 IP 地址会被隐式加入。

log_level_in: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

入站流量的日志级别。

log_level_out: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

出站流量的日志级别。

macfilter: <boolean> (default = 1)

启用或禁用 MAC 地址过滤器。

ndp: <boolean> (default = 0)

启用 NDP(Neighbor Discovery Protocol)。

policy_in: <ACCEPT | DROP | REJECT>

输入策略。

policy_out: <ACCEPT | DROP | REJECT>

输出策略。

radv: <boolean>

允许发送 Router Advertisement。

[RULES]

该节包含 VM/容器防火墙规则。

[IPSET <name>]

IP 集定义。

[ALIASES]

IP 别名定义。

为 VM 和容器启用防火墙

每个虚拟网络设备都有自己的防火墙启用标志。因此可以为每个接口选择性启用防火墙。 除了通用防火墙 enable 选项之外,还必须设置该标志。

VNet 配置

VNet 相关配置读取自:

/etc/pve/sdn/firewall/<vnet_name>.fw

这可用于在 VNet 级别全局设置防火墙配置,而不必为 VNet 内部的每个 VM 分别设置防火墙规则。 它只能包含 FORWARD 方向的规则,因为这里没有入站或出站流量的概念。这会影响从一个桥接 端口流向另一个桥接端口的所有流量,包括主机接口。

Warning 当前该功能仅适用于新的 基于 nftables 的 proxmox-firewall

由于经过 FORWARD 链的流量是双向的,如果希望流量双向通过,就需要为两个方向都创建规则。 例如,如果要允许某个特定主机的 HTTP 流量,需要创建以下规则:

FORWARD ACCEPT -dest 10.0.0.1 -dport 80
FORWARD ACCEPT -source 10.0.0.1 -sport 80
[OPTIONS]

用于设置 VNet 相关防火墙选项。

enable: <boolean> (default = 0)

启用或禁用防火墙规则。

log_level_forward: <alert | crit | debug | emerg | err | info | nolog | notice | warning>

转发流量的日志级别。

policy_forward: <ACCEPT | DROP>

转发策略。

[RULES]

该节包含 VNet 专用防火墙规则。

防火墙规则

防火墙规则由方向(INOUTFORWARD)和动作(ACCEPTDENYREJECT) 组成。也可以指定宏名称。宏包含预定义的规则和选项集合。可以通过在规则前加 | 来禁用规则。

防火墙规则语法
[RULES]

DIRECTION ACTION [OPTIONS]
|DIRECTION ACTION [OPTIONS] # disabled rule

DIRECTION MACRO(ACTION) [OPTIONS] # use predefined macro

可使用以下选项细化规则匹配。

--dest <string>

限制数据包目标地址。可以引用单个 IP 地址、IP set(+ipsetname)或 IP 别名定义。也可以指定类似 20.34.101.207-201.3.9.99 的地址范围,或 IP 地址和网络列表(条目用逗号分隔)。请不要在此类列表中混用 IPv4 和 IPv6 地址。

--dport <string>

限制 TCP/UDP 目标端口。可以使用 /etc/services 中定义的服务名或简单数字(0-65535)。端口范围可使用 \d+:\d+ 指定,例如 80:85;也可以使用逗号分隔列表匹配多个端口或范围。

--icmp-type <string>

指定 icmp-type。仅当 proto 等于 icmpicmpv6/ipv6-icmp 时有效。

--iface <string>

网络接口名称。对于虚拟机和容器,必须使用网络配置键名(net\d+)。主机相关规则可以使用任意字符串。

--log <alert | crit | debug | emerg | err | info | nolog | notice | warning>

防火墙规则的日志级别。

--proto <string>

IP 协议。可以使用 /etc/protocols 中定义的协议名(tcp/udp)或简单数字。

--source <string>

限制数据包源地址。可以引用单个 IP 地址、IP set(+ipsetname)或 IP 别名定义。也可以指定类似 20.34.101.207-201.3.9.99 的地址范围,或 IP 地址和网络列表(条目用逗号分隔)。请不要在此类列表中混用 IPv4 和 IPv6 地址。

--sport <string>

限制 TCP/UDP 源端口。可以使用 /etc/services 中定义的服务名或简单数字(0-65535)。端口范围可使用 \d+:\d+ 指定,例如 80:85;也可以使用逗号分隔列表匹配多个端口或范围。

下面是一些示例:

[RULES]
IN SSH(ACCEPT) -i net0
IN SSH(ACCEPT) -i net0 # a comment
IN SSH(ACCEPT) -i net0 -source 192.168.2.192 # only allow SSH from 192.168.2.192
IN SSH(ACCEPT) -i net0 -source 10.0.0.1-10.0.0.10 # accept SSH for IP range
IN SSH(ACCEPT) -i net0 -source 10.0.0.1,10.0.0.2,10.0.0.3 #accept ssh for IP list
IN SSH(ACCEPT) -i net0 -source +mynetgroup # accept ssh for ipset mynetgroup
IN SSH(ACCEPT) -i net0 -source myserveralias #accept ssh for alias myserveralias

|IN SSH(ACCEPT) -i net0 # disabled rule

IN  DROP # drop all incoming packages
OUT ACCEPT # accept all outgoing packages

安全组

安全组是在集群级别定义的一组规则,可用于所有 VM 的规则。例如,可以定义一个名为 “webserver” 的组,其中包含打开 httphttps 端口的规则。

# /etc/pve/firewall/cluster.fw

[group webserver]
IN  ACCEPT -p tcp -dport 80
IN  ACCEPT -p tcp -dport 443

然后,可以将该组添加到 VM 的防火墙:

# /etc/pve/firewall/<VMID>.fw

[RULES]
GROUP webserver

IP 别名

IP 别名允许将网络 IP 地址与名称关联。之后可以引用这些名称:

  • 在 IP 集定义中

  • 在防火墙规则的 sourcedest 属性中

标准 IP 别名 local_network

该别名会自动定义。请使用以下命令查看分配的值:

# pve-firewall localnet
local hostname: example
local IP address: 192.168.2.100
network auto detect: 192.168.0.0/20
using detected local_network: 192.168.0.0/20

防火墙会使用此别名自动设置规则,以允许集群通信(corosync、API、SSH)所需的全部流量。

用户可以在 cluster.fw 的别名节中覆盖这些值。如果在公共网络上使用单台主机,最好显式 分配本地 IP 地址:

#  /etc/pve/firewall/cluster.fw
[ALIASES]
local_network 1.2.3.4 # use the single IP address

IP 集

IP 集可用于定义网络和主机组。可以在防火墙规则的 sourcedest 属性中使用 +name 引用它们。

以下示例允许来自 management IP 集的 HTTP 流量。

IN HTTP(ACCEPT) -source +management

标准 IP 集 management

该 IP 集仅适用于主机防火墙(不适用于 VM 防火墙)。这些 IP 被允许执行正常管理任务 (Proxmox VE GUI、VNC、SPICE、SSH)。

本地集群网络会自动添加到此 IP 集(别名 cluster_network),以启用主机间集群通信 (multicast、ssh 等)。

# /etc/pve/firewall/cluster.fw

[IPSET management]
192.168.2.10
192.168.2.10/24

标准 IP 集 blacklist

来自这些 IP 的流量会被每台主机和每个 VM 的防火墙丢弃。

# /etc/pve/firewall/cluster.fw

[IPSET blacklist]
77.240.159.182
213.87.123.0/24

标准 IP 集 ipfilter-net*

这些过滤器属于 VM 的网络接口,主要用于防止 IP 欺骗。如果某个接口存在此类集合,则任何源 IP 与该接口对应 ipfilter 集不匹配的出站流量都会被丢弃。

对于已配置 IP 地址的容器,如果这些集合存在(或通过 VM 防火墙 options 选项卡中的通用 IP Filter 选项启用),它们会隐式包含关联的 IP 地址。

对于虚拟机和容器,它们还会隐式包含标准的、由 MAC 派生的 IPv6 link-local 地址,以允许 邻居发现协议正常工作。

/etc/pve/firewall/<VMID>.fw

[IPSET ipfilter-net0] # only allow specified IPs on net0
192.168.2.10

服务和命令

防火墙会在每个节点上运行两个服务守护进程:

  • pvefw-logger:NFLOG 守护进程(ulogd 替代品)。

  • pve-firewall:更新 iptables 规则

还有一个名为 pve-firewall 的 CLI 命令,可用于启动和停止防火墙服务:

# pve-firewall start
# pve-firewall stop

要获取状态,请使用:

# pve-firewall status

上述命令会读取并编译所有防火墙规则,因此如果防火墙配置包含错误,就会看到警告。

如果想查看生成的 iptables 规则,可以使用:

# iptables-save

默认防火墙规则

默认防火墙配置会过滤以下流量:

数据中心入站/出站 DROP/REJECT

如果防火墙的 input 或 output policy 设置为 DROP 或 REJECT,集群中所有 Proxmox VE 主机仍会允许 以下流量:

  • loopback 接口上的流量

  • 已建立连接

  • 使用 IGMP 协议的流量

  • 从管理主机到端口 8006 的 TCP 流量,用于允许访问 Web 界面

  • 从管理主机到端口范围 5900 到 5999 的 TCP 流量,用于允许 VNC Web 控制台流量

  • 从管理主机到端口 3128 的 TCP 流量,用于连接 SPICE 代理

  • 从管理主机到端口 22 的 TCP 流量,用于允许 ssh 访问

  • 集群网络中到端口 5405-5412 的 UDP 流量,用于 corosync

  • 集群网络中的 UDP multicast 流量

  • ICMP 流量类型 3(Destination Unreachable)、4(congestion control)或 11 (Time Exceeded)

以下流量会被丢弃,即使启用了日志记录也不会记录:

  • 连接状态无效的 TCP 连接

  • 与 corosync 无关的 Broadcast、multicast 和 anycast 流量,即不是通过端口 5405-5412 进入的流量

  • 到端口 43 的 TCP 流量

  • 到端口 135 和 445 的 UDP 流量

  • 到端口范围 137 到 139 的 UDP 流量

  • 源端口为 137、目标端口范围为 1024 到 65535 的 UDP 流量

  • 到端口 1900 的 UDP 流量

  • 到端口 135、139 和 445 的 TCP 流量

  • 源端口为 53 的 UDP 流量

其余流量会分别被丢弃或拒绝,并且会被记录。具体行为可能因 FirewallOptions 中启用的额外选项而异,例如 NDP、SMURFS 和 TCP flag filtering。

请检查以下系统命令的输出:

 # iptables-save

以查看系统上当前活动的防火墙链和规则。该输出也包含在 System Report 中,可以通过 Web GUI 中节点的订阅选项卡访问,也可以通过 pvereport 命令行工具获取。

VM/CT 入站/出站 DROP/REJECT

这会丢弃或拒绝发往 VM 的所有流量,但会根据配置对 DHCP、NDP、Router Advertisement、 MAC 和 IP filtering 做出一些例外处理。丢弃/拒绝数据包的规则会从数据中心继承,而主机 已接受入站/出站流量的例外规则不适用。

同样,可以使用 iptables-save(见上文)检查所有已应用的 规则和链。

防火墙规则日志

默认情况下,防火墙规则过滤流量的所有日志记录均被禁用。要启用日志记录,需要在 FirewallOptions 中为入站和/或出站流量设置 loglevel。主机防火墙和 VM/CT 防火墙都可以单独设置。这样会启用 Proxmox VE 标准防火墙规则的日志记录,并可在 FirewallLog 中查看输出。此外,对于标准规则,只会记录部分被丢弃或拒绝的数据包 (参见 默认防火墙规则)。

loglevel 不会影响被过滤流量中有多少会被记录。它会改变附加在日志输出前缀中的 LOGID, 以便过滤和后处理。

loglevel 是以下标志之一:

loglevel LOGID

nolog

 — 

emerg

0

alert

1

crit

2

err

3

warning

4

notice

5

info

6

debug

7

典型的防火墙日志输出如下:

VMID LOGID CHAIN TIMESTAMP POLICY: PACKET_DETAILS

对于主机防火墙,VMID 等于 0。

用户定义防火墙规则的日志记录

为了记录由用户定义防火墙规则过滤的数据包,可以为每条规则单独设置 log-level 参数。这样可以 进行细粒度日志记录,并且不受 FirewallOptions 中为标准规则定义的 log-level 影响。

每条规则的 loglevel 可以在 Web UI 中创建或修改规则时轻松定义或更改,也可以通过对应的 pvesh API 调用设置。

此外,也可以通过防火墙配置文件设置 log-level,即在所选规则后追加 -log <loglevel> (参见 可用 log-level)。

例如,以下两条规则等价:

IN REJECT -p icmp -log nolog
IN REJECT -p icmp

而:

IN REJECT -p icmp -log debug

会产生带有 debug 级别标记的日志输出。

提示与技巧

如何允许 FTP

FTP 是一种旧式协议,会使用端口 21 以及其他多个动态端口。因此需要一条规则来接受端口 21。 此外,还需要加载 ip_conntrack_ftp 模块。请运行:

modprobe ip_conntrack_ftp

并将 ip_conntrack_ftp 添加到 /etc/modules(以便重启后仍然生效)。

Suricata IPS 集成

如果希望使用 Suricata IPS(Intrusion Prevention System), 这是可行的。

只有在防火墙 ACCEPT 数据包后,数据包才会转发给 IPS。

被拒绝/丢弃的防火墙数据包不会进入 IPS。

在 proxmox 主机上安装 suricata:

# apt-get install suricata
# modprobe nfnetlink_queue

不要忘记将 nfnetlink_queue 添加到 /etc/modules,以便下次重启后生效。

然后,为特定 VM 启用 IPS:

# /etc/pve/firewall/<VMID>.fw

[OPTIONS]
ips: 1
ips_queues: 0

ips_queues 会为该 VM 绑定特定 CPU 队列。

可用队列定义在:

# /etc/default/suricata
NFQUEUE=0

IPv6 说明

防火墙包含一些 IPv6 专用选项。需要注意的是,IPv6 不再使用 ARP 协议,而是使用工作在 IP 层的 NDP(Neighbor Discovery Protocol),因此需要 IP 地址才能成功工作。为此,会使用从 接口 MAC 地址派生出的 link-local 地址。默认情况下,主机和 VM 级别都会启用 NDP 选项, 以允许发送和接收邻居发现(NDP)数据包。

除邻居发现外,NDP 还用于其他一些功能,例如自动配置和发布路由器。

默认情况下,允许 VM 发送 router solicitation 消息(用于查询路由器),并接收 router advertisement 数据包。这使它们可以使用无状态自动配置。另一方面,除非设置 “Allow Router Advertisement” (radv: 1) 选项,否则 VM 不能将自己通告为路由器。

对于 NDP 所需的 link-local 地址,也可以启用 “IP Filter” (ipfilter: 1) 选项,其效果 等同于为 VM 的每个网络接口添加一个包含对应 link-local 地址的 ipfilter-net* ipset。 (详情请参见 标准 IP 集 ipfilter-net* 一节。)

Proxmox VE 使用的端口

  • Web 界面:8006(TCP,HTTP/1.1 over TLS)

  • VNC Web 控制台:5900-5999(TCP,WebSocket)

  • SPICE 代理:3128(TCP)

  • sshd(用于集群操作):22(TCP)

  • rpcbind:111(UDP)

  • sendmail:25(TCP,出站)

  • corosync 集群流量:5405-5412 UDP

  • 在线迁移(VM 内存和本地磁盘数据):60000-60050(TCP)

nftables

作为 pve-firewall 的替代方案,我们提供 proxmox-firewall。它是 Proxmox VE 防火墙的一个实现,基于较新的 nftables, 而不是 iptables。

Warning proxmox-firewall 当前处于技术预览阶段。它可能存在错误,或与原防火墙不兼容。 目前不适合生产使用。

该实现使用相同的配置文件和配置格式,因此切换时可以使用旧配置。除少数例外外,它提供完全 相同的功能:

  • 当前无法对客户机流量使用 REJECT(流量会改为被丢弃)。

  • 使用 NDPRouter AdvertisementDHCP 选项时,*始终*会创建防火墙规则, 无论默认策略如何。

  • 即使连接已有 conntrack table entries,也会评估客户机防火墙规则。

安装和使用

安装 proxmox-firewall 软件包:

apt install proxmox-firewall

通过主机上的 Web UI(Host > Firewall > Options > nftables)启用 nftables 后端,或在 主机配置文件 (/etc/pve/nodes/<node_name>/host.fw) 中启用:

[OPTIONS]

nftables: 1
Note 启用/禁用 proxmox-firewall 后,需要重启所有正在运行的 VM 和容器,旧/新防火墙 才能正常工作。

设置 nftables 配置键后,新的 proxmox-firewall 服务会接管。可以通过检查 proxmox-firewall 的 systemctl 状态来确认新服务是否正常工作:

systemctl status proxmox-firewall

也可以检查生成的 ruleset。更多信息可在 常用命令一节中找到。还应检查 pve-firewall 是否不再生成 iptables 规则,相关命令可在 服务和命令一节中找到。

要切回旧防火墙,只需将配置值重新设置为 0 / No。

使用

proxmox-firewall 会创建两个由 proxmox-firewall 服务管理的表:proxmox-firewallproxmox-firewall-guests。如果希望创建位于 Proxmox VE 防火墙配置之外的自定义规则, 可以创建自己的表来管理自定义防火墙规则。proxmox-firewall 只会修改它生成的表,因此可以 通过添加自己的表轻松扩展和修改 proxmox-firewall 的行为。

基于 nftables 的防火墙不使用 pve-firewall 命令,而是使用 proxmox-firewall。它是 systemd 服务,因此可以通过 systemctl 启动和停止:

systemctl start proxmox-firewall
systemctl stop proxmox-firewall

停止防火墙服务会移除所有生成的规则。

要查询防火墙状态,可以查询 systemctl 服务状态:

systemctl status proxmox-firewall

常用命令

可以通过以下命令检查生成的 ruleset:

nft list ruleset

如果要调试 proxmox-firewall,可以将 RUST_LOG 环境变量设置为 trace,并直接在前台 运行该守护进程。这应提供详细调试输出:

RUST_LOG=trace /usr/libexec/proxmox/proxmox-firewall

如果希望防火墙守护进程提供详细输出,也可以编辑 systemctl 服务:

systemctl edit proxmox-firewall

然后需要为 RUST_LOG 环境变量添加 override:

[Service]
Environment="RUST_LOG=trace"

这会很快生成大量日志,因此仅应在调试时使用。其他较低详细程度的日志级别包括 infodebug

前台运行会将日志输出写入 STDERR,因此可以使用以下命令重定向日志(例如用于向社区论坛提交 日志):

RUST_LOG=trace /usr/libexec/proxmox/proxmox-firewall 2> firewall_log_$(hostname).txt

为调试防火墙规则,跟踪数据包在不同链之间的流动会很有帮助。可以通过为希望跟踪的数据包设置 nftrace 为 1 来实现。建议不要为*所有*数据包设置该标志;下面示例只检查 ICMP 数据包。

#!/usr/sbin/nft -f
table bridge tracebridge
delete table bridge tracebridge

table bridge tracebridge {
    chain trace {
        meta l4proto icmp meta nftrace set 1
    }

    chain prerouting {
        type filter hook prerouting priority -350; policy accept;
        jump trace
    }

    chain postrouting {
        type filter hook postrouting priority -350; policy accept;
        jump trace
    }
}

保存该文件、赋予可执行权限并运行一次后,会创建相应的跟踪链。然后可以通过 Proxmox VE Web UI(Firewall > Log)或 nft monitor trace 检查跟踪输出。

上述示例会跟踪所有桥上的流量,这通常是客户机流量经过的位置。如果要检查主机流量,请在 inet 表而不是 bridge 表中创建这些链。

Note 请注意,这可能生成*大量*日志,并显著降低网络栈性能。

可以运行以下命令移除跟踪规则:

nft delete table bridge tracebridge