Proxmox VE防火墙提供了一种简单的方法来保护您的IT基础设施。您可以为集群内的所有主机设置防火墙规则,或者为虚拟机和容器定义规则。防火墙宏、安全组、IP集和别名等特性有助于简化这项任务。

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

防火墙完全支持IPv4和IPv6。IPv6支持是完全透明的,我们默认对两种协议的流量都进行过滤。所以没有必要为IPv6维护一套不同的规则。

13.1、区域(Zones)

Proxmox VE防火墙将网络划分为以下逻辑区域:

宿主
从/到群集节点的通信

虚拟机
从/到特定虚拟机的流量

对于每个区域,您可以为传入和/或传出的流量定义防火墙规则。

13.2、配置文件

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

你可以使用GUI配置任何东西(例如:数据中心→防火墙,或者在节点上→防火墙),或者你可以直接使用你喜欢的编辑器编辑配置文件。

防火墙配置文件包含键-值对的部分。以#开头的行和空白行被认为是注释。节以包含用[和]括起来的节名的标题行开始。

13.2.1、集群范围设置

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

/etc/pve/firewall/cluster.fw

配置可以包含以下部分:

[OPTIONS]
这用于设置集群范围的防火墙选项。

ebtables: (default = 1)
在集群范围内启用ebtables规则。

enable: (0 - N)
启用或禁用集群范围的防火墙。

log_ratelimit: [enable=]<1|0> [,burst=] [,rate=]
日志ratelimiting设置

burst= (0 - N) (default = 5)
包的初始爆发总是在应用速率之前被记录

enable= (default = 1)
开启/关闭日志速率限制

rate= (default = 1/second)
爆裂桶被重新填充的频率

policy_in:
输入的政策。

policy_out:
输出政策。

[RULES]
本节包含所有节点的集群范围防火墙规则。

[IPSET ]
集群宽IP集定义。

[GROUP ]
集群范围的安全组定义。

[ALIASES]
集群范围的别名定义。

Enabling the Firewall
**
防火墙在默认情况下是完全禁用的,所以你需要在这里设置enable选项:

  1. (选项)
  2. #启用防火墙(集群宽设置,默认为禁用)
  3. enable:1
  1. 重要的
  2. 开启防火墙后,所有主机的流量默认为阻断。只有来自本地网络的WebGUI(8006)和ssh(22)例外。

如果您想远程管理您的Proxmox VE主机,您需要创建规则来允许从这些远程ip传输到web GUI(端口8006)。您可能还希望允许ssh(端口22)和SPICE(端口3128)。

  1. 提示
  2. 在启用防火墙之前,请打开到您的一台Proxmox VE主机的SSH连接。这样,如果出现问题,您仍然可以访问主机。

为了简化该任务,您可以创建一个名为“management”的IPSet,并在其中添加所有远程ip。这将创建从远程访问GUI所需的所有防火墙规则。

13.2.2、主机特定配置

读取主机相关配置:

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

如果您想要覆盖来自集群的规则,这是非常有用的。弗兰克-威廉姆斯配置。您还可以增加日志的详细程度,并设置与netfilter相关的选项。配置可以包含以下部分:

[OPTIONS]
这用于设置与主机相关的防火墙选项。

enable:
启用主机防火墙规则。

log_level_in:
输入流量的日志级别。

log_level_out:
输出流量的日志级别。

log_nf_conntrack: (default = 0)
启用conntrack信息的日志记录。

ndp: (default = 0)
使能NDP(邻居发现协议)。

nf_conntrack_allow_invalid: (default = 0)
在连接跟踪中允许无效数据包。

nf_conntrack_max: (32768 - N) (default = 262144)
在连接跟踪中允许无效数据包。

nf_conntrack_tcp_timeout_established: (7875 - N) (default =432000)
Conntrack建立超时。

nf_conntrack_tcp_timeout_syn_recv: (30 - 60) (default = 60)
Conntrack同步接收超时。

nosmurfs:
启用SMURFS过滤器。

protection_synflood: (default = 0)
启用synflood保护

protection_synflood_burst: (default = 1000)
ip src破坏了Synflood保护速率。

protection_synflood_rate: (default = 200)
ip src的Synflood保护速率syn / sec。

smurf_log_level:
SMURFS过滤器的日志级别。

