PVE防火墙

作者Lin-Tech

11 月 1, 2023

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

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

防火墙完全支持 IPv4 和 IPv6。IPv6 支持是完全透明的,我们默认过滤这两种协议的流量。因此无需为 IPv6 维护一套不同的规则。

13.2. 配置文件

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

您可以使用 GUI 配置任何内容(即数据中心防火墙,或在节点防火墙上),也可以使用您喜欢的编辑器直接编辑配置文件。

防火墙配置文件包含键值对部分。以#开头的行和空行被视为注释。节以标题行开头,其中包含[]中包含的节名称。

13.2.1. 集群范围设置

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

/etc/pve/firewall/cluster.fw

配置可以包含以下部分:

[选项]

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

ebtables : <布尔值>默认 = 1

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

启用<整数>(0 – N)

启用或禁用集群范围内的防火墙。

log_ratelimit : [enable=]<1|0> [,burst=<整数>] [,rate=<速率>]

日志速率限制设置

突发<整数> (0 – N)默认 = 5

在应用费率之前始终会记录初始的包裹突发

启用<布尔值>默认 = 1

启用或禁用日志速率限制

速率<速率>默认 = 1/秒

爆破桶重新装满的频率

策略_输入<接受| 下降 | 拒绝>

输入政策。

政策输出<接受| 下降 | 拒绝>

产出政策。

[规则]

此部分包含所有节点的集群范围防火墙规则。

[IPSET <名称>]

集群范围的 IP 集定义。

[组<名称>]

集群范围的安全组定义。

[别名]

集群范围的别名定义。

启用防火墙

防火墙默认是完全禁用的,所以你需要在这里设置启用选项:

[选项]
# 启用防火墙(集群范围设置,默认禁用)
启用:1
Important 如果启用防火墙,默认情况下会阻止到所有主机的流量。唯一的例外是本地网络中的 WebGUI(8006) 和 ssh(22)。

如果您想远程管理 Proxmox VE 主机,您需要创建规则以允许从这些远程 IP 到 Web GUI(端口 8006)的流量。您可能还想允许 ssh(端口 22),也许还有 SPICE(端口 3128)。

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

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

13.2.2. 主机特定配置

主机相关配置读取自:

/etc/pve/nodes/<节点名称>/host.fw

如果您想覆盖cluster.fw 配置中的规则,这非常有用。您还可以增加日志详细程度,并设置 netfilter 相关选项。配置可以包含以下部分:

[选项]

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

启用<布尔值>

启用主机防火墙规则。

log_level_in : <警报| 暴击| 调试| 紧急| 错误| 信息 | 诺洛格| 通知 | 警告>

传入流量的日志级别。

log_level_out<警报| 暴击| 调试| 紧急| 错误| 信息 | 诺洛格| 通知 | 警告>

传出流量的日志级别。

log_nf_conntrack : <布尔值>默认 = 0

启用连接跟踪信息的记录。

ndp : <布尔值>默认 = 0

启用 NDP(邻居发现协议)。

nf_conntrack_allow_invalid : <布尔值>默认 = 0

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

nf_conntrack_helpers : <字符串> (默认 = “)

为特定协议启用 conntrack 帮助程序。支持的协议:amanda、ftp、irc、netbios-ns、pptp、sane、sip、snmp、tftp

nf_conntrack_max : <整数> (32768 – N) (默认 = 262144 )

跟踪连接的最大数量。

nf_conntrack_tcp_timeout_builted<整数>(7875 – N)默认 = 432000

Conntrack 已建立超时。

nf_conntrack_tcp_timeout_syn_recv : <整数> (30 – 60) (默认 = 60 )

Conntrack同步接收超时。

nosmurfs : <布尔值>

启用 SMURFS 过滤器。

Protection_synflood : <布尔值>默认 = 0

启用 synflood 保护

Protection_synflood_burst<整数>默认 = 1000

Synflood 防护率按 ip src 突发。

