NAME

pve-firewall - PVE 防火墙守护进程

SYNOPSIS

pve-firewall <COMMAND> [ARGS] [OPTIONS]

pve-firewall compile

编译并打印防火墙规则。这对测试很有用。

pve-firewall help [OPTIONS]

获取指定命令的帮助信息。

--extra-args <array>

显示特定命令的帮助信息

--verbose <boolean>

详细输出格式。

pve-firewall localnet

打印本地网络信息。

pve-firewall restart

重启 Proxmox VE 防火墙服务。

pve-firewall simulate [OPTIONS]

模拟防火墙规则。此操作不会模拟内核的 routing 表,而只是简单假定从源区域到目标区域的路由可达。

--dest <string>

目标 IP 地址。

--dport <integer>

目标端口。

--from (host|outside|vm\d+|ct\d+|([a-zA-Z][a-zA-Z0-9]{0,9})/(\S+)) (default = outside)

源区域。

--protocol (tcp|udp) (default = tcp)

协议。

--source <string>

源 IP 地址。

--sport <integer>

源端口。

--to (host|outside|vm\d+|ct\d+|([a-zA-Z][a-zA-Z0-9]{0,9})/(\S+)) (default = host)

目标区域。

--verbose <boolean> (default = 0)

详细输出。

pve-firewall start [OPTIONS]

启动 Proxmox VE 防火墙服务。

--debug <boolean> (default = 0)

调试模式 - 保持在前台运行

pve-firewall status

获取防火墙状态。

pve-firewall stop

停止 Proxmox VE 防火墙服务。注意,停止操作会主动移除所有与 Proxmox VE 相关的 iptable 规则,可能导致主机失去保护。

常用命令示例

查看防火墙状态:

# pve-firewall status

编译并打印当前防火墙规则用于检查:

# pve-firewall compile

DESCRIPTION

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

宏定义

Amanda

Amanda 备份

Action proto dport sport

PARAM

udp

10080

PARAM

tcp

10080

Auth

Auth (identd) 流量

Action proto dport sport

PARAM

tcp

113

BGP

Border Gateway Protocol 流量

Action proto dport sport

PARAM

tcp

179

BitTorrent

BitTorrent 3.1 及更早版本的 BitTorrent 流量

Action proto dport sport

PARAM

tcp

6881:6889

PARAM

udp

6881

BitTorrent32

BitTorrent 3.2 及更高版本的 BitTorrent 流量

Action proto dport sport

PARAM

tcp

6881:6999

PARAM

udp

6881

CVS

Concurrent Versions System pserver 流量

Action proto dport sport

PARAM

tcp

2401

Ceph

Ceph 存储集群流量(Ceph Monitors、OSD 和 MDS 守护进程)

Action proto dport sport

PARAM

tcp

6789

PARAM

tcp

3300

PARAM

tcp

6800:7300

Citrix

Citrix/ICA 流量(ICA、ICA Browser、CGP)

Action proto dport sport

PARAM

tcp

1494

PARAM

udp

1604

PARAM

tcp

2598

DAAP

Digital Audio Access Protocol 流量(iTunes、Rythmbox 守护进程)

Action proto dport sport

PARAM

tcp

3689

PARAM

udp

3689

DCC

Distributed Checksum Clearinghouse 垃圾邮件过滤机制

Action proto dport sport

PARAM

tcp

6277

DHCPfwd

转发的 DHCP 流量

Action proto dport sport

PARAM

udp

67:68

67:68

DHCPv6

DHCPv6 流量

Action proto dport sport

PARAM

udp

546:547

546:547

DNS

Domain Name System 流量(udp 和 tcp)

Action proto dport sport

PARAM

udp

53

PARAM

tcp

53

Distcc

Distributed Compiler 服务

Action proto dport sport

PARAM

tcp

3632

FTP

File Transfer Protocol

Action proto dport sport

PARAM

tcp

21

Finger

Finger 协议(RFC 742)

Action proto dport sport

PARAM

tcp

79

GNUnet

GNUnet 安全点对点网络流量

Action proto dport sport

PARAM

tcp

2086

PARAM

udp

2086

PARAM

tcp

1080

PARAM

udp

1080

GRE

Generic Routing Encapsulation 隧道协议

Action proto dport sport

PARAM

47

Git

Git 分布式版本控制流量

Action proto dport sport

