关于网络 ACL

您可以使用访问控制表 (ACL) 来控制 IBM Cloud® Virtual Private Cloud中的所有传入和传出流量。 ACL 是与安全组类似的内置虚拟防火墙。 与安全组不同,ACL 规则控制_的是子网之间的_流量,而不是_实例_之间的流量。

有关安全组与 ACL 特征的比较,请参阅比较表

本文档中提供的示例显示了如何使用 CLI 在 VPC 中创建网络 ACL。 有关如何在 IBM Cloud 控制台中设置 ACL 的更多信息,请参阅 在控制台中配置 ACL

使用 ACL 和 ACL 规则

为了使访问控制列表(ACL)发挥作用,请创建规则来确定如何处理入站和出站网络流量。 您可以创建多个入站和出站规则。 有关规则配额的更多信息,请参阅 配额

  • 通过入站规则,可以使用指定的协议和端口来允许或拒绝从源 IP 范围流出的流量。
  • 通过出站规则,可以使用指定的协议和端口来允许或拒绝进入目标 IP 范围的流量。
  • ACL 规则按优先级顺序依次进行处理。 将首先评估优先级较高的规则,并覆盖优先级较低的规则。
  • 入站规则独立于出站规则。
  • 如果未指定任何规则,那么缺省行为为 隐式拒绝

有关在 ACL 规则中使用 ICMP、TCP、UDP 和所有其他协议的更多信息,请参阅 了解互联网通信协议

限制

  • 目前,ESP协议数据包仅在具有 Gen2 配置文件的实例上受支持。 在其他配置文件的实例上以及所有裸机服务器上,入站和出站的ESP数据包始终会被丢弃。 虽然可通过VPC API为ESP流量配置网络访问控制列表规则,但此类规则仅影响具有 Gen2 配置文件的实例。 ESP协议不支持附加到与配置文件 Gen2 相同网络的其他类型配置文件。 ESP协议未在控制台 IBM Cloud 显示为可选项,以避免不同实例配置文件代际之间的混淆。 有关更多信息,请参阅 x86-64 实例配置文件

更新VPC的默认ACL规则

默认访问控制列表(ACL)与其他任何访问控制列表类似,唯一的区别在于它无法被删除。

当您创建一个VPC时,系统会为该VPC创建一个默认ACL,其中包含两条规则:

  • 名为 allow-inbound 的规则允许来自任何来源的入站 ICMP、TCP 和 UDP 流量
  • 名为 allow-outbound 的规则允许向任何目的地发送出站 ICMP、TCP 和 UDP 流量

您可以使用控制台、CLI 或 API 修改默认 ACL 的规则。

如果编辑了默认 ACL 的规则,这些编辑过的规则就会应用于连接到 ACL 的所有当前和未来子网。

将 ACL 连接到子网

创建新子网时,您可以指定要附加的访问控制列表。 如果您未指定访问控制列表(ACL),则会关联该 VPC 的默认网络访问控制列表。

每个子网都只连接一个访问控制列表。 您可以用另一个访问控制列表替换子网的访问控制列表。

ACL 示例

在下面的示例中,您将创建两个 ACL,并使用命令行界面 (CLI) 将它们与两个子网相关联。 图 1 说明了此场景的情况。

图示 ACL 场景示例
带两个
的 ACL*

如图1所示,您有两台处理来自互联网请求的Web服务器,以及两台希望对公众隐藏的后端服务器。 在此示例中,您将服务器分配到两个独立的子网中,即 10.10.10.0/2410.10.20.0/24,并且需要允许 Web 服务器与后端服务器交换数据。 此外,您还希望允许后端服务器发送有限量的出站流量。

示例规则

下面的示例规则展示了如何为基本场景配置访问控制列表(ACL)规则。

作为最佳实践,应将细粒度规则的优先级设得高于粗粒度规则。 例如,您有一条阻止来自子网 10.10.30.0/24 的所有流量的规则。 如果为其分配了更高的优先级,那么不会应用任何具有较低优先级的允许来自 10.10.30.5 的流量的细颗粒度规则。

对于 TCP 等双向协议,必须同时定义入站和出站规则。 出站规则允许初始 TCP SYN 连接请求,而相应的入站规则必须接受 TCP SYN ACK 响应。 没有这两种规则,就无法建立沟通。

ACL-1 规则示例

