关于网络 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 说明了此场景的情况。
如图1所示,您有两台处理来自互联网请求的Web服务器,以及两台希望对公众隐藏的后端服务器。 在此示例中,您将服务器分配到两个独立的子网中,即 10.10.10.0/24 和 10.10.20.0/24,并且需要允许 Web 服务器与后端服务器交换数据。 此外,您还希望允许后端服务器发送有限量的出站流量。
示例规则
下面的示例规则展示了如何为基本场景配置访问控制列表(ACL)规则。
作为最佳实践,应将细粒度规则的优先级设得高于粗粒度规则。 例如,您有一条阻止来自子网 10.10.30.0/24 的所有流量的规则。 如果为其分配了更高的优先级,那么不会应用任何具有较低优先级的允许来自 10.10.30.5 的流量的细颗粒度规则。
对于 TCP 等双向协议,必须同时定义入站和出站规则。 出站规则允许初始 TCP SYN 连接请求,而相应的入站规则必须接受 TCP SYN ACK 响应。 没有这两种规则,就无法建立沟通。
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 规则示例
| 方向 | 允许/拒绝 | 源 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_acl 和 my_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 的标识,以便在稍后的命令中使用。 你可以使用名为 webacl 和 bkacl 的变量,如下所示:
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 规则的标识保存为变量,以便您可以在以后的命令中使用这些值。 例如,可以将标识保存在变量 inrule 和 outrule 中:
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