IBM Cloud Docs
关于网络 ACL

关于网络 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 协议的更多信息,请参阅 了解互联网通信协议

更新VPC的默认ACL规则

默认 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 示例

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

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

如图 1 所示,您有两个网络服务器负责处理来自互联网的请求,还有两个后端服务器,您希望将它们隐藏起来,不对公众开放。 在本例中,您将服务器放置在两个独立的子网 10.10.10.0/2410.10.20.0/24 中,并需要允许网络服务器与后端服务器交换数据。 此外,您还希望允许来自后端服务器的有限出站流量。

示例规则

下面的示例规则展示了如何为基本方案设置 ACL 规则。

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

ACL-1 示例规则

ACL-1的规则示例
入站/出站 允许/拒绝 源 IP 目标 IP 协议 端口 描述
入站 允许 0.0.0.0/0 0.0.0.0/0 TCP 80 允许来自因特网的 HTTP 流量
入站 允许 0.0.0.0/0 0.0.0.0/0 TCP 443 允许来自因特网的 HTTPS 流量
入站 允许 10.10.20.0/24 0.0.0.0/0 全部 全部 允许所有来自后端服务器所在子网 10.10.20.0/24 的入站流量
入站 拒绝 0.0.0.0/0 0.0.0.0/0 全部 全部 拒绝其他所有入站流量
出站 允许 0.0.0.0/0 0.0.0.0/0 TCP 80 允许 HTTP 流量流至因特网
出站 允许 0.0.0.0/0 0.0.0.0/0 TCP 443 允许流至因特网的 HTTPS 流量
出站 允许 0.0.0.0/0 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 0.0.0.0/0 全部 全部 允许所有来自子网 10.10.10.0/24 的入站流量,网络服务器放置在该子网中
入站 拒绝 0.0.0.0/0 0.0.0.0/0 全部 全部 拒绝其他所有入站流量
出站 允许 0.0.0.0/0 0.0.0.0/0 TCP 80 允许 HTTP 流量流至因特网
出站 允许 0.0.0.0/0 0.0.0.0/0 TCP 443 允许流至因特网的 HTTPS 流量
出站 允许 0.0.0.0/0 10.10.10.0/24 全部 全部 允许所有向子网 10.10.10.0/24 发送的出站流量,网络服务器放置在该子网中
出站 拒绝 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 all 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 all 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 all 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 all 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