简介

Proxmox VE虚拟平台自带一个pve-firewall.service服务,其本质是调用iptables模块

pve有3个层级防火墙:

    1. 集群级别的防火墙
    1. 节点防火墙(主机防火墙)
    1. 虚拟机防火墙

集群级别的防火墙

作用域为整个集群的防火墙配置保存在

1
/etc/pve/firewall/cluster.fw

该配置文件由以下小节构成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[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)
突发缓冲区重新填充频度。

policy_in: <ACCEPT | DROP | REJECT>
流入方向的防火墙策略。

policy_out: <ACCEPT | DROP | REJECT>
流出方向的防火墙策略。

[RULES]
该小节用于设置所有节点公共的防火墙策略。

[IPSET <name>]
整个集群范围内有效的IP集合定义。

[GROUP <name>]
整个集群范围内有效的组定义。

[ALIASES]
整个集群范围内有效的别名定义

防火墙默认是被完全禁用的。你可以按如下方式设置启用参数项:

或者编辑文件cluster.fw

1
2
3
[OPTIONS]
# enable firewall (cluster wide setting, default is disabled)
enable: 1
  • 重要

    启用防火墙后,默认所有主机的通信都将被阻断。唯一例外是集群网络内的WebGUI(端口8006)和ssh(端口22)访问可以继续使用

  • 注意

    请在启用防火墙前先打开到Proxmox VE服务器的一个SSH连接,这样即使策略配置有误,也还可以通过该连接访问服务器。

为简化配置,你可以创建一个名为“管理地址”的IPSet,并把所有的远程管理终端IP地址添加进去。这样就可以创建策略允许所有的远程地址访问WebGUI。

主机防火墙

主机级别的防火墙配置保存在

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

该文件中的配置可以覆盖cluster.fw中的配置。你可以提升报警日志级别,设置netfilter相关参数。该配置文件由以下小节构成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[OPTIONS]
该小节用于设置当前主机的防火墙配置项。

enable: <boolean>
启用/禁用主机防火墙策略。

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)
启用记录连接跟踪信息。

ndp: <boolean>
启用NDP。

nf_conntrack_allow_invalid: <boolean> (default = 0)
在跟踪连接时允许记录不合法的包。

nf_conntrack_max: <integer> (32768 -N)
最大的跟踪连接数量。

nf_conntrack_tcp_timeout_established: <integer> (7875 -N)
反向连接建立超时时间。

nosmurfs: <boolean>
启用SMURFS过滤器。

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>
启用非法TCP标志组合过滤器。

[RULES]
该小节用于设置当前主机的防火墙策略。

虚拟机防火墙

虚拟机和容器级别的防火墙配置保存在

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

其内容由以下数据构成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[OPTIONS]
该小节用于设置当前虚拟机或容器的防火墙配置项。

dhcp: <boolean>
启用DHCP。

enable: <boolean>
启用/禁用防火墙策略。

ipfilter: <boolean>
启用默认IP地址过滤器。相当于为每个网卡接口增加一个空白的ipfilter-net<id>地址集合。
该IP地址集合隐式包含了一些默认控制,例如限制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>
启用/禁用MAC地址过滤器。

ndp: <boolean>
启用NDP。

policy_in: <ACCEPT | DROP | REJECT>
流入方向的防火墙策略。

policy_out: <ACCEPT | DROP | REJECT>
流出方向的防火墙策略。

radv: <boolean>
允许发出路由通知。

[RULES]
该小节用于设置当前虚拟机或容器的防火墙策略。

[IPSET <name>]
IP集合定义。

[ALIASES]
IP地址别名定义。

启用虚拟机或容器上的防火墙

每个虚拟网卡设备都有一个防火墙启用标识。你可以控制每个网卡的防火墙启用状态。在设置启用虚拟机防火墙后,必须设置网卡上的防火墙启用标识才可以真正启用防火墙。

安全组

安全组是在集群级别定义的规则集合,可以在所有 VM 的规则中使用

服务和命令

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

  • pvefw-logger:NFLOG 守护进程(ulogd 替换)。
  • pve-firewall:更新 iptables 规则

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

1
2
3
pve-firewall start
pve-firewall stop
pve-firewall restart

要获取状态使用:

1
pve-firewall status

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

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

1
iptables-save

默认防火墙策略

防火墙默认会对以下网络通信开启控制策略:

进/出数据中心的丢弃/拒绝策略