tcp_flags_log_level:
非法tcp标志过滤器的日志级别。

tcpflags: (default = 0)
过滤TCP标志的非法组合。

[RULES]**
本节包含特定于主机的防火墙规则。

13.2.3、VM/容器配置

从以下位置读取VM防火墙配置:

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

并包含以下数据:

[OPTIONS]
这用于设置与VM / Container相关的防火墙选项。

dhcp: (default = 0)
启用DHCP。

enable: (default = 0)
启用/禁用防火墙规则。

ipfilter:
启用默认IP过滤器。 这等效于为每个接口添加一个空的ipfilter-net ipset。此类ipset隐式包含合理的默认限制,例如将IPv6链接本地地址限制为从接口的MAC地址派生的地址。 对于容器,将隐式添加配置的IP地址。

log_level_in:
传入流量的日志级别。

log_level_out:
传出流量的日志级别。

macfilter: (default = 0)
启用/禁用MAC地址过滤器。

ndp: (default = 0)
启用NDP(邻居发现协议)。

policy_in:
输入策略。

policy_out:
输出策略。

radv:
允许发送路由器广告。

[RULES]
本节包含VM /容器防火墙规则。

[IPSET ]
IP集定义。

[ALIASES]**
IP别名定义。

为VM和容器启用防火墙
**
每个虚拟网络设备都有其自己的防火墙启用标志。 因此,您可以有选择地为每个接口启用防火墙。 除常规防火墙启用选项外,这是必需的。

13.3、防火墙规则

防火墙规则由一个方向(IN或OUT)和一个动作(ACCEPT,DENY,REJECT)组成。 您也可以指定宏名称。 宏包含预定义的规则和选项集。 可以通过在规则前面加上 | 来禁用规则。

防火墙规则语法

  1. [RULES]
  2. DIRECTION ACTION [OPTIONS]
  3. |DIRECTION ACTION [OPTIONS] # disabled rule
  4. DIRECTION MACRO(ACTION) [OPTIONS] # use predefined macro

以下选项可用于优化规则匹配。

—dest
限制数据包的目的地址。 这可以引用一个IP地址,一个IP集(+ ipsetname)或一个IP别名定义。 您还可以指定一个地址范围,例如20.34.101.207-201.3.9.99,或IP地址和网络列表(条目以逗号分隔)。 请不要在此类列表中混用IPv4和IPv6地址。

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


—icmp-type
指定icmp-type。 仅在proto等于icmp时有效。

—iface
网络接口名称。 您必须为VM和容器(net \ d +)使用网络配置密钥名称。 与主机相关的规则可以使用任意字符串。

—log
防火墙规则的日志级别。

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

—source
限制报文源地址 这可以引用一个IP地址,一个IP集(+ ipsetname)或一个IP别名定义。 您还可以指定一个地址范围,例如20.34.101.207-201.3.9.99,或IP地址和网络列表(条目以逗号分隔)。 请不要在此类列表中混用IPv4和IPv6地址。

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

这里有些例子:

  1. [RULES]
  2. IN SSH(ACCEPT) -i net0
  3. IN SSH(ACCEPT) -i net0 # a comment
  4. IN SSH(ACCEPT) -i net0 -source 192.168.2.192 # only allow SSH from 192.168.2.192
  5. IN SSH(ACCEPT) -i net0 -source 10.0.0.1-10.0.0.10 # accept SSH for IP range
  6. IN SSH(ACCEPT) -i net0 -source 10.0.0.1,10.0.0.2,10.0.0.3 #accept ssh for IP list
  7. IN SSH(ACCEPT) -i net0 -source +mynetgroup # accept ssh for ipset mynetgroup
  8. IN SSH(ACCEPT) -i net0 -source myserveralias #accept ssh for alias myserveralias
  9. |IN SSH(ACCEPT) -i net0 # disabled rule
  10. INDROP # drop all incoming packages
  11. OUT ACCEPT # accept all outgoing packages

13.4、安全组

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

  1. # /etc/pve/firewall/cluster.fw
  2. [group webserver]
  3. INACCEPT -p tcp -dport 80
  4. INACCEPT -p tcp -dport 443

然后,您可以将此组添加到VM的防火墙

  1. # /etc/pve/firewall/<VMID>.fw
  2. [RULES]
  3. GROUP webserver

