如何配置网络 ACL

注意

网络 ACL 可用于OVN NIC 类型OVN 网络桥接网络(有一些例外情况,请参阅桥接限制)。

网络ACL定义流量规则,允许控制连接到同一网络的不同实例之间的网络访问,以及与其他网络之间 的访问。

网络 ACL 可以直接分配给实例的NIC或网络。当分配给网络时,ACL 应用于连接到该网络的所有 NIC。

应用了特定 ACL(显式或通过网络隐式)的实例 NIC 构成一个逻辑组,可以从其他规则中将其作为源或目标进行引用。有关详细信息,请参阅ACL 组

创建 ACL

使用以下命令创建 ACL

incus network acl create <ACL_name> [configuration_options...]

此命令创建了一个没有规则的 ACL。下一步,向 ACL 添加规则

有效的网络 ACL 名称必须遵守以下规则

  • 名称必须在 1 到 63 个字符之间。

  • 名称必须仅由 ASCII 表中的字母、数字和连字符组成。

  • 名称不能以数字或连字符开头。

  • 名称不能以连字符结尾。

ACL 属性

ACL 具有以下属性

属性

类型

必需

描述

name

字符串

项目中网络 ACL 的唯一名称

description

字符串

网络 ACL 的描述

ingress

规则列表

入站流量规则

egress

规则列表

规则列表

config

字符串集

配置选项作为键/值对(仅支持user.*自定义键)

添加或删除规则

每个 ACL 包含两个规则列表

  • 入站规则适用于进入 NIC 的入站流量。

  • 出站规则适用于离开 NIC 的出站流量。

要向 ACL 添加规则,请使用以下命令,其中<direction>可以是ingressegress

incus network acl rule add <ACL_name> <direction> [properties...]

此命令将规则添加到指定方向的列表中。

您无法编辑规则(除非您编辑完整的 ACL),但您可以使用以下命令删除规则

incus network acl rule remove <ACL_name> <direction> [properties...]

您必须指定唯一标识规则所需的所有属性,或者向命令添加--force以删除所有匹配的规则。

规则排序和优先级

规则作为列表提供。但是,列表中规则的顺序并不重要,也不会影响过滤。

Incus 根据action属性自动对规则进行排序,如下所示

  • drop

  • reject

  • allow

  • 任何不匹配流量的自动默认操作(默认为reject,请参阅配置默认操作)。

这意味着,当您将多个 ACL 应用于 NIC 时,无需指定组合规则排序。如果 ACL 中的其中一条规则匹配,则执行该规则的操作,并且不再考虑其他规则。

规则属性

ACL 规则具有以下属性

属性

类型

必需

描述

action

字符串

对匹配流量采取的操作(allowallow-statelessrejectdrop

state

字符串

规则的状态(enableddisabledlogged),如果未指定,则默认为enabled

description

字符串

规则的描述

source

字符串

CIDR 或 IP 范围的逗号分隔列表、源主体名称选择器(对于入站规则)或空表示任何

destination

字符串

CIDR 或 IP 范围的逗号分隔列表、目标主体名称选择器(对于出站规则)或空表示任何

protocol

字符串

要匹配的协议(icmp4icmp6tcpudp)或空表示任何

source_port

字符串

如果协议是udptcp,则为端口或端口范围(包括起始端口和结束端口)的逗号分隔列表,或空表示任何

destination_port

字符串

如果协议是udptcp,则为端口或端口范围(包括起始端口和结束端口)的逗号分隔列表,或空表示任何

icmp_type

字符串

如果协议是icmp4icmp6,则为 ICMP 类型编号,或空表示任何

icmp_code

字符串

如果协议是icmp4icmp6,则为 ICMP 代码编号,或空表示任何

在规则中使用选择器

注意

此功能仅支持OVN 网卡类型OVN 网络

source 字段(用于入站规则)和 destination 字段(用于出站规则)支持使用选择器而不是 CIDR 或 IP 范围。

使用此方法,您可以使用 ACL 组或网络选择器为实例组定义规则,而无需维护 IP 列表或创建额外的子网。

ACL 组

分配特定 ACL(显式或通过网络隐式)的实例网卡构成一个逻辑端口组。

此类 ACL 组称为“主体名称选择器”,它们可以在其他 ACL 组中使用 ACL 的名称进行引用。

例如,如果您有一个名为 foo 的 ACL,您可以使用 source=foo 指定分配此 ACL 的实例网卡组作为源。

网络选择器

您可以使用“网络主体选择器”根据流量来源或目标网络定义规则。

有两个特殊的网络主体选择器,称为 @internal@external。它们分别表示网络本地流量和外部流量。例如

source=@internal

如果您的网络支持网络对等体,则可以使用格式为 @<network_name>/<peer_name> 的网络主体选择器引用对等连接的流量。例如

source=@ovn1/mypeer

使用网络主体选择器时,应用 ACL 的网络必须具有指定的对等连接。否则,无法将 ACL 应用于它。

日志流量

通常,ACL 规则旨在控制实例和网络之间的网络流量。但是,您也可以使用它们来记录特定的网络流量,这对于监控或在实际启用规则之前测试规则很有用。

要添加记录规则,请使用 state=logged 属性创建它。然后,您可以使用以下命令显示 ACL 中所有记录规则的日志输出

incus network acl show-log <ACL_name>

编辑 ACL

使用以下命令编辑 ACL

incus network acl edit <ACL_name>

此命令以 YAML 格式打开 ACL 进行编辑。您可以编辑 ACL 配置和规则。

分配 ACL

配置 ACL 后,必须将其分配给网络或实例网卡。

为此,请将其添加到网络或网卡配置的 security.acls 列表中。对于网络,请使用以下命令

incus network set <network_name> security.acls="<ACL_name>"

对于实例网卡,请使用以下命令

incus config device set <instance_name> <device_name> security.acls="<ACL_name>"

配置默认操作

当一个或多个 ACL 应用于网卡(显式或通过网络隐式)时,会向网卡添加一个默认拒绝规则。此规则拒绝与应用 ACL 中任何规则都不匹配的所有流量。

您可以使用网络和网卡级别的 security.acls.default.ingress.actionsecurity.acls.default.egress.action 设置更改此行为。网卡级别设置会覆盖网络级别设置。

例如,要将所有连接到网络的实例的入站流量的默认操作设置为 allow,请使用以下命令

incus network set <network_name> security.acls.default.ingress.action=allow

要为实例网卡配置相同的默认操作,请使用以下命令

incus config device set <instance_name> <device_name> security.acls.default.ingress.action=allow

桥接限制

在桥接网络中使用网络 ACL 时,请注意以下限制

  • 与 OVN ACL 不同,桥接 ACL 仅应用于桥接和 Incus 主机之间的边界。这意味着它们只能用于为进出外部网络的流量应用网络策略。它们不能用于创建桥接内部防火墙,因此防火墙控制连接到同一桥接的实例之间的流量。

  • ACL 组和网络选择器 不受支持。

  • 使用 iptables 防火墙驱动程序时,不能使用 IP 范围主体(例如,192.0.2.1-192.0.2.10)。

  • 基线网络服务规则在 ACL 规则之前添加(在其各自的 INPUT/OUTPUT 链中),因为一旦跳转到 ACL 链,我们就无法区分 INPUT/OUTPUT 和 FORWARD 流量。因此,ACL 规则不能用于阻止基线服务规则。