Protection_synflood_rate<整数>默认 = 200

Synflood 保护速率 syn/秒(按 ip src)。

smurf_log_level : <警报| 暴击| 调试| 紧急| 错误| 信息 | 诺洛格| 通知 | 警告>

SMURFS 过滤器的日志级别。

tcp_flags_log_level : <警报| 暴击| 调试| 紧急| 错误| 信息 | 诺洛格| 通知 | 警告>

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

tcpflags : <布尔值>默认 = 0

过滤 TCP 标志的非法组合。

[规则]

本节包含主机特定的防火墙规则。

13.2.3。虚拟机/容器配置

VM防火墙配置读取自:

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

并包含以下数据:

[选项]

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

dhcp : <布尔值>默认 = 0

启用 DHCP。

启用<布尔值>默认 = 0

启用/禁用防火墙规则。

ipfilter : <布尔值>

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

log_level_in : <警报| 暴击| 调试| 紧急| 错误| 信息 | 诺洛格| 通知 | 警告>

传入流量的日志级别。

log_level_out<警报| 暴击| 调试| 紧急| 错误| 信息 | 诺洛格| 通知 | 警告>

传出流量的日志级别。

macfilter : <布尔值>默认 = 1

启用/禁用 MAC 地址过滤。

ndp : <布尔值>默认 = 0

启用 NDP(邻居发现协议)。

策略_输入<接受| 下降 | 拒绝>

输入政策。

政策输出<接受| 下降 | 拒绝>

产出政策。

radv : <布尔值>

允许发送路由器通告。

[规则]

本部分包含虚拟机/容器防火墙规则。

[IPSET <名称>]

IP 集定义。

[别名]

IP 别名定义。

为虚拟机和容器启用防火墙

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

13.3。防火墙规则

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

防火墙规则语法
[规则]

方向 动作 [选项]
|DIRECTION ACTION [OPTIONS] # 禁用规则

DIRECTION MACRO(ACTION) [OPTIONS] # 使用预定义的宏

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

–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-类型 <字符串>

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

–iface <字符串>

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

–log <警报| 暴击| 调试| 紧急| 错误| 信息 | 诺洛格| 通知 | 警告>

防火墙规则的日志级别。

–proto <字符串>

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

–源 <字符串>

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

–运动 <字符串>

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

这里有些例子:

[规则]
在 SSH(接受)-i net0
IN SSH(接受) -i net0 # 一条评论
IN SSH(接受) -i net0 -source 192.168.2.192 # 只允许来自 192.168.2.192 的 SSH
IN SSH(接受) -i net0 -source 10.0.0.1-10.0.0.10 # 接受 SSH 的 IP 范围
IN SSH(接受) -i net0 -source 10.0.0.1,10.0.0.2,10.0.0.3 #接受 ssh 获取 IP 列表
IN SSH(ACCEPT) -i net0 -source +mynetgroup # 接受 ssh 作为 ipset mynetgroup
IN SSH(接受) -i net0 -source myserveralias #接受 ssh 作为别名 myserveralias

|IN SSH(ACCEPT) -i net0 # 禁用规则

IN DROP # 删除所有传入的包
OUT ACCEPT # 接受所有传出的包

13.4。安全组

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

# /etc/pve/firewall/cluster.fw

[群组网络服务器]
接受-p tcp -dport 80
接受-p tcp -dport 443

然后,您可以将该组添加到虚拟机的防火墙中

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

[规则]
集团网络服务器

13.5。IP 别名

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

  • 内部 IP 集定义

  • 在防火墙规则的 目标属性中

13.5.1。标准 IP 别名local_network

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

# pve-防火墙本地网络
本地主机名:示例
本地IP地址:192.168.2.100
网络自动检测:192.168.0.0/20
使用检测到的 local_network:192.168.0.0/20

防火墙自动设置规则以允许使用此别名进行集群通信(corosync、API、SSH)所需的一切。

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