ACL-1的规则示例
方向 允许/拒绝 源 IP 源端口 目标 IP 目标端口 协议 描述
入站 允许 10.10.20.0/24 任意 10.10.10.0/24 任意 任意 允许来自子网 10.10.20.0/24 (后端服务器位于该子网中)的所有入站流量
入站 允许 0.0.0.0/0 任意 10.10.10.0/24 80 TCP 允许从互联网到网络服务器的 HTTP 流量
入站 允许 0.0.0.0/0 任意 10.10.10.0/24 443 TCP 允许从互联网到网络服务器的 HTTPS 流量
入站 允许 0.0.0.0/0 80 10.10.10.0/24 任意 TCP 允许 HTTP 从互联网返回网络服务器的流量
入站 允许 0.0.0.0/0 443 10.10.10.0/24 任意 TCP 允许 HTTPS 从互联网返回网络服务器的流量
入站 拒绝 0.0.0.0/0 任意 0.0.0.0/0 任意 任意 拒绝其他所有入站流量
出站 允许 10.10.10.0/24 任意 0.0.0.0/0 80 TCP 允许 HTTP 从网络服务器到互联网的流量
出站 允许 10.10.10.0/24 任意 0.0.0.0/0 443 TCP 允许 HTTPS 从网络服务器到互联网的流量
出站 允许 10.10.10.0/24 80 0.0.0.0/0 任意 TCP 允许 HTTP 从网络服务器返回互联网的流量
出站 允许 10.10.10.0/24 443 0.0.0.0/0 任意 TCP 允许 HTTPS 返回网络服务器到互联网的流量
出站 允许 10.10.10.0/24 任意 10.10.20.0/24 任意 任意 允许所有发往子网 10.10.20.0/24 (后端服务器位于该子网中)的出站流量
出站 拒绝 0.0.0.0/0 任意 0.0.0.0/0 任意 任意 拒绝其他所有出站流量

ACL-2 规则示例

ACL-2的规则示例
方向 允许/拒绝 源 IP 源端口 目标 IP 目标端口 协议 描述
入站 允许 10.10.10.0/24 任意 10.10.20.0/24 任意 任意 允许来自 10.10.10.0/24 子网的所有入站流量,该子网中部署了Web服务器
入站 拒绝 0.0.0.0/0 任意 0.0.0.0/0 任意 任意 拒绝其他所有入站流量
入站 拒绝 0.0.0.0/0 80 10.0.20.0/24 任意 任意 允许 HTTP 接收来自互联网的回传流量
入站 拒绝 0.0.0.0/0 443 10.0.20.0/24 任意 任意 允许 HTTPS 接收来自互联网的回传流量
出站 允许 10.10.20.0/24 任意 0.0.0.0/0 80 TCP 允许 HTTP 流量流至因特网
出站 允许 10.10.20.0/24 任意 0.0.0.0/0 443 TCP 允许流至因特网的 HTTPS 流量
出站 允许 10.10.20.0/24 任意 10.10.10.0/24 任意 任意 允许所有发往 10.10.10.0/24 子网(该子网中部署了Web服务器)的出站流量
出站 拒绝 0.0.0.0/0 任意 0.0.0.0/0 任意 任意 拒绝其他所有出站流量

此示例仅说明的是一般情况。 在您的场景中,您可能希望对流量进行更精细的控制:

  • 您可能有一位网络管理员,出于操作需要,需要从远程网络访问 10.10.10.0/24 子网。 在这种情况下,您需要允许来自互联网的 SSH 流量进入该子网。
  • 您可能希望缩小两个子网之间允许的协议作用域。

示例步骤

以下示例步骤跳过了使用 CLI 创建 VPC 的先决条件步骤,后者是必须先执行的步骤。 有关更多信息,请参阅 使用 CLI 创建 VPC 资源

步骤 1. 创建 ACL

使用以下 CLI 命令来创建两个名为 my_web_subnet_aclmy_backend_subnet_acl 的 ACL:

ibmcloud is network-acl-create my-web-subnet-acl $vpc_id --source-acl-id $old_acl_id
ibmcloud is network-acl-create my-backend-subnet-acl $vpc_id --source-acl-id $old_acl_id

响应包含新创建的 ACL 标识。 请保存这两个 ACL 的标识,以便在稍后的命令中使用。 你可以使用名为 webaclbkacl 的变量,如下所示:

webacl="0738-ba9e785a-3e10-418a-811c-56cfe5669676"
bkacl="0738-a4e28308-8ee7-46ab-8108-9f881f22bdbf"

步骤 2. 检索缺省 ACL 规则

在添加规则之前,请先检索默认的入站和出站访问控制列表(ACL)规则,以便将新规则插入到这些规则之前。

ibmcloud is network-acl-rules $webacl
ibmcloud is network-acl-rules $bkacl

响应显示允许所有协议中所有 IPv4 流量的缺省入站和出站规则。

Getting rules of network acl ba9e785a-3e10-418a-811c-56cfe5669676 under account Demo Account as user demouser...

inbound
ID                                     Name                                                          Action   IPv*   Protocol   Source      Destination   Created
0738-e2b30627-1a1d-447b-859f-ac9431986b6f   allow-all-inbound-rule-2d86bc3f-58e4-436a-8c1a-9b0a710556d6   allow    ipv4   all        0.0.0.0/0   0.0.0.0/0     2 months ago