13.5、IP别名

IP别名允许您将网络的IP地址与名称相关联。 然后,您可以引用这些名称:

  • 内部IP集定义
  • 在防火墙规则的源和目标属性中

13.5.1、标准IP别名本地网络

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

  1. # pve-firewall localnet
  2. local hostname: example
  3. local IP address: 192.168.2.100
  4. network auto detect: 192.168.0.0/20
  5. using detected local_network: 192.168.0.0/20

防火墙自动设置规则,以允许使用此别名的群集通信所需的所有内容(corosync,API,SSH)。

用户可以在cluster.fw别名部分中覆盖这些值。 如果在公共网络上使用单个主机,则最好明确分配本地IP地址

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

13.6、IP 集

IP集可用于定义网络和主机的组。 您可以在防火墙规则的来源和目标属性中使用“ +name”来引用它们。

以下示例允许来自管理IP集的HTTP通信。

IN HTTP(ACCEPT) -source +management

13.6.1、标准IP集管理

此IP集仅适用于主机防火墙(不适用于VM防火墙)。 这些IP被允许执行常规管理任务(PVE GUI,VNC,SPICE,SSH)。

本地群集网络将自动添加到此IP集(别名cluster_network),以启用主机间群集通信。 (多播,ssh,…)

  1. # /etc/pve/firewall/cluster.fw
  2. [IPSET management]
  3. 192.168.2.10
  4. 192.168.2.10/24

13.6.2、标准IP设置黑名单

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

  1. # /etc/pve/firewall/cluster.fw
  2. [IPSET blacklist]
  3. 77.240.159.182
  4. 213.87.123.0/24

13.6.3、标准IP设置ipfilter-net *

这些过滤器属于VM的网络接口,主要用于防止IP欺骗。 如果某个接口存在这样的集合,则任何源IP不匹配其接口的相应ipfilter集的传出流量都将被丢弃。

对于配置了IP地址的容器,如果存在(或通过VM的防火墙的“选项”标签中的“常规IP筛选器”选项激活)这些集合,则隐式包含关联的IP地址。

对于虚拟机和容器,它们还隐式包含标准的MAC派生的IPv6链接本地地址,以允许邻居发现协议起作用。

  1. /etc/pve/firewall/<VMID>.fw
  2. [IPSET ipfilter-net0] # only allow specified IPs on net0
  3. 192.168.2.10

13.7、服务和命令

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

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

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

# pve-firewall start
# pve-firewall stop

要获取状态,请使用:

# pve-firewall status

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

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

# iptables-save

13.8、默认防火墙规则

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

13.8.1、数据中心传入/传出 DROP/REJECT

如果将防火墙的输入或输出策略设置为DROP或REJECT,则群集中所有Proxmox VE主机仍允许以下流量:

  • 通过环回接口的流量
  • 已经建立的连接
  • 使用IGMP协议的流量
  • 从管理主机到端口8006的TCP流量,以允许访问Web界面
  • 从管理主机到端口范围5900到5999的TCP流量,允许VNC Web控制台的流量
  • 从管理主机到端口3128的TCP流量,用于连接到SPICE代理
  • 从管理主机到端口22的TCP流量,以允许ssh访问
  • 群集网络中到端口5404和5405的UDP流量进行corosync
  • 群集网络中的UDP多播流量
  • ICMP流量类型3(无法到达目的地),4(拥塞控制)或11(超过时间)下列流量被丢弃,即使启用了日志记录,也不会记录:
  • TCP连接的连接状态无效
  • 与Corosync不相关的广播,组播和任播流量,即不通过端口5404或5405
  • 到端口43的TCP流量
  • 到端口135和445的UDP流量
  • UDP通讯到端口范围137到139
  • UDP流量从源端口137到端口范围1024至65535
  • 到端口1900的UDP流量
  • 到端口135、139和445的TCP流量
  • 源端口53产生的UDP流量

其余流量分别被丢弃或拒绝,并被记录。这可能会有所不同,具体取决于防火墙→选项中启用的其他选项,例如NDP,SMURFS和TCP标志过滤。

请检查输出

# iptables-save

系统命令以查看系统上活动的防火墙链和规则。 此输出也包含在系统报告中,可通过Web GUI中节点的订阅选项卡或通过pvereport命令行工具进行访问。

