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:
在集群范围内启用ebtables规则。
enable:
启用或禁用集群范围的防火墙。
log_ratelimit: [enable=]<1|0> [,burst=
日志ratelimiting设置
burst=
包的初始爆发总是在应用速率之前被记录
enable=
开启/关闭日志速率限制
rate=
爆裂桶被重新填充的频率
policy_in:
输入的政策。
policy_out:
输出政策。
[RULES]
本节包含所有节点的集群范围防火墙规则。
[IPSET
集群宽IP集定义。
[GROUP
集群范围的安全组定义。
[ALIASES]
集群范围的别名定义。
Enabling the Firewall
**
防火墙在默认情况下是完全禁用的,所以你需要在这里设置enable选项:
(选项)
#启用防火墙(集群宽设置,默认为禁用)
enable:1
重要的
开启防火墙后,所有主机的流量默认为阻断。只有来自本地网络的WebGUI(8006)和ssh(22)例外。
如果您想远程管理您的Proxmox VE主机,您需要创建规则来允许从这些远程ip传输到web GUI(端口8006)。您可能还希望允许ssh(端口22)和SPICE(端口3128)。
提示
在启用防火墙之前,请打开到您的一台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:
启用conntrack信息的日志记录。
ndp:
使能NDP(邻居发现协议)。
nf_conntrack_allow_invalid:
在连接跟踪中允许无效数据包。
nf_conntrack_max:
在连接跟踪中允许无效数据包。
nf_conntrack_tcp_timeout_established:
Conntrack建立超时。
nf_conntrack_tcp_timeout_syn_recv:
Conntrack同步接收超时。
nosmurfs:
启用SMURFS过滤器。
protection_synflood:
启用synflood保护
protection_synflood_burst:
ip src破坏了Synflood保护速率。
protection_synflood_rate:
ip src的Synflood保护速率syn / sec。
smurf_log_level:
SMURFS过滤器的日志级别。
tcp_flags_log_level:
非法tcp标志过滤器的日志级别。
tcpflags:
过滤TCP标志的非法组合。
[RULES]**
本节包含特定于主机的防火墙规则。
13.2.3、VM/容器配置
从以下位置读取VM防火墙配置:
/etc/pve/firewall/<VMID>.fw
并包含以下数据:
[OPTIONS]
这用于设置与VM / Container相关的防火墙选项。
dhcp:
启用DHCP。
enable:
启用/禁用防火墙规则。
ipfilter:
启用默认IP过滤器。 这等效于为每个接口添加一个空的ipfilter-net
log_level_in:
传入流量的日志级别。
log_level_out:
传出流量的日志级别。
macfilter:
启用/禁用MAC地址过滤器。
ndp:
启用NDP(邻居发现协议)。
policy_in:
输入策略。
policy_out:
输出策略。
radv:
允许发送路由器广告。
[RULES]
本节包含VM /容器防火墙规则。
[IPSET
IP集定义。
[ALIASES]**
IP别名定义。
为VM和容器启用防火墙
**
每个虚拟网络设备都有其自己的防火墙启用标志。 因此,您可以有选择地为每个接口启用防火墙。 除常规防火墙启用选项外,这是必需的。
13.3、防火墙规则
防火墙规则由一个方向(IN或OUT)和一个动作(ACCEPT,DENY,REJECT)组成。 您也可以指定宏名称。 宏包含预定义的规则和选项集。 可以通过在规则前面加上 | 来禁用规则。
防火墙规则语法
[RULES]
DIRECTION ACTION [OPTIONS]
|DIRECTION ACTION [OPTIONS] # disabled rule
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,并且可以使用逗号分隔列表来匹配多个端口或范围。
这里有些例子:
[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
INDROP # drop all incoming packages
OUT ACCEPT # accept all outgoing packages
13.4、安全组
安全组是在群集级别定义的一组规则,可在所有VM的规则中使用。 例如,您可以定义一个名为“ webserver”的组,其中包含用于打开http和https端口的规则。
# /etc/pve/firewall/cluster.fw
[group webserver]
INACCEPT -p tcp -dport 80
INACCEPT -p tcp -dport 443
然后,您可以将此组添加到VM的防火墙
# /etc/pve/firewall/<VMID>.fw
[RULES]
GROUP webserver
13.5、IP别名
IP别名允许您将网络的IP地址与名称相关联。 然后,您可以引用这些名称:
- 内部IP集定义
- 在防火墙规则的源和目标属性中
13.5.1、标准IP别名本地网络
该别名是自动定义的。 请使用以下命令查看分配的值:
# 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
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,…)
# /etc/pve/firewall/cluster.fw
[IPSET management]
192.168.2.10
192.168.2.10/24
13.6.2、标准IP设置黑名单
这些IP的流量被每个主机和VM的防火墙丢弃。
# /etc/pve/firewall/cluster.fw
[IPSET blacklist]
77.240.159.182
213.87.123.0/24
13.6.3、标准IP设置ipfilter-net *
这些过滤器属于VM的网络接口,主要用于防止IP欺骗。 如果某个接口存在这样的集合,则任何源IP不匹配其接口的相应ipfilter集的传出流量都将被丢弃。
对于配置了IP地址的容器,如果存在(或通过VM的防火墙的“选项”标签中的“常规IP筛选器”选项激活)这些集合,则隐式包含关联的IP地址。
对于虚拟机和容器,它们还隐式包含标准的MAC派生的IPv6链接本地地址,以允许邻居发现协议起作用。
/etc/pve/firewall/<VMID>.fw
[IPSET ipfilter-net0] # only allow specified IPs on net0
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规则,可以使用:
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
例如,以下两个是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:
# /etc/pve/firewall/<VMID>.fw
[OPTIONS]
ips: 1
ips_queues: 0
ips_queues将为此虚拟机绑定特定的cpu队列。
可用队列在
# /etc/default/suricata
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)