outbound
ID                                     Name                                                         Action   IPv*   Protocol   Source      Destination   Created
0738-173a3492-0544-472e-91c0-7828cbcb62d4   allow-all-outbound-rule-2d86bc3f-58e4-436a-8c1a-9b0a710556d6   allow    ipv4   all        0.0.0.0/0   0.0.0.0/0     2 months ago

将这两个 ACL 规则的标识保存为变量,以便您可以在以后的命令中使用这些值。 例如,可以将标识保存在变量 inruleoutrule 中:

inrule="0738-e2b30627-1a1d-447b-859f-ac9431986b6f"
outrule="0738-173a3492-0544-472e-91c0-7828cbcb62d4"

步骤 3. 按照说明添加新的ACL规则

在此示例中,首先添加入站规则,然后添加出站规则。

在缺省入站规则之前插入新的入站规则。

ibmcloud is network-acl-rule-add my_web_acl_rule200 $webacl deny inbound any 0.0.0.0/0 0.0.0.0/0 \
--before-rule-id $in-rule

在每个步骤中,将ACL规则的ID保存到一个变量中,以便在后续命令中使用该ID。 例如,你可以使用变量 acl200

acl200="0738-90930627-1a1d-447b-859f-ac9431986b6f"

现在,将规则添加到 acl200

ibmcloud is network-acl-rule-add my_web_acl_rule100 $webacl allow inbound any 10.10.20.0/24 0.0.0.0/0 \
--before-rule-id $acl200

添加更多规则,直到 ACL 设置完成,并将每个标识都保存为一个变量。

acl100="0738-78340627-1a1d-447b-859f-ac9431986b6f"
ibmcloud is network-acl-rule-add my_web_acl_rule20 $webacl allow inbound tcp 0.0.0.0/0 0.0.0.0/0 \
--source-port-min 443 --source-port-max 443 --before-rule-id $acl100
acl20="32450627-1a1d-447b-859f-ac9431986b6f"
ibmcloud is network-acl-rule-add my_web_acl_rule10 $webacl allow inbound tcp 0.0.0.0/0 0.0.0.0/0 \
--source-port-max 80 --source-port-min 80 --before-rule-id $acl20

在缺省出站规则之前插入新的出站规则。

ibmcloud is network-acl-rule-add my_web_acl_rule200e $webacl deny outbound any 0.0.0.0/0 0.0.0.0/0 \
--before-rule-id $outrule
acl200e="11110627-1a1d-447b-859f-ac9431986b6f"
ibmcloud is network-acl-rule-add my_web_acl_rule100e $webacl allow outbound any 0.0.0.0/0 10.10.20.0/24 \
--before-rule-id $acl200e
acl100e="22220627-1a1d-447b-859f-ac9431986b6f"
ibmcloud is network-acl-rule-add my_web_acl_rule20e $webacl allow outbound tcp 0.0.0.0/0 0.0.0.0/0 \
--source-port-max 443 --source-port-min 443 --before-rule-id $acl100e
acl20e="33330627-1a1d-447b-859f-ac9431986b6f"
ibmcloud is network-acl-rule-add my_web_acl_rule10e $webacl allow outbound tcp 0.0.0.0/0 0.0.0.0/0 \
--source-port-max 80 --source-port-min 80 --before-rule-id $acl20e

步骤 4. 使用新创建的访问控制列表(ACL)创建这两个子网

创建两个子网,以便每个访问控制列表(ACL)都与其中一个新子网相关联。

ibmcloud is subnet-create my-web-subnet $vpc_id $zone --ipv4_cidr_block 10.10.10.0/24 \
 --network-acl-id $webacl
ibmcloud is subnet-create my-backend-subnet$vpc_id $zone --ipv4_cidr_block 10.10.20.0/24 \
--network-acl-id $bkacl

命令列表备忘单

显示 ACL 的可用 VPC CLI 命令的完整列表:

ibmcloud is network-acls

要查看您的访问控制列表(ACL)及其元数据(包括规则),请执行以下操作:

ibmcloud is network-acl $webacl

要列出所有 ACL 规则:

ibmcloud is network-acl-rules $webacl

示例入站 ping 规则

要添加 ACL 规则,下面是在缺省入站规则之前添加 ping 入站规则的示例命令:

语法:

ibmcloud is network-acl-rule-add ACL ACTION DIRECTION PROTOCOL SOURCE DESTINATION [--name NAME] [--icmp-type ICMP_TYPE] [--icmp-code ICMP_CODE] [--source-port-min PORT_MIN] [--source-port-max PORT_MAX] [--destination-port-min PORT_MIN] [--destination-port-max PORT_MAX] [--before-rule-id RULE_ID] [--output JSON] [-q, --quiet]

示例:

ibmcloud is network-acl-rule-add 72b27b5c-f4b0-48bb-b954-5becc7c1dcb3 allow inbound icmp 10.2.2.2 10.2.2.3 --icmp-type 8 --icmp-code 0