# /etc/pve/firewall/cluster.fw
[别名]
local_network 1.2.3.4 # 使用单个IP地址

13.6。IP 集

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

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

IN HTTP(接受)-源+管理

13.6.1。标准IP集管理

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

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

# /etc/pve/firewall/cluster.fw

[IPSET管理]
192.168.2.10
192.168.2.10/24

13.6.2。标准IP设置黑名单

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

# /etc/pve/firewall/cluster.fw

[IPSET黑名单]
77.240.159.182
213.87.123.0/24

13.6.3。标准 IP 设置ipfilter-net*

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

对于配置了 IP 地址的容器,这些集如果存在(或通过虚拟机防火墙选项选项卡中的常规IP 过滤器选项激活 ),则隐式包含关联的 IP 地址。

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

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

[IPSET ipfilter-net0] # 只允许 net0 上的指定 IP
192.168.2.10

13.7。服务和命令

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

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

  • pve-firewall:更新 iptables 规则

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

# pve-防火墙启动
# pve-防火墙停止

要获取状态,请使用:

# pve-防火墙状态

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

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

# iptables-保存

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 访问

  • 集群网络中的 UDP 流量发送至端口 5405-5412 以进行 corosync

  • 集群网络中的UDP组播流量

  • ICMP 流量类型 3(目标不可达)、4(拥塞控制)或 11(时间超出)

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

  • 连接状态无效的 TCP 连接

  • 与 corosync 无关的广播、多播和任播流量,即不通过端口 5405-5412

  • 到端口 43 的 TCP 流量

  • 到端口 135 和 445 的 UDP 流量

  • 发送至端口范围 137 至 139 的 UDP 流量

  • UDP 流量从源端口 137 到端口范围 1024 到 65535

  • 到端口 1900 的 UDP 流量

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

  • 源自源端口 53 的 UDP 流量

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

请检查输出

# iptables-保存

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

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

这会丢弃或拒绝所有流向虚拟机的流量,但 DHCP、NDP、路由器通告、MAC 和 IP 过滤除外,具体取决于设置的配置。丢弃/拒绝数据包的相同规则是从数据中心继承的,而主机接受的传入/传出流量的例外情况不适用。

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

13.9。记录防火墙规则

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

loglevel不会影响记录的过滤流量的数量。它更改作为前缀附加到日志输出的LOGID,以便于过滤和后处理。

loglevel是以下标志之一:

日志级别 逻辑ID

诺洛格

 — 

新兴

0

警报

1

暴击

2

3

警告

4

注意

5

信息

6

调试

7

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

VMID LOGID 链时间戳策略:PACKET_DETAILS

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

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

为了记录由用户定义的防火墙规则过滤的数据包,可以为每个规则单独设置日志级别参数。这允许以细粒度的方式进行日志记录,并且独立于为防火墙选项中的标准规则定义的日志级别。

虽然在创建或修改规则期间可以在 WebUI 中轻松定义或更改每个单独规则的日志级别,但也可以通过相应的pvesh API 调用进行设置。

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

例如,以下两个是相同的:

拒绝 -p icmp -log nolog
拒绝 -p icmp

然而

拒绝 -p icmp -log 调试

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

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 安装 Suricata
# modprobe nfnetlink_queue

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

然后,使用以下命令为特定虚拟机启用 IPS:

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

[选项]
ip: 1
ips_队列:0

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

可用队列定义在

# /etc/默认/suricata
NF队列=0

13.11。IPv6 注释

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

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

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

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

13.12。Proxmox VE 使用的端口

  • Web 接口:8006(TCP、基于 TLS 的 HTTP/1.1)

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

  • SPICE 代理:3128 (TCP)

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

  • rpcbind: 111 (UDP)

  • sendmail:25(TCP,传出)

  • corosync 集群流量:5405-5412 UDP

  • 热迁移(虚拟机内存和本地磁盘数据):60000-60050 (TCP)

作者 Lin-Tech

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注