即使防火墙的出入控制策略被设为DROP或REJECT,集群内Proxmox VE主机仍将允许以下网络访问

  • 通过loopback端口的流量。
  • 已建立的网络连接。
  • 基于IGMP协议的通信流量。
  • 开放管理终端到8006端口的TCP访问权限,以便访问Web管理控制台。
  • 开放管理终端到5900-5999端口的TCP访问权限,以便使用VNC终端。
  • 开放管理终端到3128端口的TCP访问权限,以便使用SPICE代理。
  • 开放管理终端到22端口的TCP访问权限,以便ssh访问。
  • 为corosync集群服务开放5404和5405端口的UDP访问权限。
  • 为集群服务开放多播访问权限。
  • 类型3(目的不可达)、4(拥堵控制)、11(超时)的ICMP流量。

以下网络包将被丢弃,并且即使开启日志也不会被日志记录。

  • 处于非法连接状态的TCP流量。
  • 和corosync无关的广播、多播和任意目的数据包,即目的端口不是5404和5405的数据包。
  • 目的端口是43的TCP数据包。
  • 目的端口是135和445的UDP数据包。
  • 目的端口是137-139的UDP数据包。
  • 源端口是137且目的端口是1024-65535的UDP数据包。
  • 目的端口是1900的UDP数据包。
  • 目的端口是135,139,445的TCP数据包。
  • 源端口是53的UDP数据包。

其余网络通信将被丢弃或拒绝,并被日志记录。具体处理结果由防火墙选项中的选项决定,具体包括NDP,SMURFS和TCP标志位过滤等。

可以查看以下命令的输出

1
# iptables-save

了解防火墙策略的活动情况。该命令的输出也会被合并到系统报告,并在Web GUI的节点描述选项卡展示,或通过pvereport命令查看。

进/出客户机的丢弃/拒绝策略

默认情况下,除DHCP、NDP、路由告知、明确通过MAC和IP地址过滤策略排除的数据包以外,有关客户机的网络数据包都会被丢弃或拒绝。数据中心的丢弃和拒绝策略会被虚拟机自动继承,但和主机有关的例外通过策略则不会被集成。

防火墙日志

默认情况下,所有的防火墙策略都不产生日志记录

如要启用日志记录,需要在Firewall→Options中设置出/入网络数据包的日志级别loglevel。

主机、客户机的日志级别可以分别设置。设置后,Proxmox VE的防火墙日志将被启用,并可以在Firewall→Log中查看。

需要注意,只有被标准策略丢弃或拒绝的数据包会产生日志记录

防火墙日志级别loglevel并不影响产生日志数量。只用于改变日志记录的LOGID前缀,以便后续处理。

具体的loglevel取值如下表:

loglevel LOGID
nolog
emerg 0
alert 1
crit 2
err 3
warning 4
notice 5
info 6
debug 7

一般使用建议

对于绝大多数情况,遵循以下原则:

  1. nolog (最常用): 默认选择。用于“常规允许”规则。你明确希望允许的流量(如你的 Web 服务端口、SSH 端口),没有必要记录日志,否则日志会被大量正常流量淹没。
  2. warning (4) 或 notice (5) (常用): 用于“需要关注的允许”规则。例如,你允许从特定管理网段访问 SSH,但想记录下谁登录了,可以用 notice。或者用于记录一些不寻常但允许的行为。
  3. err (3) 或 crit (2): 用于“拒绝”规则。当你有明确的拒绝规则(REJECTDROP)时,使用这些级别可以高效地记录可能的攻击或扫描尝试,因为这些日志本身就值得关注。
  4. info (6) 或 debug (7): 谨慎使用。仅用于临时调试和故障排除。会产生海量日志,迅速填满磁盘,调试完毕后应立即移除或改为 nolog

用户自定义防火墙策略日志记录

如需让用户自定义防火墙策略生成日志记录,可以为每条策略分别设置日志级别。通过Firewall→Options可以为每条策略设置非常精细的日志级别 。 当然可以通过WebUI在创建或修改每条策略时设置或改变loglevel,也可以通过pvesh调用相应API进行设置。

此外,还可以通过修改防火墙日志文件调整日志级别,只要在相应策略后添加-log 即可。

示例如下,以下两条命令效果是一样的,都不产生日志

1
2
IN REJECT -p icmp -log nolog
IN REJECT -p icmp

但以下策略将产生debug级别日志。

1
IN REJECT -p icmp -log debug

PVE端口列表

  • Web界面:8006
  • VNC控制台:5900-5999
  • SPICE proxy:3128
  • sshd(用于集群管理):22
  • rpcbind:111
  • corosync多播(集群通信使用):5404, 5405 UDP