Proxmox VE 防火墙提供了一种简单的方法来保护您的 IT 基础设施。您可以为集群内的所有主机设置防火墙规则,或为虚拟机和容器定义规则。防火墙宏、安全组、IP 集和别名等功能有助于简化该任务。
虽然所有配置都存储在集群文件系统上,但 基于iptables的防火墙服务在每个集群节点上运行,从而在虚拟机之间提供完全隔离。该系统的分布式特性还提供了比中央防火墙解决方案更高的带宽。
防火墙完全支持 IPv4 和 IPv6。IPv6 支持是完全透明的,我们默认过滤这两种协议的流量。因此无需为 IPv6 维护一套不同的规则。
目录
Toggle13.1. 区域
Proxmox VE 防火墙将网络分为以下逻辑区域:
- 主持人
-
来自/流向集群节点的流量
- 虚拟机
-
来自/流向特定虚拟机的流量
对于每个区域,您可以为传入和/或传出流量定义防火墙规则。
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
如果启用防火墙,默认情况下会阻止到所有主机的流量。唯一的例外是本地网络中的 WebGUI(8006) 和 ssh(22)。 |
如果您想远程管理 Proxmox VE 主机,您需要创建规则以允许从这些远程 IP 到 Web GUI(端口 8006)的流量。您可能还想允许 ssh(端口 22),也许还有 SPICE(端口 3128)。
在启用防火墙之前,请打开与 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。防火墙规则
防火墙规则由方向(IN或OUT)和操作(ACCEPT、DENY、REJECT)组成。您还可以指定宏名称。宏包含预定义的规则和选项集。可以通过在规则前添加|来禁用规则。。
[规则] 方向 动作 [选项] |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 等于icmp或icmpv6 / 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”的组,其中包含打开http和https端口的规则。
# /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)