PARAM

tcp

9418

HKP

OpenPGP HTTP key server 协议流量

Action proto dport sport

PARAM

tcp

11371

HTTP

Hypertext Transfer Protocol(WWW)

Action proto dport sport

PARAM

tcp

80

HTTPS

基于 SSL 的 Hypertext Transfer Protocol(WWW)

Action proto dport sport

PARAM

tcp

443

ICPV2

Internet Cache Protocol V2(Squid)流量

Action proto dport sport

PARAM

udp

3130

ICQ

AOL Instant Messenger 流量

Action proto dport sport

PARAM

tcp

5190

IMAP

Internet Message Access Protocol

Action proto dport sport

PARAM

tcp

143

IMAPS

基于 SSL 的 Internet Message Access Protocol

Action proto dport sport

PARAM

tcp

993

IPIP

IPIP 封装流量

Action proto dport sport

PARAM

94

IPsec

IPsec 流量

Action proto dport sport

PARAM

udp

500

500

PARAM

50

IPsecah

IPsec 认证(AH)流量

Action proto dport sport

PARAM

udp

500

500

PARAM

51

IPsecnat

IPsec 流量和 Nat-Traversal

Action proto dport sport

PARAM

udp

500

PARAM

udp

4500

PARAM

50

IRC

Internet Relay Chat 流量

Action proto dport sport

PARAM

tcp

6667

Jetdirect

HP Jetdirect 打印

Action proto dport sport

PARAM

tcp

9100

L2TP

Layer 2 Tunneling Protocol 流量

Action proto dport sport

PARAM

udp

1701

LDAP

Lightweight Directory Access Protocol 流量

Action proto dport sport

PARAM

tcp

389

LDAPS

安全 Lightweight Directory Access Protocol 流量

Action proto dport sport

PARAM

tcp

636

MDNS

Multicast DNS

Action proto dport sport

PARAM

udp

5353

MSNP

Microsoft Notification Protocol

Action proto dport sport

PARAM

tcp

1863

MSSQL

Microsoft SQL Server

Action proto dport sport

PARAM

tcp

1433

Mail

邮件流量(SMTP、SMTPS、Submission)

Action proto dport sport

PARAM

tcp

25

PARAM

tcp

465

PARAM

tcp

587

Munin

Munin 网络资源监控流量

Action proto dport sport

PARAM

tcp

4949

MySQL

MySQL 服务器

Action proto dport sport

PARAM

tcp

3306

NNTP

NNTP 流量(Usenet)。

Action proto dport sport

PARAM

tcp

119

NNTPS

加密 NNTP 流量(Usenet)

Action proto dport sport

PARAM

tcp

563

NTP

Network Time Protocol(ntpd)

Action proto dport sport

PARAM

udp

123

NeighborDiscovery

IPv6 邻居请求、邻居通告和路由器通告

Action proto dport sport

PARAM

icmpv6

router-solicitation

PARAM

icmpv6

router-advertisement

PARAM

icmpv6

neighbor-solicitation

PARAM

icmpv6

neighbor-advertisement

OSPF

OSPF 组播流量

Action proto dport sport

PARAM

89

OpenVPN

OpenVPN 流量

Action proto dport sport

PARAM

udp

1194

PCA

Symantec PCAnywere (tm)

Action proto dport sport

PARAM

udp

5632

PARAM

tcp

5631

PMG

Proxmox Mail Gateway Web 界面

Action proto dport sport

PARAM

tcp

8006

POP3

POP3 流量

Action proto dport sport

PARAM

tcp

110

POP3S

加密 POP3 流量

Action proto dport sport

PARAM

tcp

995

PPtP

Point-to-Point Tunneling Protocol

Action proto dport sport

PARAM

47

PARAM

tcp

1723

Ping

ICMP echo request

Action proto dport sport

PARAM

icmp

echo-request

PostgreSQL

PostgreSQL 服务器

Action proto dport sport

PARAM

tcp

5432

Printer

Line Printer protocol 打印

Action proto dport sport

PARAM

tcp

515

RDP

Microsoft Remote Desktop Protocol 流量

Action proto dport sport

PARAM

tcp

3389

RIP

Routing Information Protocol(双向)

Action proto dport sport

PARAM

udp

520

RNDC

BIND 远程管理协议

Action proto dport sport

PARAM

tcp