13.8.2、VM/CT传入/传出 DROP/REJECT

这会丢弃或拒绝所有到VM的流量,除了DHCP,NDP,路由器公告,MAC和IP过滤(根据设置的配置)的某些例外。 丢弃/拒绝数据包的相同规则从数据中心继承,而主机接受的传入/传出流量的例外则不适用。

同样,您可以使用iptables-save(请参见上文)第13.8.1节来检查所有应用的规则和链。

13.9、防火墙规则日志记录

默认情况下,禁用防火墙规则过滤的所有流量日志记录。 要启用日志记录,必须在防火墙→选项中设置传入和/或传出流量的日志级别。 可以对主机以及VM / CT防火墙单独进行此操作。 这样,就可以启用Proxmox VE的标准防火墙规则的日志记录,并且可以在防火墙→日志中观察输出。 此外,对于标准规则,仅记录一些丢弃或拒绝的数据包(请参阅默认防火墙规则第13.8节)。

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。

13.9.1、记录用户定义的防火墙规则

为了记录由用户定义的防火墙规则过滤的数据包,可以为每个规则分别设置一个日志级别的参数。 这允许以细粒度方式登录,而与在防火墙→选项中为标准规则定义的日志级别无关。

尽管可以在创建或修改规则的过程中在WebUI中轻松定义或更改每个规则的日志级别,但也可以通过相应的pvesh API调用来设置日志级别。

此外,还可以通过将-log 附加到所选规则来通过防火墙配置文件设置日志级别(请参阅可能的日志级别[?informaltable])。

例如,以下两个是ident:

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

IN REJECT -p icmp -log debug

生成带有调试级别标记的日志输出。

13.10、提示和技巧

13.10.1、如何允许FTP

FTP是一种旧式协议,它使用端口21和其他几个动态端口。 因此,您需要一个规则来接受端口21。此外,您需要加载ip_conntrack_ftp模块。 因此,请运行:

modprobe ip_conntrack_ftp

并将ip_conntrack_ftp添加到/ etc / modules(以便在重新启动后可以正常工作)。

13.10.2、Suricata IPS集成

如果您想使用Suricata IPS(入侵防御系统),则可以。

数据包仅在防火墙接受它们之后才转发到IPS。

拒绝/丢弃的防火墙数据包不会发送到IPS。

在proxmox主机上安装suricata:

# apt-get install suricata
# modprobe nfnetlink_queue

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

然后,通过以下操作为特定的VM启用IPS:

  1. # /etc/pve/firewall/<VMID>.fw
  2. [OPTIONS]
  3. ips: 1
  4. ips_queues: 0

ips_queues将为此虚拟机绑定特定的cpu队列。

可用队列在

  1. # /etc/default/suricata
  2. NFQUEUE=0

13.11、IPv6笔记

防火墙包含一些IPv6特定选项。需要注意的一件事是,IPv6不再使用ARP协议,而是使用在IP级别工作的NDP(邻居发现协议),因此需要IP地址才能成功。为此,使用了从接口的MAC地址派生的本地链接地址。默认情况下,主机和VM级别均启用NDP选项,以允许发送和接收邻居发现(NDP)数据包。

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

默认情况下,允许VM发送路由器请求消息(以查询路由器),并接收路由器通告数据包。这使他们可以使用无状态自动配置。另一方面,除非设置了“允许路由器发布”(radv:1)选项,否则VM无法将自己发布为路由器。

至于NDP所需的链接本地地址,还有一个“ IP过滤器”(ipfilter:1)选项可以启用,其效果与为每个包含相应IP地址的VM的网络接口添加ipfilter-net ipset相同。链接本地地址。 (有关详细信息,请参见“标准IP设置ipfilter-net ”部分。)

13.12、Proxmox VE使用的端口

  • Web界面:8006(基于TLS的TCP,HTTP / 1.1)
  • VNC Web控制台:5900-5999(TCP,WebSocket)
  • SPICE代理:3128(TCP)
  • sshd(用于集群操作):22(TCP)
  • rpcbind:111(UDP)
  • sendmail:25(TCP,传出)
  • corosync群集流量:5404、5405 UDP
  • 实时迁移(VM内存和本地磁盘数据):60000-60050(TCP)