953

Razor

Razor 反垃圾邮件系统

Action proto dport sport

PARAM

tcp

2703

Rdate

远程时间获取(rdate)

Action proto dport sport

PARAM

tcp

37

Rsync

Rsync 服务器

Action proto dport sport

PARAM

tcp

873

SANE

SANE 网络扫描

Action proto dport sport

PARAM

tcp

6566

SMB

Microsoft SMB 流量

Action proto dport sport

PARAM

udp

135,445

PARAM

udp

137:139

PARAM

udp

1024:65535

137

PARAM

tcp

135,139,445

SMBswat

Samba Web 管理工具

Action proto dport sport

PARAM

tcp

901

SMTP

Simple Mail Transfer Protocol

Action proto dport sport

PARAM

tcp

25

SMTPS

加密 Simple Mail Transfer Protocol

Action proto dport sport

PARAM

tcp

465

SNMP

Simple Network Management Protocol

Action proto dport sport

PARAM

udp

161:162

PARAM

tcp

161

SPAMD

Spam Assassin SPAMD 流量

Action proto dport sport

PARAM

tcp

783

SPICEproxy

Proxmox VE SPICE 显示代理流量

Action proto dport sport

PARAM

tcp

3128

SSH

Secure shell 流量

Action proto dport sport

PARAM

tcp

22

SVN

Subversion 服务器(svnserve)

Action proto dport sport

PARAM

tcp

3690

SixXS

SixXS IPv6 Deployment and Tunnel Broker

Action proto dport sport

PARAM

tcp

3874

PARAM

udp

3740

PARAM

41

PARAM

udp

5072,8374

Squid

Squid Web 代理流量

Action proto dport sport

PARAM

tcp

3128

Submission

邮件提交流量

Action proto dport sport

PARAM

tcp

587

Syslog

Syslog 协议(RFC 5424)流量

Action proto dport sport

PARAM

udp

514

PARAM

tcp

514

TFTP

Trivial File Transfer Protocol 流量

Action proto dport sport

PARAM

udp

69

Telnet

Telnet 流量

Action proto dport sport

PARAM

tcp

23

Telnets

基于 SSL 的 Telnet

Action proto dport sport

PARAM

tcp

992

Time

RFC 868 Time 协议

Action proto dport sport

PARAM

tcp

37

Trcrt

Traceroute 流量(最多 30 跳)

Action proto dport sport

PARAM

udp

33434:33524

PARAM

icmp

echo-request

VNC

VNC display 0 - 99 的 VNC 流量

Action proto dport sport

PARAM

tcp

5900:5999

VNCL

listen 模式下从 VNC 服务器到 VNC 查看器的 VNC 流量

Action proto dport sport

PARAM

tcp

5500

Web

WWW 流量(HTTP 和 HTTPS)

Action proto dport sport

PARAM

tcp

80

PARAM

tcp

443

Webcache

Web 缓存/代理流量(端口 8080)

Action proto dport sport

PARAM

tcp

8080

Webmin

Webmin 流量

Action proto dport sport

PARAM

tcp

10000

Whois

Whois(nicname,RFC 3912)流量

Action proto dport sport

PARAM

tcp

43

版权和免责声明

Copyright © 2022-2025 成都市梨儿方信息技术有限责任公司.

本程序是自由软件:你可以依据自由软件基金会发布的 GNU Affero General Public License 条款重新分发和/或修改本程序;可使用该许可证第 3 版,或(由你选择)任何后续版本。

发布本程序是希望它能够有用,但不提供任何担保;甚至不包含对适销性或特定用途适用性的默示担保。更多详情请参见 GNU Affero General Public License。

你应当已经随本程序收到一份 GNU Affero General Public License 的副本。如果没有,请访问: https://www.gnu.org/licenses/

Copyright © 2007-2022 Proxmox Server Solutions GmbH

本程序是自由软件:你可以依据自由软件基金会发布的 GNU Affero General Public License 条款重新分发和/或修改本程序;可使用该许可证第 3 版,或(由你选择)任何后续版本。

发布本程序是希望它能够有用,但不提供任何担保;甚至不包含对适销性或特定用途适用性的默示担保。更多详情请参见 GNU Affero General Public License。

你应当已经随本程序收到一份 GNU Affero General Public License 的副本。如果没有,请访问: https://www.gnu.org/licenses/